Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2014, 23:27   #1
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию TObjectList. Вопрос об изменении параметров.

Здравствуйте. форумчане. Вопрос такой: Почему при создании нового объекта свойство Name запоминается, а свойство Tag нет. То есть:
Код:
// Переопределяем некоторые св-ва TObjectList
type
  QueryList = class(TObjectList)
  private
    function GetItems(Index: Integer): TADOQuery;
    procedure SetItems(Index: Integer; const Value: TADOQuery);
  public
    property Items[Index: Integer]: TADOQuery read GetItems write SetItems; default;
  end;

var   arr_query:QueryList;
       i_query:integer;

implementation
.....
function QueryList.GetItems(Index: Integer): TADOQuery;
begin
  Result := TADOQuery(inherited GetItem(Index));
end;

procedure QueryList.SetItems(Index: Integer; const Value: TADOQuery);
begin
  inherited SetItem(Index, Value);
end;
........

Procedure foo_1(My_socket:TCustomSocket); // Свойство Name запомнится, и потом можно будет найти
// именно этот Query
var Query:TADOQuery;
begin
 Query:=TADOQuery.Create(nil);
  arr_query.Add(Query);
  arr_query[i_query-1].Name:='Q'+IntToStr(My_socket.Handle);
  arr_query[i_query-1].Connection:=ADOConnection1;
end;

Procedure foo_2(My_socket:TCustomSocket);// Свойство Tag не запомнится, и найти
// именно этот Query не удастся
var Query:TADOQuery;
begin
 Query:=TADOQuery.Create(nil);
  arr_query.Add(Query);
  arr_query[i_query-1].Tag:=My_socket.Handle;
  arr_query[i_query-1].Connection:=ADOConnection1;
end;
Из-за чего свойство Tag пропадает? Такое чувство, что спецом для Tag нужно выделять память. Но в таком случае каким образом?
Наставьте на путь истинный ))).
Спасибо за внимание.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 19.04.2014, 00:40   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Нет ни конструктора, ни деструктора класса.
Человек_Борща вне форума Ответить с цитированием
Старый 19.04.2014, 03:33   #3
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Конструктор и деструктор остаются неизменными. Если Вы про инициализацию и очистку памяти, то она есть:
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  arr_query := QueryList.Create(true);
  i_query:=1;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var i:integer;
begin
 for i:=0 to arr_query.Count-1 do arr_query.delete(i);
 arr_query.Free;
end;
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 19.04.2014, 08:18   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

А ищите-то как ? Через TForm.Components[] или TForm.Controls[] ?
phomm вне форума Ответить с цитированием
Старый 19.04.2014, 10:52   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Rin я про класс. без своего конструктора и деструтора, вы ничего своего не создаёте.
Человек_Борща вне форума Ответить с цитированием
Старый 19.04.2014, 12:20   #6
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Цитата:
А ищите-то как ? Через TForm.Components[] или TForm.Controls[] ?
Зачем так сложно)))
Код:
 for i:=0 to arr_query.Count-1 do if arr_query[i].Name='То, что надо!' then 
ShowMessage('Чувак, то что надо! =)');
Цитата:
Rin я про класс. без своего конструктора и деструтора, вы ничего своего не создаёте.
Если Вы хотите сказать, что без своего конструктора и своего деструктора в arr_query не будет ни одного элемента, то Вы ошибаетесь. Проверено. 1 сервер, открываю 3 клиента, подключаюсь. Сервер открыт в режиме трассировки. Если свойство Name юзаю при сождании, то все корректно (то есть каждый элемент query присоединен к определенному пользователю), но если юзаю свойство Tag, то все в трам-тарары идет.

По факту мне просто интересно, почему так? Проблемы то нет, я юзаю свойство Name, но любопытство распирает.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 19.04.2014, 18:14   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

С чего не запоминается? Все свойства TADOQuery 100% должны запоминаться. И ни какой памяти не нужно выделять, TADOQuery сам позабодится
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.04.2014, 18:32   #8
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Цитата:
С чего не запоминается? Все свойства TADOQuery 100% должны запоминаться. И ни какой памяти не нужно выделять, TADOQuery сам позабодится
Я б и сам рад так думать, но увы. Вы сами попробуйте наваять пару: клиент-сервер на TclientSocket TServerSocket и на ServerSocketRead выполнять предложенный код. Все увидите.

Вообще думается ( опять же, лишь подозрение) , что нужно выделять память для чего-то, чтобы и в Tag все запоминалось. Возможно, это как с Image. Если написать просто TImage.Create, то при попытке занести туда ручками картинку мы обломимся. Сначала нужно будует написать TImage.Picture.Bitmap.Create, а лишь потом заносить на bitmap пикчу.
Но для чего нужно выделять память? Вопрос остается открытым.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 20.04.2014, 19:33   #9
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Значит
1. Либо на момент присвоения переменная i_query не соответствует последнему добавленному значению в списке. Очень похоже, что она глобальная и вы её просто неверно используете.
2. Либо My_socket.Handle на момент присвоения в Tag равен нулю.
Других вариантов просто нет
ReportCube вне форума Ответить с цитированием
Старый 21.04.2014, 04:03   #10
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

ReportCube, я бы не задал этот вопрос, если бы не проходил трассировкой по коду. И i_query, и My_socket.Handle верны, и при создании нового элемента arr_query все присваивается замечательно. Но, если пройтись позже циклом от 0 до arr_query.Count -1 , то я наблюдаю замечательную вещь: при присвоении Tag был 60798, а при проверке в цикле любое другое число, но тлолько не 60798. А, и кстати, юзаю Delphi 7. Может в версиях поновее исправили косяк.
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 21.04.2014 в 04:09.
Rin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Qt] Вылет при изменении параметров QTableWidgetItem WarAngel-alk Qt и кроссплатформенное программирование С/С++ 4 31.01.2013 17:58
Вопрос с передачей параметров в С swooppy Помощь студентам 0 09.05.2012 08:47
Копирование данных из ячеек при изменении параметров и переход на следующую строчку. AMRAAM Microsoft Office Excel 6 23.04.2011 21:57
Проблемы с TObjectList lexaltd Общие вопросы Delphi 6 06.04.2009 20:54
Мнимое сообщение окну/компоненту об изменении параметров дисплея Megabotan Win Api 5 08.01.2007 13:54