Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Event , TNotifyEvent [ Divers / Débutant(e) ] (Nicolas___)

lundi 8 septembre 2008 à 12:49:43 | Event , TNotifyEvent

Nicolas___

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




lundi 8 septembre 2008 à 14:39:33 | Re : Event , TNotifyEvent

Nicolas___

Je tiens à preciser que j'utilise ca dans un application Console (je ne sais pas si ca à son importance ou non )

lundi 8 septembre 2008 à 14:49:10 | Re : Event , TNotifyEvent

Nicolas___

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 ???

lundi 8 septembre 2008 à 21:06:53 | Re : Event , TNotifyEvent

f0xi

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !


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.






lundi 8 septembre 2008 à 22:40:05 | Re : Event , TNotifyEvent

Nicolas___

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

lundi 8 septembre 2008 à 23:41:45 | Re : Event , TNotifyEvent

Guillemouze

Réponse acceptée !
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;


lundi 8 septembre 2008 à 23:53:56 | Re : Event , TNotifyEvent

cirec

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
Salut,

une recherche t'aurait permis de touver ceci

 
@+
Cirec


mardi 9 septembre 2008 à 13:35:07 | Re : Event , TNotifyEvent

Nicolas___

@cirec : autant pour moi , j'ai chercher dans google mais pas sur DelphiFr ...

@Guillemouze : ok , je ne savais pas que c'etait possible

@ tous : merci

mardi 9 septembre 2008 à 18:38:25 | Re : Event , TNotifyEvent

f0xi

Membre Club Administrateur CodeS-SourceS

@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"






mercredi 10 septembre 2008 à 09:11:35 | Re : Event , TNotifyEvent

Guillemouze

mais ca depend de l'utilisation que tu as a en faire.
Par exemple, TList.Sort utilise un pointeur sur une procedure normale.



Cette discussion est classé dans : begin, event, tmyclass, tnotifyevent, fmyevent


Répondre à ce message

Sujets en rapport avec ce message

Conversion Dxx vers D6 [ par basile9 ] Bonjour Je me lance avec Delphi Personal 6 dans une application mode console. J'essaie de compiler le programme exemple suivant (trouvé sur un site an Pb Dessin sur Image [ par Jean_Jean ] Bonsoir, J'ai l'impression que je ne place pas le code où il faut. L'évènement o Pb de case à cocher avec un TCheckListBox [ par FredY68 ] Bonjour à tous J'ai un problème de reconnaissance de case cochée ou non cochée dans un checklistbox.les informations du checklistbox sont stockées dan Problème de récursivité? [ par basile9 ] Bonjour J'ai adapté une procédure récursive, qui marchait très bien en TP7, pour Delphi 6, dans un programme console. Voiçi cette procedure, à base probleme affectation de données vers une form mdi [ par demande001 ] Bonjour;je suis nouveau sur les applications Mdi                 j'ai une form mdi child qui fait appele a une autre forme mdi child elle devient donc Cacher ScrollBar de MainMDI [ par Loda ] salut tout le monde, j'ai une question assez pointue... Dans mon applic MDI, j'aimerais cacher les scroll bar (bar de défilement) lorsque qu'une fen Probleme tableau word sous delphi [ par dederfred ] Bonjour , quand je crée mon tableau au lieu d'avoir cela : j'ai cela  le code : <p Hook clavier [ par T103 ] Bonsoir a tous, voila j'essaye de comprendre le fonctionnement des hooks, jai trouver plusieurs source sur le net pour apprendre a recupérer les touch Redimensionner un timage/tshape avec des poignées [ par edge76000 ] Bonjour, Je sais que sur le site Phidels, ce programme le traite et doit pouvoir répondre à ma question car c'est exactement ce que je veux faire au n passage du nom d'objet sur une fonction [ par Dreus ] Hello la foule, j'aimerai simplifier le bout de code ce-dessous par une fonction, je pensais passer en paramètre le nom de l'image exemple "Ouvertur


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,218 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.