Event , TNotifyEvent [Résolu]

Nicolas___ 1039 Messages postés jeudi 2 novembre 2000Date d'inscription 24 avril 2013 Dernière intervention - 8 sept. 2008 à 12:49 - Dernière réponse : Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention
- 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
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 8 sept. 2008 à 21:06
2
Merci
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.






Merci f0xi 2

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de f0xi
Meilleure réponse
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 8 sept. 2008 à 23:41
2
Merci
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;

Merci Guillemouze 2

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de Guillemouze
Nicolas___ 1039 Messages postés jeudi 2 novembre 2000Date d'inscription 24 avril 2013 Dernière intervention - 8 sept. 2008 à 14:39
0
Merci
Je tiens à preciser que j'utilise ca dans un application Console (je ne sais pas si ca à son importance ou non )
Commenter la réponse de Nicolas___
Nicolas___ 1039 Messages postés jeudi 2 novembre 2000Date d'inscription 24 avril 2013 Dernière intervention - 8 sept. 2008 à 14:49
0
Merci
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 ???
Commenter la réponse de Nicolas___
Nicolas___ 1039 Messages postés jeudi 2 novembre 2000Date d'inscription 24 avril 2013 Dernière intervention - 8 sept. 2008 à 22:40
0
Merci
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
Commenter la réponse de Nicolas___
Nicolas___ 1039 Messages postés jeudi 2 novembre 2000Date d'inscription 24 avril 2013 Dernière intervention - 9 sept. 2008 à 13:35
0
Merci
@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
Commenter la réponse de Nicolas___
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 9 sept. 2008 à 18:38
0
Merci
@Guillemouze :

Oui on peu faire cela, mais un type procedure et non compatible avec un type methode d'objet.

un type procedure est un pointeur, alors qu'une methode d'objet est une paire de pointeur, dont l'un contient l'adresse de la methode et l'autre contient l'adresse de l'objet qui la possede.

on peu effectivement utiliser des types procedure simple, comme on le faisait en TurboPascal mais seulement dans des cas precis, surtout qu'en plus en faisant cela, on fait l'impasse sur l'utilisation des classes.

Borland / CodeGear conseil dans l'aide la methode fournie par DelphiProg et la mienne (elle sont identique en fait).

"Pour utiliser les evenements de classe en mode console, consultez DelphiProg ou f0xi sur www.delphifr.com"

Commenter la réponse de f0xi
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 10 sept. 2008 à 09:11
0
Merci
mais ca depend de l'utilisation que tu as a en faire.
Par exemple, TList.Sort utilise un pointeur sur une procedure normale.
Commenter la réponse de Guillemouze
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 8 sept. 2008 à 23:53
-2
Merci
Salut,

une recherche t'aurait permis de touver ceci

 
@+
Cirec

<hr siz="" />
Commenter la réponse de Cirec

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.