Страница 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
Моторокер
Спасибо, теперь точно всё работает.
Плохо с теорией, а разделы про создание своих компонентов всегда пропускал – думал, не понадобится.