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

Delphi .NET Discussion :

Comment créer un événement?


Sujet :

Delphi .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Par défaut Comment créer un événement?
    Bonjour...

    Voila je suis dans un projet VCL en delphi .net et dans ce projet j'utilise une classe de type TForm qui me renvoie à un moment, via une variable de type boolean, la valeur true (correspond à un appui sur un bouton de ma classe Tform). Je souhaite en faite que cette appui sur ce bouton poussoir (de ma classe TForm) donc le passage de ma variable à true corresponde un evenement dans mon projet principal (->qui appelle ma classe TForm)...

    Est-ce possible et si oui comment dois-je m'y prendre?

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Par défaut
    Je ne comprend pas bien le contexte à nouveau.
    Tu as cette situation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Form1: TForm1;
      -----
    monboolean: boolean;
      -----
    procedure TForm1.Button1Click(Sender : Tobject);
    begin
      monboolean := true;
    end;
    Je souhaite en faite que cette appui sur ce bouton poussoir (de ma classe TForm) donc le passage de ma variable à true corresponde un evenement dans mon projet principal (->qui appelle ma classe TForm)...
    Si cette unité est réferencée dans la clause uses d'une autre unité alors tu peux faire appel aux évenements de la form1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    form1.Button1Click(nil);

  3. #3
    Membre éclairé Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Par défaut
    Slt à toi Fabrice...
    Merci encore de t'interesser à ce problème .

    Tu l'as très bien cerné mais je ne veux pas faire appel à l'évenement boutton1Click de la form1 car en fait je travail sur un projet qui risque d'évoluer et si je fonction avec des classes TForm c'est pour facilité les évolution. En effet en supposant que le classe Form1 ne convienne plus on la remplacera par une autre et il se peux que l'évenement button1Click ne corresponde plus.

    ....... je sais pas si je me suis bien expliqué la .

  4. #4
    Membre éclairé Avatar de Jayceblaster
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    420
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 420
    Par défaut
    Si cette unité est réferencée dans la clause uses d'une autre unité alors tu peux faire appel aux évenements de la form1.

    Code :
    form1.Button1Click(nil);
    C'est vrai je peux faire appel à un évenement de ma classe Form1 mais je ne suis pas en mesure dans mon programme de détecter qu'un évenement de ma classe Form1 à était déclenché (en loccurence ici Button1Click).

    En quelque sorte je veux que l'évenement Boutton1Clic de ma classe déclenche un événement dans le programme qui appel ma classe.

    En fait, toi qui a suivi un peu le problème, j'ai mon programme principal dans lequel j'ai une form avec un system de menu et je dois attendre que l'utilisateur ce soit logué pour valider les menu de ma form (tout les utilisateur n'ont pas les memes possibilité). Mais pour validé ou dévalidé mes menus il faut que ma classe Login (qui est une TForm) soit capable de déclanché un événement dans mon programme de menu lorsque la personne s'est correctement logué...

    Alors la je crois que je peux pas faire mieux en explication .


  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Par défaut
    Les explications sont limpides. Alors, place au code!

    La fiche principale qui possède le TMainMenu:
    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
    unit Utest;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;
    
    const
       WM_ROLE_CONNECTION = WM_APP + 100;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Label1: TLabel;
        procedure FormCreate(Sender: TObject);
      private
      protected
        procedure WM_GET_ROLE_CONNECTION(var Message: TMessage); message WM_ROLE_CONNECTION;
      public
        { Déclarations publiques }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    uses Ulogin;
    
    {$R *.DFM}
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Login := TLogin.Create(self);
      Login.Showmodal;
    end;
    
     procedure TForm1.WM_GET_ROLE_CONNECTION(var Message: TMessage);
    begin
      { ShowMessage(IntToStr(Message.LParam)); }
     case  Message.LParam of
       $1:
         begin
           Affiche un MenuItem de MainMenu
         end;    
       $2:
         begin
           Affiche un MenuItem de MainMenu
         end; 
       $4: 
          begin
            Affiche un  autre Menuitem de MainMenu ( MenuItem.Visible := true)
            Label1.Caption := IntToStr(Message.LParam);  
          end;
       else
          begin
          end;
     end;
    
    end;
    
    end.
    La form de connexion:
    Elle envoie un message à la TForm Principale avec le paramètre $4.
    Imaginons plusieures rôles:
    - $1 Rôle sans pouvoir
    - $2 Rôle Administrateur
    - $4 Rôle Accès restreint (genre consultation des tables, pas de modifications).

    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
    unit Ulogin;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;
    
    type
      TLogin = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
      public
        { Déclarations publiques }
      end;
    
    var
     Login: TLogin;
    
    implementation
    
     uses Utest;
    
    {$R *.DFM}
    
    procedure TLogin.Button1Click(Sender: TObject);
    begin
     SendMessage(Form1.Handle, WM_ROLE_CONNECTION,0,$4);
     Close;
    end;
    
    end.
    ps: J'étais à deux doigts d'implémenter la design pattern Observer, mais finalement ce n'est pas indispensable dans le cas présent.

  6. #6
    Membre éclairé
    Inscrit en
    Mars 2003
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mars 2003
    Messages : 281
    Par défaut
    Une autre solution, si tu veux te passer des messages windows.

    dans ta classe TForm de la fenêtre appelée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    type MaFenetreAppelee = class(Tform);
      ...
    private
       procedure DoNotification;
    public
      OnNotification : TnotifyEvent;
    end;
    
      
    procedure Tmyclass.DoNotification;
    begin
     if assigned(onModification) then
      onModification(self);
    end;
    Pour déclencher l'évenement, il suffit de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    begin
    DoNotification;
    end;
    dans la form appelante :

    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
    type ... 
    
      private
         Procedure MonDeclencheur(sender : Tobject);
    end;
    
    
    
    Procedure MonDeclencheur(sender : Tobject);
    begin
      //traitement de l'événement
    end;
    
    // on affecte la procédure de la form appelante à la form appelée
    MaForm2.OnNotification := MonDeclencheur;
    MaForm2.showmodal;
    tu peux personnaliser les paramètres de l'événement en remplacant TnotifyEvent par ton propre type :

    de tête :
    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
    Type
       Tjeton = record
           idUser : string;
           UserName : string;
          etc...
       end;    
     
       TnotifyLogin= procedure (MonJeton : Tjeton);
       MaFenetreAppelee = class(Tform);
       private
          OnNotification : TnotifyLogin;
       ...
    end;
     
    procedure Tmyclass.DoNotification(UnJeton : Tjeton);
    begin
     if assigned(onModification) then
      onModification(UnJeton);
    end;
    et dans la fenêtre appelante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Procedure MonDeclencheur(UnJeton : Tjeton);
    begin
      //traitement de l'événement
      shwomessage('Bienvenue ' + unJeton.Username);
    end;

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/12/2010, 08h34
  2. Comment créer un événement et un bouton dynamique
    Par mechatikhaled dans le forum Composants VCL
    Réponses: 1
    Dernier message: 13/04/2008, 18h43
  3. Comment créer un appuie de touche enter sans gestionnaire événement ?
    Par Telemak dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 03/09/2007, 20h23
  4. Comment créer une classe "source d'évènements" ?
    Par gobgob dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 06/07/2007, 21h15
  5. comment créer un événement ValueChange
    Par majic dans le forum Access
    Réponses: 2
    Dernier message: 28/01/2007, 17h52

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