Как вызвать событие вместе на каждом из двух классов - PullRequest
0 голосов
/ 31 мая 2010

У меня есть два класса объектов на одном устройстве, возможно ли вызвать два события? скажем, событие FIRSTCLASS сработало, SECONDCLASS также сработало?

Предполагая, что ......

//{Class 1}-------------------------------------------------------------
type
   TOnEventTrigger = procedure(Sender : Tobject; Value :integer); 
   TMyFirstClass = Class(Tcomponent)
   private
      ....
   public
      ....
      propert OnEventTrigger : TOnEventTrigger read Fevent write Fevent;
   end;

procedure TMyFirstClass.FEvnt(Sender : Tobject; Value :integer); 
begin
    // here is normaly triggers the event //
    if Assigned(OnEventTrigger) then
       OnEventTrigger(Self,FSomevalue);

    // POSTMessage(GetForegroundWindow,WM_USER+3,0,0);
    // this is what i did here to get the result of FSomevalue
    // but this is not ideal. It work only on focus window.

end;

//{Class 2}-------------------------------------------------------------

type
   TOnEventTrigger = procedure(Sender : Tobject; Value :integer); 
   TMySecondClass = Class(Tobject)
   private
      ....
   public
      ....
      property OnEventTrigger : TOnEventTrigger; read Fevent write Fevent;
   end;

procedure TMySecondClass.FEvnt(Sender : Tobject; Value :integer); 
begin
    // I wanted here to trigger, whenenver the above is fired //
    if Assigned(OnEventTrigger) then
       OnEventTrigger(Self,FSomevalue);
end;

1 Ответ

2 голосов
/ 31 мая 2010

Вы можете назначить один и тот же обработчик событий обоим классам при их создании (псевдокод):

Form1 = class()
private
  { ... }
protected
  A : TMyFirstClass;
  B : TMySecondClass;
  procedure MyHandler(Sender: TObject; Value: Integer);
end;

procedure Form1.CreateForm();
Begin
     { Create A & B }
     A := TMyFirstClass.Create(Self);
     B := TMySecondClass.Create(Self);

     { Assign Event Handler to both classes }
     A.OnEventTrigger := MyHandler;
     B.OnEventTrigger := MyHandler;
End;

procedure Form1.MyHandler(Sender: TObject; Value: Integer);
Begin
     ShowMessage('Event from '+Sender.ClassName+'. Value='+IntToStr(Value));
End;

Таким образом, когда событие запускается из любого класса, оно заканчивается в коде MyHandler ().

...