Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

После конструктора


TUser ©   (2004-09-08 11:29:00) 

Пишу компонент. Надо вызвать событие типа OnCreate. Т.е. сразу после того, как объект создан, но еще до того, как он становится видимым. Проблема в том, что насколько я понимаю, назначаемые в ObjInspector'е св-ва присваиваются объекту после того, как отработал конструктор. Поэтому в конструкторе вот такой код
inherited;
if assigned(FOnMyEvent) then
  FOnMyEvent(Self);
не срабатывает - assigned возвращает false.
Аналогичная ситуация, если написать все это в AfterConstruction.
Смущает то, что в исходниках VCL именно так и пишут, как у меня не работает. Например, у TCustomForm это реализовано так
constructor TCustomForm.Create(AOwner: TComponent);
begin
 GlobalNameSpace.BeginWrite;
 try
   CreateNew(AOwner);
   if (ClassType <> TForm) and not (csDesigning in ComponentState) then
   begin
     Include(FFormState, fsCreating);
     try
       if not InitInheritedComponent(Self, TForm) then
         raise EResNotFound.CreateFmt(SResNotFound, [ClassName]);
     finally
       Exclude(FFormState, fsCreating);
     end;
     if OldCreateOrder then DoCreate;
   end;
 finally
   GlobalNameSpace.EndWrite;
 end;
end;

procedure TCustomForm.AfterConstruction;
begin
 if not OldCreateOrder then DoCreate;
 if fsActivated in FFormState then
 begin
   Activate;
   Exclude(FFormState, fsActivated);
 end;
end;

procedure TCustomForm.DoCreate;
begin
 if Assigned(FOnCreate) then
 try
   FOnCreate(Self);
...

Почему у Борланда такой код работает, а у меня точно такой же код не работает? Повторяю - и в конструкторе, и в AfterConstruction FOnMyEvent еще не назначен, assigned возвращает false.


Reindeer Moss Eater   (2004-09-08 12:36:00) [1]

Дописывать конструктор в любом случае - бесполезное занятие.
Недоступны в нем значения паблишед свойств отличные от значений по умолчанию.


Fay   (2004-09-08 12:32:00) [2]

2 [12] TUser ©   (08.09.04 12:12)
Мне кажется, Вы недостаточно хорошо описали задачу. Скажите, что нужно сделать. Без кода - просто на слова не скупитесь.


TUser   (2004-09-08 12:12:00) [3]

Там та же трабла. См. выше.


Fay   (2004-09-08 12:11:00) [4]

2 TUser ©   (08.09.04 11:29)
Вместо AfterConstruction дописывай конструктор. И будет тебе Щастье.


TUser   (2004-09-08 12:08:00) [5]

Попробую. Но еще хотелось бы не просто написать работоспособный код, а еще и понять, почему писАть надо именно так, а не иначе. Пока я этого не понял - у Борланда работает, а у меня почему-то нет.


Reindeer Moss Eater   (2004-09-08 12:07:00) [6]

Так почему тогда не использовать переопределенный Loaded метод?


TUser   (2004-09-08 12:06:00) [7]

if assigned(FOnMyEvent) возвращает false. Соотвественно и событие не срабатывает, хотя оно назначено, и если случается его вызов когда-нибудь потом, во время работы с компонентом - то все Ок.


Reindeer Moss Eater   (2004-09-08 12:04:00) [8]

Что именно не работает?
Вызов afterconstruction или проверка fOnMyEvent на nil?


TUser   (2004-09-08 11:57:00) [9]

Нет, смотрите я привел кусок VCL'а. Он может быть вызван либо в конструкторе, либо в AfterConstruction в зависимости от установки флага OldCreateOrder. А у меня ни то, ни другое не работает.


Reindeer Moss Eater   (2004-09-08 11:50:00) [10]

Точно так же.
Но во время конструктора, а уже после него.


TUser   (2004-09-08 11:49:00) [11]

Это я понимаю. Я не понимаю, как тогда вызывается OnCreate у TForm. Он published, а вызывается в AfterConstruction, а то и вообще в конструкторе? По идее, ему еще не присвоено никакого значения, когда выполняются эти методы.


Reindeer Moss Eater   (2004-09-08 11:39:00) [12]

Ты не понял.
Событие, которое ты присвоил паблишед свойству будет реально присвоено полю fOnMyEvent после вызова конструктора.
Во время чтения свойств из ресурсов dfm.

Во время вызова метода Loaded это свойство уже будет иметь значение такое же как и в Design Time.


TUser   (2004-09-08 11:36:00) [13]

Так, OnCreate у формы - тоже паблишт. Точнее, у TCustomForm он protected, но мы-то создаем наследников от TForm. Правильно ли я вас понял, что если у предкового класса св-во было protected, то значение ему присваивается до окончания работы конструктора, даже если в потомке св-во стало published?
На самом деле не очень это понятно - если св-во объявлено в секции published, то как может повлиять на его поведение то, каким оно было у предка?


Reindeer Moss Eater   (2004-09-08 11:31:00) [14]

Повторяю - и в конструкторе, и в AfterConstruction FOnMyEvent еще не назначен, assigned возвращает false.

Потому что это паблишед свойство.
И присвоение ему будет позднее.
Перед вызовом Loaded.


Наверх

Титульная страница Поиск, карта сайта Написать письмо