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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé 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 : 44
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    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 968
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 968
    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 éclairé 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 : 44
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    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 émérite 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
    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 : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    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...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    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 Expert 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
    Par défaut
    FSaveButton.OnClick := SaveProjectEvent

  8. #8
    Membre éclairé 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 : 44
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    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 Expert 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
    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

  10. #10
    Membre éclairé 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 : 44
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    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

  11. #11
    Membre Expert 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
    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;

  12. #12
    Membre Expert

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    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 ...

  13. #13
    Membre émérite 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
    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;

  14. #14
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    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 491
    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

  15. #15
    Membre éclairé 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 : 44
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    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 ????

  16. #16
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    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 491
    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

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    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.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

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

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