Текущий архив: 2003.05.12;
Скачать: CL | DM;
Вниз
Помогите, при создании компонента... Найти похожие ветки
← →
UserMicc (2003-04-28 15:05) [0]Помогите, при создании компонента как не затирая самого события формы-владельца (~ TForm(Owner).OnCreate:=..) добавить свою обработку владельца при создании компонента !?...
← →
Zelius (2003-04-28 15:36) [1]Лучше тебе что-нить другое придумать, этот путь очень скользкий.
← →
evvcom (2003-04-28 15:46) [2]
var OwnerOnCreate: TNotifyEveny;
begin
OwnerOnCreate := TForm(Owner).OnCreate;
TForm(Owner).OnCreate := MyOnCreateForm;
end;
procedure TMyComponent.MyOnCreateForm(Sender: TObject);
begin
DoSomething;
if Assigned(OwnerOnCreate) then
OwnerOnCreate(Sender);
end;
← →
circul (2003-04-28 15:46) [3]Нормальный это путь.
type TMyComponent = class(TComponent)
private
fSaveCloseForm: TCloseEvent;
protected
procedure OnCloseForm(Sender: TObject; var Action: TCloseAction);
...
end;
procedure TMyComponent.OnCloseForm(Sender: TObject; var Action: TCloseAction);
begin
...
if Assigned(fSaveCloseForm) then fSaveCloseForm(Sender,Action);
end;
...
constructor TIni.Create(aOwner: TComponent);
begin
inherited Create(aOwner);
...
fSaveCloseForm := nil;
if Assigned(fOwnerForm.OnClose) then fSaveCloseForm := fOwnerForm.OnClose;
fOwnerForm.OnClose := OnCloseForm;
end;
← →
Mike_Goblin (2003-04-28 15:50) [4]Вопрос сформулирован не очень четко, исходя из того, что как я его понял нужно
переопределить конструктор компонента.
constructor Create(AOwner:TComponent)
begin
inherited Create(AOwner);
... - далее добавить здесь свой код обработки
end;
Возможно еще пригодится перекрытие метода Loaded.
← →
evvcom (2003-04-28 15:50) [5]И все же Zelius © (28.04.03 15:36) прав - это скользкий путь. Во время выполнения юзер-программер может изменить OnCreate для формы, не подозревая, что тут уже "не все чисто". И обработчик дочернего компонента перестанет работать.
← →
circul (2003-04-28 15:56) [6]>evvcom © (28.04.03 15:50)
В выше приведенном коде достаточно заменить
if Assigned(fSaveCloseForm) then fSaveCloseForm(Sender,Action);
на
if Assigned(fSaveShowForm) then fOwnerform.OnClose(Sender,Action);
← →
Mike_Goblin (2003-04-28 16:09) [7]Не трогайте обработчики событий, назначаемые пользователем компонента , для выполнения каких-либо действий при возникновении события есть методы диспетчеризации.
Небольшой пример:
Нужно добавить некую дополнительную обработку клика мыши в компоненте - наследнике TControl.
варианты решения
1. Подменять указатель на OnClick (а все события являются указателями на методы). Очень плохой способ, т.к
а) обработчика может не быть вовсе
б) надо возиться с сохранением старого обработчика, подменой новым итд.
2. Правильный способ. Переопределить метод Click, отвечающий за вызов обработчика,добавив новое поведение в него
procedure Click;override;
....
← →
Юрий Зотов (2003-04-28 16:11) [8]> circul © (28.04.03 15:46)
Кладу на форму два Ваших компонента. Затем первый из них удаляю.
И все. Приплыл Ваш компонент. А ведь не было сделано ничего особенного.
> UserMicc © (28.04.03 15:05)
Пишите нужный код в конструкторе или в Loaded (смотря на каком этапе он должен отрабатывать). Вот и все.
← →
evvcom (2003-04-28 16:15) [9]> circul © (28.04.03 15:56)
Речь была об OnCreate, а не об OnClose, но неважно. Дело в том, что юзер-программер в run-time может поменять, уже после отработки constructor TIni.Create(aOwner: TComponent); событие fOwnerForm.OnClose := OnUser_ProgrammerCloseForm; и тогда твой OnCloseForm никогда не вызовется!
← →
Юрий Зотов (2003-04-28 17:00) [10]> evvcom © (28.04.03 16:15)
> юзер-программер в run-time может поменять...
Не только в run-time. Ему и в design-time ничто не мешает сделать то же самое. И залитая из DFM ссылка на юзерский обработчик тоже перекроет обработчик в копоненте.
← →
circul (2003-04-28 17:03) [11]>UserMicc © (28.04.03 15:05)
Сорри, не обратил на то, что нужно создание владельца OnCreate перехватить.
А разве твой компонент будет создаваться до того, как будет создан владелец?
Мне кажется, что в этом случае тебе нужна обработка при создании TApplication.
>Юрий Зотов © (28.04.03 16:11)
Согласен.
Тогда возникает вопрос, необходимо ли для обработки событий владельца использовать Application.HookMainWindow?
← →
UserMicc (2003-04-28 17:33) [12]
Думаю, в этом всем мало что путного... но поверим...
Страницы: 1 вся ветка
Текущий архив: 2003.05.12;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.006 c