Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.011 c
14-34551
Yanis
2003-04-22 16:37
2003.05.12
Печать как на


1-34405
Maik
2003-04-30 11:57
2003.05.12
Как при работе с FileWrite записать в файл строку


7-34631
Songoku
2003-03-16 04:40
2003.05.12
Как узнать зажата ли клавиша????


7-34633
AlexPro_
2003-03-14 17:21
2003.05.12
Выключение компа из-под Win2000 Adv Serv


14-34571
default
2003-04-22 15:15
2003.05.12
Численные методы