Форум: "Основная";
Текущий архив: 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.036 c