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 Discussion :

Gestion d'un menu (selon vous)


Sujet :

Delphi

  1. #1
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut Gestion d'un menu (selon vous)
    Hello tout le monde,

    Voici une petite question pour savoir qu'elle méthode vous utiliseriez.
    Donc j ai une appli avec un Tmenu , et un sous menu "Enregister" qui doit enegistrer avec un format spécifique des traitements effectuées.

    Sauf que dans mon application le traitement peut etre différent selon la frame que j affiche dans ma form. (j'espere que tout le monde arrive a me suivre)

    Donc chaque frame a sa procédure pour générer le fichier à enregistrer, et il faut que j appele cette méthode a chaque fois que je clique sur enregistrer.

    Comment feriez vous ?

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 28
    Points : 33
    Points
    33
    Par défaut
    Je que j'ai fait dans le même cas :
    - Créer une frame "Modele" contenant :
    - des méthodes virtuelles
    - des méthodes réelles (pour les traitement commun)
    - Créer les frames dérivées du modèle contenant
    - les méthodes réelles (pour les virtuelles)
    - le complément des méthodes (avec inhérited)

    Voilou

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 218
    Points : 311
    Points
    311
    Par défaut
    Première idée à chaud :

    Je commencerais par lier le menu à une action Enregistrer.

    Ensuite sur chacune des fiches je déclarerais une action spécifique d'enregistrement.
    Je lierais cette action à l'action Enregistrer dans l'évènement OnActivate de chacune des formes.
    Reste à voir comment désactiver l'action quand il n'y pas de fiches actives(donc FMDi). Mais avec quelques essais ca doit se trouver assez facilement.

    Si tu démarres un nouveau projet, je commencerais par coder une fiche qui sera l'ancêtre pour toutes les fiches de ton application dans laquelle tu désactiverais l'action dans le Onactivate. Ainsi pour toutes les fiches qui n'ont pas d'actions Energistrer le menu enregistrer serait automatqiuement grisé.

    Enfin voilà grosso modo comment je procéderais.

    En tout cas l'action me semble nécessaire, elle te permettra aisément si par la suite tu ne veux plus utiliser un menu, mais un bouton par exemple de refaire un lien il n'y aura que la propriété action du bouton à lier pour que cela marche.

  4. #4
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    Flode ton idée pas mal vu que le structure de mon appli est comme tu le dis avec une frame model.

    Et aprés j ai plus qu'a faire du polymorphisme lors de la création de mes frames comme ça le code a l'intérieur de mon button "enregistrer" reste identique.

    J'aurais du y penser.

    Excellente idée.

    Je suis quand meme preneur d 'autre idées on ne sait jamais un petit brainstorming
    peut faire ressortir des idées intéressantes.

  5. #5
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Deja, moi je separe l'evenement du traitement.
    C'est a dire que mes events en general appellent une methode qui s'occupe d'effectuer le traitement.
    Cela permet de pouvoir faire appel au traitmeent sans passer par les evenements et de maniere plus propre que d'appeler directement le gestionnaire d'evenement .. qui peut etre amené a changer lors d'u nremaniement du design. Je pense au passage d'un menu a une toolbar ou pour justement gerer en parallele le menu et la toolbar.

    Ensuite, pourquoi ne pas externaliserle traitement en faisant appel a une procedure externe (a la maniere des evenements).
    Si vide, alors on appelle la fonction par defaut definie dans la form, sinon celle specifié .... chaques frames s'occupant d'affecter sa propre fonction a la form quand elle est activée.

    Apres on peut aussi jouer sur les interfaces ....

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    J'utiliserais peut être un patron de méthode.

    L'idée étant de définir la trame de l'algorithme au niveau de la classe de base abstraite, puis compléter cette trame dans les classes dérivées.

    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
    TEnregistrementAbstrait = class
    private
    protected
      procedure Traitement1(); virtual; abstract;
      procedure Traitement2(); virtual; abstract;
    public
      procedure Enregistrer();    // <--- le patron de méthode
    end;
     
    procedure TEnregistrementAbstrait.Enregistrer();
    begin
       Traitement1();
       Traitement2(); 
    end;
     
    ---------
    TEnregistrementFrame1 = class(TEnregistrementAbstrait)
    protected
      procedure Traitement1(); override;
      procedure Traitement2(); override;
    end;
     
    TEnregistrementFrame2 = class(TEnregistrementAbstrait)
    protected
      procedure Traitement1(); override;
      procedure Traitement2(); override;
    end;
    Puis dans le gestionnaire d'évenement du sous-menu, faire un appel à Enregistrer() via une variable de type TEnregistrementAbstrait en tirant profit de l'appel polymorphique des procedures de traitement.



    ps: Cette conception est très voisine de celle proposée par Flode.

  7. #7
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Si par contre il n'y a pas de frame modèle, et que l'application est déjà à un stade avancé où il est difficile de tout remettre sur base d'une frame modèle, on peut remplacer les méthodes virtuelles par des méthodes messages.

    D'abord il faut déclarer le message que l'on va utiliser. Puisque les frames sont descendantes de TWinControl, il faut éviter tout message en-dessous de WM_USER. Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const
      MsgSave = WM_USER + 1;
    Ensuite, on définit le record contenant les informations d'enregistrement. On pourrait supposer que l'information contient le nom du fichier où enregistrer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    type
      TMsgSave = record
        MsgID : Word; // obligatoire, vaudra MsgSave
        FileName : TFileName;
      end;
    Il faut encore intercepter le message dans chaque frame, avec une méthode déclarée comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure Save(var Msg : TMsgSave); message MsgSave;
    Et on l'implémente comme il faut.

    Finalement, pour demander à la frame active de s'enregistrer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var Msg : TMsgSave;
     
    if not SaveDialog.Execute then exit;
    Msg.MsgID := MsgSave;
    Msg.FileName := SaveDialog.FileName;
    ActiveFrame.Dispatch(Msg);
    Et valà.

    (combien on parie que Clorish va me dire que je cherche midi à 14:03 ? )

  8. #8
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Citation Envoyé par sjrd
    (combien on parie que Clorish va me dire que je cherche midi à 14:03 ? )
    lol pas tant que ca
    En fait si quand meme un peu ....
    tu peux pas directement implementer des gestionnaires d'evenements dans les frames et les affecter a l'evenement OnClick du menuItem lorsqu'elle est active ?

  9. #9
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par Clorish
    lol pas tant que ca
    En fait si quand meme un peu ....
    J'l'avais dit
    Citation Envoyé par Clorish
    tu peux pas directement implementer des gestionnaires d'evenements dans les frames et les affecter a l'evenement OnClick du menuItem lorsqu'elle est active ?
    Si, mais ce n'est pas propre : les frames ne devraient pas être au courant de l'existence de ce menu, qui est situé à un niveau hiérarchique plus élevé (la fiche contenante).

    Déjà tu vas être presque obligé de faire des références circulaires dans les implementation, sauf si tu passes une fonction de callback pour l'affectation du OnClick à la création des frames, ou alors de passer directement l'élément de menu. Mais comme je le disais plus haut, niveau conception c'est horrible.

    En plus, il est fort possible que la fiche principale aie un code commun à effectuer pour chaque frame (comme l'affichage du SaveDialog par exemple). Ca forcerait encore chaque frame à appeler une méthode avec ce code commun, ce qui ferait encore des références "moches".

    Bref je préfère les message

  10. #10
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Citation Envoyé par sjrd
    Bref je préfère les message
    C'est pour ca que j'ai dit pas tant que ca
    C'est clair que c'est plus propre
    J'takin' ....

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Si, mais ce n'est pas propre : les frames ne devraient pas être au courant de l'existence de ce menu, qui est situé à un niveau hiérarchique plus élevé (la fiche contenante).
    Tout à fait juste.
    Et il est préférable de dissocier la vue(Menu, frame) du modèle.(TEnregistrementAbstrait).

  12. #12
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    Merci a tous pour vos idées et vos réponses ...
    Je vais étudie tout ça .

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

Discussions similaires

  1. Selon vous, le meilleur parseur XML ?
    Par Community Management dans le forum XML/XSL et SOAP
    Réponses: 22
    Dernier message: 05/06/2012, 12h39
  2. Meilleur logiciel de gestion de parc selon vous ?
    Par Davidflo dans le forum Windows Serveur
    Réponses: 15
    Dernier message: 07/12/2010, 11h24
  3. Les logiciels indispensables pour Développeurs selon vous ?
    Par Straahd dans le forum Débats sur le développement - Le Best Of
    Réponses: 287
    Dernier message: 24/10/2010, 11h14
  4. Quel est le meilleur générateur d'états selon vous ?
    Par Marc Lussac dans le forum Outils de restitution et d'analyse
    Réponses: 80
    Dernier message: 18/05/2010, 16h43
  5. [JSP]Gestion d'un menu dynamique
    Par joebarteam88 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 16/08/2005, 12h35

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