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 :

Transférer le code d'un évènement dans une unité autre que celle de la fiche


Sujet :

Langage Delphi

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 126
    Points : 107
    Points
    107
    Par défaut Transférer le code d'un évènement dans une unité autre que celle de la fiche
    Exemple:

    J'ai une fiche avec beaucoup de composants et leurs évènements associés.
    L'unité de cette fiche finit par prendre une taille énorme.

    J'aimerais par exemple, mettre tous les codes correspondants aux TToolBar dans une autre unité dédiée aux TToolBar. De même pour tous les T...Button.

    Comment dois-je procéder? Merci

  2. #2
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Et bien tu rajoutes une (des) unité(s) (Fichiers/nouveau/Unité), tu déclare cette unité dans les uses de ton unité actuelle et dans cette nouvelle unité tu crées des functions/Procedures que tu lances de ton unité actuelle.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Points : 142
    Points
    142
    Par défaut
    Salut,

    Je pense que tu veux dire : une fiche crée avec l'éditeur de fiches.

    Delphi propose un moyen de modulariser les fiches avec son système de Frales (ou cadres) : tu peux créer un cadre dans une unité -qui contient des boutons, des champs,... des composants, quoi, avec leurs évènements- puis le coller tel quel dans une fiche de ton projet.

    Sinon, la gestion des dfm par Delphi exige que les évènements que tu déclares dans l'éditeur de fiches soient des méthodes publiées de ta fiche.
    Si tu veux délocaliser tes évènements, il va falloir que tu court-circuites un peu l'IDE :
    -tu ne déclares plus les évènements de tes boutons/toolbars/... depuis léditeur de fiches
    -tu rajoute à ta Form un FormCreate, qui affecte avec du code les évènements :
    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
     
    //dans l'unité EventsBoutons :
    type
      TEvtsBoutons = class
        procedure BoutonOkClick( Sender : TObject );
        procedure BoutonCancelClick( Sender : TObject );
        procedure BoutonRougeMouseOver( Sender : TObject; ... ); //signature de OnMouseOver
        ...
     
    //dans l'unité de ta fiche :
    procedure FormCreate( Sender : TObject );
    begin
      BoutonOk.OnClick := TEvstBoutons.BoutonOkClick;
      BoutonCancel.OnClick := TEvtsBoutons.BoutonCancelClick;
      BoutonRouge.OnMouseOver := TEvtsBoutons.BoutonRougeMouseover;
      ...
    end
    Entre les deux maux à maintenir, choisit ton poison...

    Plus sérieusement, je me suis retrouvé dans un cas similaire, j'ai fait l'effort de découper proprement ma Fiche en Frames séparées, et le résultat était plutôt probant.
    Je ne suis pas un grand fan du système de .dfm de Delphi, mais à mon avis le meilleur moyen de l'exploiter est de passer par ce système de Frames.

    Dis-nous si tu as besoin de plus de détails,

  4. #4
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Ou plus simplement un datamodule avec un ActionList. Tu associe à chaque bouton de la toolbar une action. Ca soulageras au moins des evènements OnClick

  5. #5
    Membre régulier

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 126
    Points : 107
    Points
    107
    Par défaut
    Merci beaucoup pour vos suggestions, celle de LeGec me semble interessante et me convenir.

    Je vais étudier cela de près et dès que j'ai abouti , je vous donne de mes nouvelles.

  6. #6
    Membre régulier

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 126
    Points : 107
    Points
    107
    Par défaut
    Je viens de faire un essai avec la 2ème méthode de LeGec et j'ai un petit problème avec le code proposé:


    (ligne *) --> Erreur: Types incompatibles 'TnotifyEvent' et 'Procedure'

    (ligne **) si modification en: TEvtsBoutons = class(TNotifyEvent) --> Erreur: Type Class requis

    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
    // fiche principale
    //
    uses EditorEvent;
    ...
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ToolButton13.OnClick := TEvtsBoutons.ToolButton13Click;   //(*)
      ...
     
     
    // unité annexe
    //
    unit EditorEvent;
     
    interface
    uses Dialogs, Classes;
     
    type
      TEvtsBoutons = class  // (**) 
        procedure ToolButton13Click(Sender: TObject);
     
      private
      public
      end;
     
    implementation
     
    procedure TEvtsBoutons.ToolButton13Click(Sender: TObject);
    begin
      showmessage('c''est bon');
    end; 
    end.

  7. #7
    Membre habitué
    Inscrit en
    Mars 2003
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Mars 2003
    Messages : 281
    Points : 187
    Points
    187
    Par défaut
    ToolButton13.OnClick attend une procédure implémentée (le terme n'est peut être pas le bon):
    En clair
    - soit une procédure d'une instance de TEvtsBoutons
    - soit TEvtsBoutons.ToolButton13Click mais seulement si cette procédure est une procédure de classe

    En code =>

    soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ToolButton13.OnClick := TEvtsBoutons.ToolButton13Click;
     
    [..]
     
    type
      TEvtsBoutons = class  // (**) 
        class procedure ToolButton13Click(Sender: TObject);
    soit


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    MyEvtsBoutons := TEvtsBoutons.create;
    ToolButton13.OnClick := MyEvtsBoutons.ToolButton13Click;
     
    [..]
     
    type
      TEvtsBoutons = class  // (**) 
        procedure ToolButton13Click(Sender: TObject);
    sinon, si j'ai bien compris le problème de base qui consiste à déporter le code des événements dans une autre unité.

    Voici un exemple non testé, qui ne fonctionne que si tes unités annexes sont uniquement dédié à 1 form précis qui est de plus déclaré en var globale dans son unité.

    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
    Unit EventPourToolbarDeEcran1;
     
    interface
     
    procedure ClicSurBouton1(sender : Tobject);
     
     
    implementation
     
    uses EcranAppelantU;
     
    procedure ClicSurBouton1(sender : Tobject);
    begin
      //code de l'evt
    end;
     
    //----------- ecran
    unit Ecran1;
     
    interface
    uses  EventPourToolbarDeEcran1;
    type
       TmonEcran=Class(Tform)
     
       end;
     
    var
      MonEcran:TmonEcran;
     
    implementation
    Avec ce système, les fonctions déclarées dans l'unité deviennent visibles dans les combos évenement des composants de l'écran via l'éditeur de propriété (a conditions qu'elles respectent la même déclaration de paramètre que l'évenement qu'elles remplacent).


    Personnellement, je ne suis pas fan de ce genre de méthode.

  8. #8
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    Citation Envoyé par jcs2 Voir le message
    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
    ...
    uses EditorEvent;
    ...
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ToolButton13.OnClick := Evt.ToolButton13Click;   //(*)
      ...
    
    
    // unité annexe
    //
    unit EditorEvent;
    
    interface
    uses Dialogs, Classes;
    
    type
      TEvtsBoutons = class  // (**) 
        procedure ToolButton13Click(Sender: TObject);
    
      private
      public
      end;
    var
       Evt : TEvtsBoutons;
    implementation
     
    
    procedure TEvtsBoutons.ToolButton13Click(Sender: TObject);
    begin
      showmessage('c''est bon');
    end; 
    initialization
        Evt := TEvtsBoutons.Create;
    finalization
       Evt.free;
    end.
    @+ Phil

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Points : 142
    Points
    142
    Par défaut
    Citation Envoyé par jcs2 Voir le message
    Je viens de faire un essai avec la 2ème méthode de LeGec
    Je ne sais pas comment tu gères ton code, mais tu étais habitué à utiliser l'éditeur de fiche pour créer/retrouver tes évènements, n'oublie pas que cette méthode va court-circuiter ce que tu peux faire depuis l'éditeur de dfm.

    En particulier, vu que ton code va assigner l'évènement OnClick du bouton ToolBouton13, aller dans l'éditeur de fiche et créer un évènement OnClick depuis l'IDE ne modifiera rien à l'exécution :
    à l'exécution, la méthode assignée par le dfm sera supprimée et remplacée avec l'instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ToolButton13.OnClick := Evt.ToolButton13Click;
    Laisse un commentaire explicite au début de ton unité pour les générations futures...

  10. #10
    Membre habitué
    Inscrit en
    Mars 2003
    Messages
    281
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Mars 2003
    Messages : 281
    Points : 187
    Points
    187
    Par défaut
    Citation Envoyé par LeGEC Voir le message
    Je ne sais pas comment tu gères ton code, mais tu étais habitué à utiliser l'éditeur de fiche pour créer/retrouver tes évènements, n'oublie pas que cette méthode va court-circuiter ce que tu peux faire depuis l'éditeur de dfm.
    Entièrement du même avis, c'est le genre de codage qui risque d'induire en erreur quand il faudra faire de la maintenance.

    Je n'utilise ce genre de technique d'assignation d'événement que sur des composants créés dynamiquement, sur des actions répétitives, ou sur des cas particulier
    (exemple: affecter automatiquement tous les OnChange des Tedit à une procédure permettant de gérer les modifications)

    En régle générale, je préfére que l'evt CompoOnClick(Sender : Tobject) appel une procédure qui, est déporté dans un autre unité si nécessaire de manière à garder la trace visuel de la gestion d'évenement

  11. #11
    Membre régulier

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 126
    Points : 107
    Points
    107
    Par défaut
    Merci RamDevTeam, Phil (Anapurna) et LeGec pour vos réponses.

    J'ai corrigé mon code selon les indications d'Anapurna et LeGec, cela marche parfaitement et la solution à mon problème (éviter d'avoir une unité liée à la fiche principale trop volumineuse) me semble élégante et simple finalement.

    Si j'ai bien compris le processus (je ne sais si mon vocabulaire est correct -n'hésiter pas à corriger- cela pourrait fair l'objet d'une FAQ):
    _______________________________________________________________________

    Pour allèger un code volumineux correspondant à une fiche , déporter dans une unité annexe un ensemble de procédures liées à des évènements sur des contrôles visuels de cette fiche (unité principale):

    Dans la fiche/unité principale,
    1. ne pas déclarer l'évènement dans la fenêtre Inspecteur d'objets/évènement de l'EDI

    2. Dans une nouvelle unité annexe (ici Event) créer une CLASS regroupant les appels évènementiels (avec les bons paramètres):

    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
       // unité annexe
       //
       unit Event;
     
       interface
       uses ...
     
      type
        TEvtsBoutons = class   
          procedure ToolButton13Click(Sender: TObject);
          procedure Shape1MouseDown(Sender: TObject; Button: TMouseButton; 
                         Shift: TShiftState; X, Y: Integer);
          ... 
        private
        public
        end;
        ...
    3. dans cette même unité annexe (ici Event) créer une instance de cette CLASS, et écrire le code de la procédure liée à l'évènement:

    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
         // (unit Event; suite)
        ...
        var
           Evt : TEvtsBoutons;
        implementation
        ...       
        procedure TEvtsBoutons.ToolButton13Click(Sender: TObject);
        begin
        // code exécuté lorsque survient l'évènement
          ... 
        end;
     
        procedure Shape1MouseDown(Sender: TObject; Button: TMouseButton;
                      Shift: TShiftState; X, Y: Integer);
        begin
         // code exécuté lorsque survient l'évènement
          ... 
        end;
     
        initialization
          Evt := TEvtsBoutons.Create;
        finalization
          Evt.free;
        end.
    4. dans le <FormCreate> de l'unité principale déclarer les évènements en référencant l'instance de CLASS créée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        // (unité de la fiche;)
        ...
       procedure TForm1.FormCreate(Sender: TObject);
       begin
          ToolButton13.OnClick := Evt.ToolButton13Click
          Shape1.OnMouseDown := Evt.Shape1MouseDown;
         ...
    Je peux proposer cette FAQ si vous le voulez en y associant vos noms. Cela pourrait servir a de nombreux débutants

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/04/2010, 13h58
  2. Réponses: 1
    Dernier message: 01/07/2009, 17h41
  3. [Dates] Traiter une date autre que celle du jour
    Par malkie dans le forum Langage
    Réponses: 6
    Dernier message: 02/02/2008, 09h04
  4. "Save as" dans une location autre que le fichier où est enregistré le code
    Par Victoire 85 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/06/2007, 13h16
  5. Réponses: 1
    Dernier message: 15/08/2005, 19h38

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