View previous topic :: View next topic |
Author |
Message |
Моторокер
Joined: 06 May 2005 Posts: 1517 Location: г. Пермь (читается Перьмь)
|
(Separately) Posted: Tue Oct 02, 2007 10:18 Post subject: Delphi. Как присвоить обработчик события в runtime? |
|
|
Создаю компонент в runtime. Формы не используются.
У компонента есть событие onProgress.
Как на него навесить мою процедуру, чтобы на onProgress вызывалась она?
Вообще туплю. Если есть форма, то всё получается. Тут же формы нет. Уже и не знаю, какие ключевые слова для поиска задать, что и как искать.
Чтение текстов про процедурные типы, события не помогает. _________________ плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми |
|
Back to top |
|
|
Dec
Joined: 07 Sep 2006 Posts: 466
|
(Separately) Posted: Tue Oct 02, 2007 11:35 Post subject: |
|
|
Code: | 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; |
|
|
Back to top |
|
|
Моторокер
Joined: 06 May 2005 Posts: 1517 Location: г. Пермь (читается Перьмь)
|
(Separately) Posted: Tue Oct 02, 2007 15:20 Post subject: |
|
|
Поторопился с благодарностями.
Код примера работает, но когда переношу на компонент, переменная per (кол-во обработанных процентов) выдаёт непонятную константу
Code: | procedure IOProgress(Sender: TObject; per: integer);
begin
//
end; |
Code: | img:= TImageEnIO.Create(nil);
M.Code:= @IOProgress;
M.Data:= img;
img.OnProgress:= TIEProgressEvent(M); |
Если стандартно положить компонент на форму, обработчик выполняет всё как надо, проценты показываются.
Если вот так же создавать динамически, то никак. _________________ плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми |
|
Back to top |
|
|
Dec
Joined: 07 Sep 2006 Posts: 466
|
(Separately) Posted: Wed Oct 03, 2007 14:01 Post subject: |
|
|
Ну можно еще и так:
Code: | 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; |
Code: |
Img := TImageEnIO.Create(nil);
Provider := TProgressProvider.Create(IOProgress);
Img.OnProgress:= Provider.IOProgress;
|
Писал на вскидку, поэтому возможны ошибки, но мысль, я надеюсь, понятна. |
|
Back to top |
|
|
SCHMaster
Joined: 15 Dec 2004 Posts: 296 Location: Киев
|
(Separately) Posted: Fri Oct 05, 2007 00:11 Post subject: |
|
|
... в этом случае (код от Deca) обработка события не привязываетс к объекту (форме), т.е. для юзания в прогах без форм именно то, че нужно.
А стандартные делфевые VCL методы обработки события предусматривают привязку к объекту.
В кач. примера - тот же код от Deca, но с "привязкой".
Добавлю...
Code: | 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 _________________ Хороший юзер - мертвый юзер
Мои работы |
|
Back to top |
|
|
Моторокер
Joined: 06 May 2005 Posts: 1517 Location: г. Пермь (читается Перьмь)
|
(Separately) Posted: Mon Oct 08, 2007 10:21 Post subject: |
|
|
Спасибо, теперь точно всё работает.
Плохо с теорией, а разделы про создание своих компонентов всегда пропускал – думал, не понадобится. _________________ плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми |
|
Back to top |
|
|
|