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

Вниз

Помогите, при создании компонента...   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.009 c
14-34616
swordent
2003-04-22 16:19
2003.05.12
php > ... DELPHI!


14-34578
Ixion
2003-04-23 00:34
2003.05.12
Посоветуйте ЖК монитор


4-34642
ilya53
2003-03-06 15:38
2003.05.12
Доступ к файлу


14-34596
djon007
2003-04-09 20:17
2003.05.12
Загрузить сайт?


14-34575
Dimaz-z
2003-04-23 22:53
2003.05.12
Какая Install яшалка по вашему мнению лучше?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский