Страница 1 из 1
Delphi. Как присвоить обработчик события в runtime?
Добавлено: Вт окт 02, 2007 10:18
Моторокер
Создаю компонент в runtime. Формы не используются.
У компонента есть событие onProgress.
Как на него навесить мою процедуру, чтобы на onProgress вызывалась она?
Вообще туплю. Если есть форма, то всё получается. Тут же формы нет. Уже и не знаю, какие ключевые слова для поиска задать, что и как искать.
Чтение текстов про процедурные типы, события не помогает.
Добавлено: Вт окт 02, 2007 11:35
Dec
Код: Выделить всё
procedure _OnTimer_(Sender: TObject);
begin
MessageBeep(0);
end;
var M: TMethod;
begin
with TTimer.Create(Self) do begin
M.Code := @_OnTimer_;
OnTimer := TNotifyEvent(M);
end;
end;
Добавлено: Вт окт 02, 2007 15:20
Моторокер
Поторопился с благодарностями.
Код примера работает, но когда переношу на компонент, переменная
per (кол-во обработанных процентов) выдаёт непонятную константу
Код: Выделить всё
procedure IOProgress(Sender: TObject; per: integer);
begin
//
end;
Код: Выделить всё
img:= TImageEnIO.Create(nil);
M.Code:= @IOProgress;
M.Data:= img;
img.OnProgress:= TIEProgressEvent(M);
Если стандартно положить компонент на форму, обработчик выполняет всё как надо, проценты показываются.
Если вот так же создавать динамически, то никак.
Добавлено: Ср окт 03, 2007 14:01
Dec
Ну можно еще и так:
Код: Выделить всё
type
TIEProgressEvent2 = procedure(Sender: TObject; Per: integer);
TProgressProvider = class
public
constructor Create(AEvent: TIEProgressEvent2);
procedure IOProgress(Sender: TObject; Per: integer);
private
FEvent: TIEProgressEvent2;
end;
constructor TProgressProvider.Create(AEvent: TIEProgressEvent2);
begin
inherited Create;
FEvent := AEvent
end;
procedure TProgressProvider.IOProgress(Sender: TObject; Per: integer);
begin
if Assigned(FEvent) then FEvent(Sender, Per);
end;
procedure IOProgress(Sender: TObject; per: integer);
begin
end;
Код: Выделить всё
Img := TImageEnIO.Create(nil);
Provider := TProgressProvider.Create(IOProgress);
Img.OnProgress:= Provider.IOProgress;
Писал на вскидку, поэтому возможны ошибки, но мысль, я надеюсь, понятна.
Добавлено: Пт окт 05, 2007 00:11
SCHMaster
... в этом случае (код от
Deca) обработка события не привязываетс к объекту (форме), т.е. для юзания в прогах без форм именно то, че нужно.
А стандартные делфевые VCL методы обработки события предусматривают привязку к объекту.
В кач. примера - тот же код от
Deca, но с "привязкой".
Добавлю...
Код: Выделить всё
type
TIEProgressEvent2 = procedure(Sender: TObject; Per: integer) of object; <--- Вот ОНО
TProgressProvider = class
public
constructor Create(AEvent: TIEProgressEvent2);
procedure IOProgress(Sender: TObject; Per: integer);
private
FEvent: TIEProgressEvent2;
end;
constructor TProgressProvider.Create(AEvent: TIEProgressEvent2);
begin
inherited Create;
FEvent := AEvent
end;
procedure TProgressProvider.IOProgress(Sender: TObject; Per: integer);
begin
if Assigned(FEvent) then FEvent(Sender, Per);
end;
Вот ОНО
|
procedure TMyParentObject.IOProgress(Sender: TObject; per: integer);
begin
end;
Если непонял, мыль код - разберемся - schmСОБАКАukr.net
Добавлено: Пн окт 08, 2007 10:21
Моторокер
Спасибо, теперь точно всё работает.
Плохо с теорией, а разделы про создание своих компонентов всегда пропускал – думал, не понадобится.