Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Delphi. Как присвоить обработчик события в runtime?

 
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Моторокер



Joined: 06 May 2005
Posts: 1517
Location: г. Пермь (читается Перьмь)

Post (Separately) Posted: Tue Oct 02, 2007 10:18    Post subject: Delphi. Как присвоить обработчик события в runtime? Reply with quote

Создаю компонент в runtime. Формы не используются.
У компонента есть событие onProgress.
Как на него навесить мою процедуру, чтобы на onProgress вызывалась она?

Вообще туплю. Если есть форма, то всё получается. Тут же формы нет. Уже и не знаю, какие ключевые слова для поиска задать, что и как искать.
Чтение текстов про процедурные типы, события не помогает.
_________________
плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми
Back to top
View user's profile Send private message
Dec



Joined: 07 Sep 2006
Posts: 466

Post (Separately) Posted: Tue Oct 02, 2007 11:35    Post subject: Reply with quote

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
View user's profile Send private message
Моторокер



Joined: 06 May 2005
Posts: 1517
Location: г. Пермь (читается Перьмь)

Post (Separately) Posted: Tue Oct 02, 2007 15:20    Post subject: Reply with quote

Поторопился с благодарностями.
Код примера работает, но когда переношу на компонент, переменная 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
View user's profile Send private message
Dec



Joined: 07 Sep 2006
Posts: 466

Post (Separately) Posted: Wed Oct 03, 2007 14:01    Post subject: Reply with quote

Ну можно еще и так:
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
View user's profile Send private message
SCHMaster



Joined: 15 Dec 2004
Posts: 296
Location: Киев

Post (Separately) Posted: Fri Oct 05, 2007 00:11    Post subject: Reply with quote

... в этом случае (код от 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
View user's profile Send private message
Моторокер



Joined: 06 May 2005
Posts: 1517
Location: г. Пермь (читается Перьмь)

Post (Separately) Posted: Mon Oct 08, 2007 10:21    Post subject: Reply with quote

Спасибо, теперь точно всё работает.
Плохо с теорией, а разделы про создание своих компонентов всегда пропускал – думал, не понадобится.
_________________
плагины для Total Commander, статьи Graphics Converter; NSCopy; SEO HTML; KillOK; Плагин на Delphi
ПармаСруб - строительство домов и бань в Перми
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Написание плагинов для Total Commander All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group