IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

if Event = Procedure then


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2002
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 28
    Points : 19
    Points
    19
    Par défaut if Event = Procedure then
    Bonjour à toutes et à tous.
    Delphi 2007
    Vista

    J'ai un souci de comparaison...

    J'ai un événement TNotifyEvent dans un objet commun à toute l'application, chaque activation / désactivation d'une fenêtre vient mettre à jour cet événement !

    En gros, dans le message WM_ACTIVATE je fais cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonObjet.EventPartage := ProcLocaleDeFenetre;
    Je passe d'une fenêtre à l'autre, cet événement est détourné dans la nouvelle fenêtre...

    A un moment donné sur une fenêtre, j'aimerai savoir si l'événement de l'objet commun est bien branché dans la cette fenêtre !

    En gros, un bout de code qui ressemble à cela !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if MonObjet.EventPartage = ProcLocaleDeFenetre then
    Mais quelque chose qui compile !
    Qui peut me donner le bout de code secret ?
    D'avance je vous remercie !

  2. #2
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Je propose ceci:
    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ShowMessage('Test');
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      if (@Button1.OnClick = MethodAddress('Button1Click')) then
        ShowMessage('ok')
      else
        ShowMessage('pas ok');
    end;
     
    end.
    Il y a peut-être plus propre...
    "Si vous voulez être l’esclave des banques et payer pour financer votre propre esclavage, alors laissez les banquiers créer la monnaie" - Josiah Stamp, 1920, Gouverneur de la Banque d’Angleterre
    "Qui ne peut acheter ruine qui voudrait vendre" - Jacques Duboin.
    "Nous n'héritons pas la terre de nos parents, nous l'empruntons à nos enfants." - Antoine de Saint Exupéry

  3. #3
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Tu peux aussi ne tester que l'affectation comme ceci :
    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      if Assigned(Button1.OnClick) then
        ShowMessage('ok')
      else
        ShowMessage('pas ok');
    "Si vous voulez être l’esclave des banques et payer pour financer votre propre esclavage, alors laissez les banquiers créer la monnaie" - Josiah Stamp, 1920, Gouverneur de la Banque d’Angleterre
    "Qui ne peut acheter ruine qui voudrait vendre" - Jacques Duboin.
    "Nous n'héritons pas la terre de nos parents, nous l'empruntons à nos enfants." - Antoine de Saint Exupéry

  4. #4
    Membre à l'essai
    Inscrit en
    Avril 2002
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    Salut, et merci !
    J'ai essayé mais cela ne marche pas !

    Voici un petit exemple pour illustrer mon cas !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    unit Unit3;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TMyObject = class
        FMyEvent : TNotifyEvent;
      public
        property MyEvent : TNotifyEvent read FMyEvent write FMyEvent;
      end;
     
      TMyForm = class(TForm)
        PlugEvent: TButton;
        TestEvent: TButton;
        ExecEvent: TButton;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure PlugEventClick(Sender: TObject);
        procedure TestEventClick(Sender: TObject);
        procedure ExecEventClick(Sender: TObject);
      private
        { Private declarations }
        FMyObject : TMyObject;
        procedure MyLocalEvent(Sender: TObject);
      public
        { Public declarations }
      end;
     
    var
      MyForm: TMyForm;
     
    implementation
     
    {$R *.dfm}
     
    procedure TMyForm.ExecEventClick(Sender: TObject);
    begin
      if Assigned(FMyObject.MyEvent) then
        FMyObject.MyEvent(Self);
    end;
     
    procedure TMyForm.FormCreate(Sender: TObject);
    begin
      FMyObject := TMyObject.Create;
    end;
     
    procedure TMyForm.FormDestroy(Sender: TObject);
    begin
      FreeAndNil(FMyObject);
    end;
     
    procedure TMyForm.MyLocalEvent(Sender: TObject);
    begin
      ShowMessage('MyLocalEvent is good !')
    end;
     
    procedure TMyForm.PlugEventClick(Sender: TObject);
    begin
      FMyObject.MyEvent := MyLocalEvent;
    end;
     
    procedure TMyForm.TestEventClick(Sender: TObject);
    var P1, p2 : Pointer;
    begin
      if @FMyObject.MyEvent = MethodAddress('MyLocalEvent') then
        ShowMessage('Ok')
      else
      begin
        P1 := @FMyObject.MyEvent;
        P2 := MethodAddress('MyLocalEvent');
        if (P1 = P2) and (P1 <> P2) then
          ShowMessage('Pour ne pas avoir le message "E2171 Variable ''P1'' inaccessible here due to optimization" lors de l''évaluation de P1');
        ShowMessage('NOk');
      end;
    end;
     
    end.
    Lorsque j'évalue P1, il contient bien une valeur "$45BF8C" mais P2 vaut nil !

    La solution suivante ne me convient pas !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Assigned(FMyObject.MyEvent)
    En règle générale l'événement est toujours branché à une fenêtre ou à une autre !

    Autres idées ?

  5. #5
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Citation Envoyé par Yvan_F1 Voir le message
    Lorsque j'évalue P1, il contient bien une valeur "$45BF8C" mais P2 vaut nil !
    MethodAddress te renverra un résultat uniquement si ta méthode est publiée.
    Bascule MyLocalEvent en Published pour voir !

    @+ Claudius

  6. #6
    Membre confirmé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Points : 546
    Points
    546
    Par défaut
    Bonjour,

    un petit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if @FMyObject.MyEvent = @TMyForm.MyLocalEvent then
    ou (équivalent)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if TMethod(FMyObject.MyEvent).Code = @TMyForm.MyLocalEvent then
    passe chez moi (sous Turbo Delphi 2006) .

    Note pour vérifier aussi l'objet contenu dans FMyObject.MyEvent (pas forcément nécessaire dans cet exemple), il faudrait faire ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if TMethod(FMyObject.MyEvent).Data = Self then

  7. #7
    Membre à l'essai
    Inscrit en
    Avril 2002
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    J'ai mis l'event un published...
    Ca marche...

    Un grand merci à tous !


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Qu'est-ce que le event dans "if(CLK event and CLK=1)then"
    Par crispix.prog dans le forum VHDL
    Réponses: 1
    Dernier message: 14/01/2013, 21h50
  2. [AC-2007] Ajout multiple Event Procedure
    Par robyseb dans le forum VBA Access
    Réponses: 16
    Dernier message: 15/08/2012, 21h03
  3. Prob appel procedure dans if then else
    Par Oxygn44 dans le forum Langage
    Réponses: 6
    Dernier message: 12/11/2008, 16h21
  4. Réponses: 0
    Dernier message: 26/03/2008, 04h57
  5. Réponses: 10
    Dernier message: 18/02/2008, 09h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo