Event , TNotifyEvent

Résolu
Nicolas___ Messages postés 992 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 24 avril 2013 - 8 sept. 2008 à 12:49
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 - 10 sept. 2008 à 09:11
Bonjour ,

Dans une classe je fais ceci
(constructeur / destructeur et co = ok )

type
  TMyClass = class(TObject)
  private
     fMyEvent : TNotifyEvent;
  public
     procedure ProcedureXY;
     property MyEvent : TNotifyEvent   read fMyEvent write fMyEvent ;
   
end;

implementation

procedure TMyClass.ProcedureXY;
begin
 ...
 if(Assigned(fMyEvent )) then fMyEvent(self);
 ...
end;

quand je crée une occurrence de TMyClass je fais donc

procedure MonEventDansLautreClass
begin
 // trt quelconque de l'event
end;

var
 i : TMyClass;
begin
 i := TMyClass.Create( ... );
i.MyEvent := MonEventDansLautreClass;

mais ça ne compile pas , 
Types incompatibles : 'pointeur de méthode et procédure normale'

Comment k'on fait alors ?
plus sérieusement je ne comprends pas de trop donc si une âme charitable passe par ici , qu'elle m'explique cela calmement
Merci

7 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
8 sept. 2008 à 21:06
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

{ * Event Manager Begin * }
type
  TConsoleEventManager = class(TObject)
  { place you event manager here }

    procedure DoEventA(Sender:TObject);
    procedure DoEventB(Sender:TObject);

  { ----- }
  public
    class function NewInstance: TObject; override;
    procedure FreeInstance; override;
  end;

var
  EventManager : TConsoleEventManager = nil;

class function TConsoleEventManager.NewInstance: TObject;
begin
  if EventManager = Nil then
  begin
    EventManager := TConsoleEventManager(inherited NewInstance);
    Result := EventManager;
  end
  else
  begin
    raise Exception.Create(ClassName + ' : This object is used at singleton.');
  end;
end;

procedure TConsoleEventManager.FreeInstance;
begin
  inherited FreeInstance;
  EventManager := Nil;
end;

  { Coder Events }

procedure TConsoleEventManager.DoEventA(Sender: TObject);
begin
  writeln('Hello World!');
end;

procedure TConsoleEventManager.DoEventB(Sender: TObject);
begin
  writeln('I''m the king of the world!');
end;

{ * Event Manager End * }

type
  TTestEvent = procedure(Sender: TObject) of object;

  TTest = class
  private
    fEvent: TTestEvent;
  public
    procedure RunEvent;
    property Event: TTestEvent read fEvent write fEvent;
  end;

procedure TTest.RunEvent;
begin
  if Assigned(fEvent) then
    fEvent(Self);
end;

var
  TestA, TestB : TTest;

begin
  try
  { code start }

    TestA := TTest.Create;
    TestB := TTest.Create;
    try
      TestA.Event := EventManager.DoEventA;
      TestB.Event := EventManager.DoEventB;
      TestA.RunEvent;
      TestB.RunEvent;
    finally
      TestB.Free;
      TestA.Free;
    end;

    readln;

  { code end }
  finally
    EventManager.Free;
  end;
end.






2
Rejoignez-nous