Delphi. Как присвоить обработчик события в runtime?
Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik
- Моторокер
- Сообщения: 1517
- Зарегистрирован: Пт май 06, 2005 08:22
- Откуда: г. Пермь (читается Перьмь)
- Контактная информация:
Delphi. Как присвоить обработчик события в runtime?
Создаю компонент в runtime. Формы не используются.
У компонента есть событие onProgress.
Как на него навесить мою процедуру, чтобы на onProgress вызывалась она?
Вообще туплю. Если есть форма, то всё получается. Тут же формы нет. Уже и не знаю, какие ключевые слова для поиска задать, что и как искать.
Чтение текстов про процедурные типы, события не помогает.
У компонента есть событие onProgress.
Как на него навесить мою процедуру, чтобы на onProgress вызывалась она?
Вообще туплю. Если есть форма, то всё получается. Тут же формы нет. Уже и не знаю, какие ключевые слова для поиска задать, что и как искать.
Чтение текстов про процедурные типы, события не помогает.
плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми
ПармаСруб - строительство домов и бань в Перми
Код: Выделить всё
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;- Моторокер
- Сообщения: 1517
- Зарегистрирован: Пт май 06, 2005 08:22
- Откуда: г. Пермь (читается Перьмь)
- Контактная информация:
Поторопился с благодарностями.
Код примера работает, но когда переношу на компонент, переменная per (кол-во обработанных процентов) выдаёт непонятную константу
Если стандартно положить компонент на форму, обработчик выполняет всё как надо, проценты показываются.
Если вот так же создавать динамически, то никак.
Код примера работает, но когда переношу на компонент, переменная per (кол-во обработанных процентов) выдаёт непонятную константу
Код: Выделить всё
procedure IOProgress(Sender: TObject; per: integer);
begin
//
end;Код: Выделить всё
img:= TImageEnIO.Create(nil);
M.Code:= @IOProgress;
M.Data:= img;
img.OnProgress:= TIEProgressEvent(M);Если вот так же создавать динамически, то никак.
плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми
ПармаСруб - строительство домов и бань в Перми
Ну можно еще и так:
Писал на вскидку, поэтому возможны ошибки, но мысль, я надеюсь, понятна.
Код: Выделить всё
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;
... в этом случае (код от Deca) обработка события не привязываетс к объекту (форме), т.е. для юзания в прогах без форм именно то, че нужно.
А стандартные делфевые VCL методы обработки события предусматривают привязку к объекту.
В кач. примера - тот же код от Deca, но с "привязкой".
Добавлю...
Если непонял, мыль код - разберемся - schmСОБАКАukr.net
А стандартные делфевые 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;Хороший юзер - мертвый юзер
Мои работы
Мои работы
- Моторокер
- Сообщения: 1517
- Зарегистрирован: Пт май 06, 2005 08:22
- Откуда: г. Пермь (читается Перьмь)
- Контактная информация:
Спасибо, теперь точно всё работает.
Плохо с теорией, а разделы про создание своих компонентов всегда пропускал – думал, не понадобится.
Плохо с теорией, а разделы про создание своих компонентов всегда пропускал – думал, не понадобится.
плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми
ПармаСруб - строительство домов и бань в Перми