Event , TNotifyEvent [Résolu]

Signaler
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
-
Guillemouze
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
-
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
A voir également:

7 réponses

Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
27
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.






Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
Types incompatibles : 'pointeur de méthode et procédure normale'
ca veut dire que les procedures ne sont pas du meme type. en l'occurence, on attend une procedure d'un objet, mais tu lui fournit un procedure globale (ie. pas d'objet).
Dans le cas d'un evenement, cela vient du fait que le type est declaré comme suit :
type
  TNotifyEvent = procedure(Sender:TObject) of object ;
qui signifie que la fonction associée a l'evenement doit appartenir a un objet.

donc rien ne t'empeche de definir ton propre type pour remplacer TNotifyEvent
type
  TNormalNotifyEvent = procedure(Sender: TObject);

  TMyClass = class(TObject)
  private
     fMyEvent : TNormalNotifyEvent ;
  public
     procedure ProcedureXY;
     property MyEvent : TNormalNotifyEvent read fMyEvent write fMyEvent ;
   
end;
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
Je tiens à preciser que j'utilise ca dans un application Console (je ne sais pas si ca à son importance ou non )
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
Au fait je me demande si dans une application console , il y a moyen parce que sinon il suffit de faire

type
TForm1 = class(TForm)
...
public
{ Déclarations publiques }
Procedure MaReponseMenu1( Sender : TObject);
end;
 
...
 
Procedure TForm1.MaReponseMenu1( Sender : TObject);
Begin
//La tu mets ton code
End;

(cfr devellopez)

mais en console , comment faire ???
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
Merci Foxi ,
Je n'ai pas encore testé le code mais ça m'a l'air pas mal

Je regarderai à mon petit problème demain ( et je validerais certainement ta solution )

Nico
Messages postés
992
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
24 avril 2013
2
@cirec : autant pour moi , j'ai chercher dans google mais pas sur DelphiFr ...

@[../auteur/GUILLEMOUZE/184734.aspx Guillemouze] : ok , je ne savais pas que c'etait possible

@ tous : merci
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
mais ca depend de l'utilisation que tu as a en faire.
Par exemple, TList.Sort utilise un pointeur sur une procedure normale.