Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];

Вниз

После конструктора   Найти похожие ветки 

 
TUser ©   (2004-09-08 11:29) [0]

Пишу компонент. Надо вызвать событие типа 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 11:31) [1]

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

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


 
TUser ©   (2004-09-08 11:36) [2]

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


 
Reindeer Moss Eater ©   (2004-09-08 11:39) [3]

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

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


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

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


 
Reindeer Moss Eater ©   (2004-09-08 11:50) [5]

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


 
TUser ©   (2004-09-08 11:57) [6]

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


 
Reindeer Moss Eater ©   (2004-09-08 12:04) [7]

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


 
TUser ©   (2004-09-08 12:06) [8]

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


 
Reindeer Moss Eater ©   (2004-09-08 12:07) [9]

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


 
TUser ©   (2004-09-08 12:08) [10]

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


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

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


 
TUser ©   (2004-09-08 12:12) [12]

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


 
Fay ©   (2004-09-08 12:32) [13]

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


 
Reindeer Moss Eater ©   (2004-09-08 12:36) [14]

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



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.034 c
1-1094816889
Still Swamp
2004-09-10 15:48
2004.09.26
Вызов внешнего редактора HTML


14-1094693656
Думкин
2004-09-09 05:34
2004.09.26
С днем рождения! 9 сентября


1-1094837644
x_michael
2004-09-10 21:34
2004.09.26
У.М.Д. подскажите плз как получить непрямоугольную область


14-1094805509
Holy
2004-09-10 12:38
2004.09.26
По мотивам Ночного дозора...


9-1083469676
Iraizor
2004-05-02 07:47
2004.09.26
DirectX нужна помощь по поводу заголовочных файлов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский