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 :

Besoin d'aide pour optimiser un code


Sujet :

Langage Delphi

  1. #1
    Membre actif Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Points : 267
    Points
    267
    Par défaut Besoin d'aide pour optimiser un code
    Bonjour, voilà y a t'il un moyen pour optimiser ce code?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     if (FSaveButton is TButton) then
      (FSaveButton as TButton).OnClick:= SaveProjectEvent;
     
     if (FSaveButton is TMenuItem) then
       (FSaveButton as TMenuItem).OnClick := SaveProjectEvent;
     
     if (FSaveButton is TToolButton) then
       (FSaveButton as TToolButton).OnClick := SaveProjectEvent;
    J'ai beau y triturer dans tout les sens je ne vois pas ...
    Merci !

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 945
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 945
    Points : 5 659
    Points
    5 659
    Par défaut
    Noe,

    Déjà, enchaîner les différents tests avec des sections else pour les if, puisque les tests ne peuvent pas être tous vrais en même temps. Tu évites ainsi de faire ceux qui ne servent à rien.

  3. #3
    Membre actif Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Points : 267
    Points
    267
    Par défaut
    humm.... certe....
    Je me suis mal exprimé, je ne parlais pas d'optimisations de ce style, mais je voyais plutôt la chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (FSaveButton.ClassType = TButton) or ..... then
      (FSaveButton as 'une classe générique').OnClick := SaveProjectEvent;
    Parce que je vais avoir à peu prêt une cinquantaine du ligne de se style....
    Voilà

  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
    Salut,

    Peut être une piste à compléter pour toi...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    type
      TWinControlAccess = class(TWinControl);
     
    TWinControlAccess(FSaveButton).OnClick := SaveProjectEvent;

  5. #5
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    A part éviter effectivement de faire systématiquement les trois tests, je ne vois pas trop comment optimiser ça...

    On ne peut pas passer par les objets ancêtres, car TControl (adéquat pour TButton et TToolButton) ne publie pas son évènement OnClick. TMenuItem, lui, dérive directement de TComponent en plus...

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 753
    Points : 13 337
    Points
    13 337
    Par défaut
    N'as-tu pas le composant TActionList dans ta version de Delphi ?
    Ces trois contrôles seraient liés statiquement à une action et seul l'événement de cette action pourrait être settée.

  7. #7
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    FSaveButton.OnClick := SaveProjectEvent

  8. #8
    Membre actif Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Points : 267
    Points
    267
    Par défaut
    @edam:
    C'est impossible.... Cette solution ne peut marcher que si on sait à l'avance à quelle classe FSaveButton appartient, mais dans mon cas on ne sait pas, d'où les tests...
    Mais je le reconnais, c'est un peu de ma faute car je n'ai pas assez donné de précisions:

    FSaveButton est une propriété de composant et du type TComponent.
    Pour faire apparaitre l'événement "OnClick", on est obligé de transtyper FSaveButton et de tester s'il appartient à une classe donnée, sinon Delphi refuse de compiler.

    @Andnotor:
    Justement j'essaie de reproduire le TActionList, sans l'utiliser, car en réalité j'utilise des composants graphiques(boutons, menus, ...) que j'ai moi-même développé, et je n'ai pas envie de leur implémenter des actions....

  9. #9
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par petitprince Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     if (FSaveButton is TButton) then
      (FSaveButton as TButton).OnClick:= SaveProjectEvent;
     
     if (FSaveButton is TMenuItem) then
       (FSaveButton as TMenuItem).OnClick := SaveProjectEvent;
     
     if (FSaveButton is TToolButton) then
       (FSaveButton as TToolButton).OnClick := SaveProjectEvent;
    Je vais peut etre dire une grosse bêtise mais bon ...

    Est ce qu'on pourrait pas faire un tableau contenant :
    Tab=[TButton,TMenuItem,TToolButton,...,...,...]
    et ensuite faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i:=low(Tab) to High(Tab)
      if (FSaveButton is Tab[i]) then
      begin
        (FSaveButton as Tab[i]).OnClick := SaveProjectEvent;
        Break;
      end;
    Je sais pas si c'est vraiment possible ...

  10. #10
    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
    Salut,

    Version 2 de mon précédent post:

    Puisque "OnClick" apparaît avec TControl:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    type
      TControlAccess = class(TControl);
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if FSaveButton.InheritsFrom(TControl) then
        TControlAccess(FSaveButton).OnClick := TestHandler;
    end;

  11. #11
    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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Found := (FSaveButton is TButton) 
              or (FSaveButton is TMenuItem)
              or (FSaveButton is TToolButton); 
     if Found  Then 
      TComponent(FSaveButton).OnClick := SaveProjectEvent;
    @+ Phil

  12. #12
    Membre actif Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Points : 267
    Points
    267
    Par défaut
    Aucune des solutions ne marche, sauf celles de Kaféine, pour la simple raison que l'on ne connais pas le type de FSaveButton à l'avance.

    @anapurna:
    Delphi refuse catégoriquement la compilation. "TComponent(FSaveButton)" n'a pas d'événement OnClick, même avec les tests de début...

    Les exemples de Kaféine fonctionnent, car on admet que le type donné à FSaveButton est un TControl, TControl qui comporte bien l'événement OnClick. Ils ne marchent pas cependant pour les TMenuItems, descendant de TComponent, voire TCollectionItem ????

  13. #13
    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

    je n'avait pas tester
    d'apres ce que tu dit ils n'ont pas d'ancêtre commun ?

    dans ce cas il va falloir dissocier tes différent ancêtre ayant une méthode onclick afin de pouvoir transtypé les différents composant



    @+ Phil

  14. #14
    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
    Du coup il ne reste plus que la solution RTTI

    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
     
    (...)
      published
        procedure TestHandler(Sender: TObject);
    (...)
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      P: PPropInfo;
      LeHandler: TMethod;
    begin
        P := GetPropInfo(FSaveButton, 'OnClick');
        if P <> nil then
        begin
          LeHandler.Code := MethodAddress('TestHandler');
          LeHandler.Data := Pointer(Self);
          SetMethodProp(FSaveButton, P, LeHandler);
        end;
    end;

  15. #15
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    N'as-tu pas le composant TActionList dans ta version de Delphi ?
    Ces trois contrôles seraient liés statiquement à une action et seul l'événement de cette action pourrait être settée.
    +1

  16. #16
    Membre actif Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Points : 267
    Points
    267
    Par défaut
    J'ai expliqué plus haut pourquoi je ne souhaite pas utiliser le TActionList. Je ne me répèterai donc pas.

    @Kaféine:
    Ta solution marche impec, dommage que l'on soit obligé de mettre la nouvelle méthode en "published".
    Je l'ai comprise donc c'est bon, je considère ce sujet comme résolu

    Merci à toi et à tous les participants

  17. #17
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    svp ne crié pas, essai ce code, je sais pas pourquoi il marche chez moi :
    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
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        MainMenu1: TMainMenu;
        xxx1: TMenuItem;
        xxxx1: TMenuItem;
        Button2: TButton;
        Shape1: TShape;
        procedure Button2Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
      maclas=class(TControl)
     
      end;
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin   
         with maclas(xxxx1) do
            if @OnClick=nil then ShowMessage('Erreur')
            else ShowMessage(inttostr(integer(@OnClick)));
         with maclas(Shape1) do
            if @OnClick=nil then ShowMessage('Erreur')
            else ShowMessage(inttostr(integer(@OnClick)));
    end;

  18. #18
    Membre actif Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Points : 267
    Points
    267
    Par défaut
    Mais je ne criais pas, je le disais calmement
    Bizarre ton code, car chez moi il ne fonctionne pas du tout, ce qui est normal:
    le shape n'a pas de méthode "OnClick", et le TMenuItem n'est pas un TControl.

    Je ne comprend pas pourquoi ça marche chez toi ....


    EDIT:
    Bon après des tests plus poussés, le code marche uniquement au premier click sur le bouton, mais il marche uniquement pour le TMenuItem !!!!
    Là je n'y comprend rien !!!

  19. #19
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    Citation Envoyé par petitprince Voir le message
    EDIT:
    Bon après des tests plus poussés, le code marche uniquement au premier click sur le bouton, mais il marche uniquement pour le TMenuItem !!!!
    Là je n'y comprend rien !!!
    c'est ce que je veux dire exactement, avec TShap --> message erreur, avec TItemMenu---> l'adresse de onclick
    à propos, j'ai delphi 6


    edit:
    Citation Envoyé par petitprince Voir le message
    Mais je ne criais pas, je le disais calmemen
    pas pour toi, c'est pour tout les delphistes, car ce code n'a aucun sens

  20. #20
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par petitprince Voir le message
    Aucune des solutions ne marche, sauf celles de Kaféine, pour la simple raison que l'on ne connais pas le type de FSaveButton à l'avance.
    Sauf qu'en raisonnant POO, elle contrevient à toutes les règles d'héritage : tu transtypes ta classe vers une classe dont elle n'hérite pas !!!

    La solution du TActionList resterait la plus "propre", même si elle suppose une indirection de plus.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Besoin d'aide pour optimiser du code
    Par scaleo dans le forum Langage
    Réponses: 1
    Dernier message: 07/01/2007, 13h56
  2. [VB.NET] besoin d'aide pour déchiffrer un code
    Par pcdj dans le forum Windows Forms
    Réponses: 10
    Dernier message: 27/06/2006, 11h32
  3. besoin d'aide pour optimiser une requête
    Par jisse dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/01/2006, 09h41
  4. Je besoin d'aide pour terminer mon code
    Par Paulinho dans le forum C++
    Réponses: 7
    Dernier message: 06/11/2005, 23h30
  5. Besoin d'aide pour optimiser requête SQL
    Par Keuf95 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 06/09/2005, 16h02

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