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 :

Comment optimiser l'énumération de controls


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut Comment optimiser l'énumération de controls
    Bonsoir à toutes et à tous

    J'ai besoin dans mon application de parcourir les controls d'un conteneur exemple un TPanel.
    Ce Panel peut comporter soit des simples TEdit ou des Tabsheet (sous Tpagecontrol) qui comportent eux mêmes des TgroupBox incluant des TcomboBox. Pour faire simple j'ai besoin de tout parcourir pour récupérer la valeur du TAG de ces composants afin de les comparer non pas entre eux mais les comparés par rapport a un TStringList préalablement rempli.

    voici ma procédure

    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
        EnumDroits.Clear;
        EnumDroits.Delimiter := ',';
        EnumDroits.DelimitedText := Gauche(':FsPanelBas',Droite('DsPanelBas:',logiciel.Droits));
        for x := 0 to EnumDroits.Count - 1 do
        begin
          for i := 0 to sPanelBas.ControlCount - 1 do
          begin
            if (sPanelBas.Controls[i] is TsPanel) then
            begin
              for j := 0 to (sPanelBas.Controls[i] as TsPanel).ControlCount - 1 do
              begin
                if ((sPanelBas.Controls[i] as TsPanel).Controls[j] is TsPageControl) then
                begin
                  for y := 0 to ((sPanelBas.Controls[i] as TsPanel).Controls[j] as TsPageControl).ControlCount - 1 do
                  begin
                    if (((sPanelBas.Controls[i] as TsPanel).Controls[j] as TsPageControl).Controls[y] is TsTabSheet) then
                    begin
                      for z := 0 to (((sPanelBas.Controls[i] as TsPanel).Controls[j] as TsPageControl).Controls[y] as TsTabSheet).ControlCount  - 1 do
                      begin
                        if (((sPanelBas.Controls[i] as TsPanel).Controls[j] as TsPageControl).Controls[y] as TsTabSheet).Controls[z].tag = StrToIntDef(EnumDroits.Strings[x],-1) then
                        begin
                          (((sPanelBas.Controls[i] as TsPanel).Controls[j] as TsPageControl).Controls[y] as TsTabSheet).Controls[z].Enabled  := False;
                          (((sPanelBas.Controls[i] as TsPanel).Controls[j] as TsPageControl).Controls[y] as TsTabSheet).Controls[z].ShowHint := False;
                        end;
                      end;
                    end;
                    if ((sPanelBas.Controls[i] as TsPanel).Controls[j] as TsPageControl).Controls[y].Tag = StrToIntDef(EnumDroits.Strings[x],-1) then
                    begin
                      ((sPanelBas.Controls[i] as TsPanel).Controls[j] as TsPageControl).Controls[y].Enabled  := False;
                      ((sPanelBas.Controls[i] as TsPanel).Controls[j] as TsPageControl).Controls[y].ShowHint := False;
                    end;
                  end;
                end;
                if (sPanelBas.Controls[i] as TsPanel).Controls[j].Tag = StrToIntDef(EnumDroits.Strings[x],-1) then
                begin
                  (sPanelBas.Controls[i] as TsPanel).Controls[j].Enabled  := False;
                  (sPanelBas.Controls[i] as TsPanel).Controls[j].ShowHint := False;
                end;
              end;
            end;
            if sPanelBas.Controls[i].Tag = StrToIntDef(EnumDroits.Strings[x],-1) then
            begin
              sPanelBas.Controls[i].Enabled := False;
              sPanelBas.Controls[i].ShowHint := False;
            end;
          end;
        end;
    Existe-il une méthode moins comliquée ?

    @Merci.

  2. #2
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    Bonsoir,

    Je ne sais pas si ça va t'aider, mais tu pourrais parcourir tous les Controls de ta Form ainsi, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i:= 0 to ComponentCount-1 do
      if Components[i] is TControl
        then Memo1.Lines.Add(format('%.3d  %s', [i, Components[i].Name]));

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Caribensila Voir le message
    Bonsoir,

    Je ne sais pas si ça va t'aider, mais tu pourrais parcourir tous les Controls de ta Form ainsi, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i:= 0 to ComponentCount-1 do
      if Components[i] is TControl
        then Memo1.Lines.Add(format('%.3d  %s', [i, Components[i].Name]));
    Salut Caribensila,

    Je ne peux pas utiliser cette méthode, ou alors il faudrait pouvoir à un moment être dans le PanelBas (un Tpanel) où je souhaite accèder à l'ensemble des compos de ce Tpanel (qui comporte d'autre Tpanel/TpageControl/Tcombobox etc..)

    @+

  4. #4
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 473
    Points : 3 097
    Points
    3 097
    Par défaut
    avec un peu de récursivité peut-être ? Chaque composant qui peut en contenir d'autres peut être "détecté" et on peut repasser le même code dessus ...
    Bien codé, on peut même avoir toute la hiérarchie

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 577
    Points : 25 225
    Points
    25 225
    Par défaut
    Déjà tu pourrais éviter de faire [x][y][z] à chaque fois !

    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
    for x := 0 to EnumDroits.Count - 1 do
        begin
          for i := 0 to sPanelBas.ControlCount - 1 do
          begin
            CtrlOne := sPanelBas.Controls[i]; // ça
            if (CtrlOne is TsPanel) then
            begin
              PanelOne := TsPanel(CtrlOne); // tu as fait is, inutile de faire as, une nano seconde de moins !
              for j := 0 to PanelOne.ControlCount - 1 do
              begin
                CtrlTwo := PanelOne.Controls[j];
                if (CtrlTwo is TsPageControl) then
                begin 
                  PageCtrlTwo := TsPageControl(CtrlTwo);
                  ...

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Ne serait il pas mieux de :

    1- Localiser ton panel en premier
    2- de vérifier les droits des composants du panel

    Car la tu fais

    Pour chaque droits je vérifie les composants

    En gros virer la boucle x et mettre le test de vérification plutôt dans la boucle Z en utilisant IndexOf de la TStringList

  7. #7
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Rayek Voir le message
    Ne serait il pas mieux de :

    1- Localiser ton panel en premier
    2- de vérifier les droits des composants du panel

    Car la tu fais

    Pour chaque droits je vérifie les composants

    En gros virer la boucle x et mettre le test de vérification plutôt dans la boucle Z en utilisant IndexOf de la TStringList
    Oui, Oui, je m'en suis apperçu hier soir et j'ai retiré la boucle x pour faire un IndexOf

    Je regarde les autre propositions.

    Merci.

  8. #8
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    Citation Envoyé par BuzzLeclaire Voir le message
    Je ne peux pas utiliser cette méthode, ou alors il faudrait pouvoir à un moment être dans le PanelBas (un Tpanel) où je souhaite accèder à l'ensemble des compos de ce Tpanel (qui comporte d'autre Tpanel/TpageControl/Tcombobox etc..)
    Il suffit que tu décides que tous les compos et sous-compos de ton PanelBas aient des Tag > 100, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i:= 0 to ComponentCount-1 do
      if (Components[i] is TControl) and (Components[i].Tag>100)
        then Memo1.Lines.Add(format('%.3d  %s', [i, Components[i].Name]));

  9. #9
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Caribensila Voir le message
    Il suffit que tu décides que tous les compos et sous-compos de ton PanelBas aient des Tag > 100, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i:= 0 to ComponentCount-1 do
      if (Components[i] is TControl) and (Components[i].Tag>100)
        then Memo1.Lines.Add(format('%.3d  %s', [i, Components[i].Name]));
    Excellent, j'y avais pas pensé une seconde..., voilà ce que cela peut donner.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        EnumDroits.Clear;
        EnumDroits.Delimiter := ',';
        EnumDroits.DelimitedText := Gauche(':FsPanelBas',Droite('DsPanelBas:',logiciel.Droits));
        for i:= 0 to ComponentCount-1 do
          if (Components[i] is TControl) and (Components[i].Tag >= 500) and (Components[i].Tag <= 520) then
             (Components[i] as TControl).Enabled := EnumDroits.IndexOf(InttoStr(Components[i].Tag)) = -1;
    Pour de la simplification c'est de la simplification, en plus je vais pouvoir l'étendre.

    Parcontre cela ne fonctionne pas pour les TMenu ou TPopupMenu !!

    J'ai essayé en global

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        for i:= 0 to ComponentCount-1 do
          Components[i].Enabled := EnumDroits.IndexOf(InttoStr(Components[i].Tag)) = -1;
    Evidement Enabled n'existe pas

    J'ai donc fini par faire cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        EnumDroits.Delimiter := ',';
        EnumDroits.DelimitedText := Gauche(':FPrincipal',Droite('DPrincipal:',logiciel.Droits));
        for i:= 0 to ComponentCount-1 do
          if (Components[i] is TControl) then
            (Components[i] as TControl).Enabled := EnumDroits.IndexOf(InttoStr(Components[i].Tag)) = -1
          else
          if (Components[i] is TMenuItem) then
            (Components[i] as TMenuItem).Enabled := EnumDroits.IndexOf(InttoStr(Components[i].Tag)) = -1

    Merci à vous tous.

  10. #10
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    A tester mais tu peux aussi faire de cette manière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    uses ... ,TypInfo;
     
    EnumDroits.Delimiter := ',';
    EnumDroits.DelimitedText := Gauche(':FPrincipal',Droite('DPrincipal:',logiciel.Droits));
    for i:= 0 to ComponentCount-1 do
      if  GetPropInfo(Component[i].ClassInfo, 'Enabled') then
        SetPropValue(TObject(Component[i]),'Enabled', (EnumDroits.IndexOf(InttoStr(Components[i].Tag)) = -1));

  11. #11
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Rayek Voir le message
    A tester mais tu peux aussi faire de cette manière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    uses ... ,TypInfo;
     
    EnumDroits.Delimiter := ',';
    EnumDroits.DelimitedText := Gauche(':FPrincipal',Droite('DPrincipal:',logiciel.Droits));
    for i:= 0 to ComponentCount-1 do
      if  GetPropInfo(Component[i].ClassInfo, 'Enabled') then
        SetPropValue(TObject(Component[i]),'Enabled', (EnumDroits.IndexOf(InttoStr(Components[i].Tag)) = -1));
    Merci Rayek pour ta proposition, mais le enabled n'est pas la seule proriété que je doit toucher.

    De plus GetPropInfo(Component[i].ClassInfo, 'Enabled') ne retourne pas un boolean apparement avec cette modification cela marche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      PropInfo: PPropInfo;
    begin
      EnumDroits := TStringList.Create;
      Try
        EnumDroits.Delimiter := ',';
        EnumDroits.DelimitedText := Gauche(':FPrincipal',Droite('DPrincipal:',logiciel.Droits));
        for i:= 0 to ComponentCount-1 do
        begin
          PropInfo := GetPropInfo(Components[i].ClassInfo, 'Enabled');
          if Assigned(PropInfo) then
    //        SetPropValue(TObject(Components[i]),'Enabled', (EnumDroits.IndexOf(InttoStr(Components[i].Tag)) = -1));
     SetOrdProp(TObject(Components[i]),PropInfo, LongInt((EnumDroits.IndexOf(InttoStr(Components[i].Tag)) = -1)));
        end;
    En finalité j'ai donc 2 possibilité :
    @Rayek
    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
     
      PropInfo : PPropInfo;
    begin
      EnumDroits := TStringList.Create;
      Try
        EnumDroits.Delimiter := ',';
        EnumDroits.DelimitedText := Gauche(':FPrincipal',Droite('DPrincipal:',logiciel.Droits));
        for i:= 0 to ComponentCount-1 do
        begin
          if (Components[i] is TsTabSheet) And ((Components[i] as TsTabSheet).Parent.Name = sPageControl.Name)
          then PropInfo := GetPropInfo(Components[i].ClassInfo, 'TabVisible')
          else PropInfo := GetPropInfo(Components[i].ClassInfo, 'Enabled');
     
          if Assigned(PropInfo) then
            SetOrdProp(TObject(Components[i]),PropInfo, LongInt((EnumDroits.IndexOf(InttoStr(Components[i].Tag)) = -1)));
        end;
      Finally
        if Assigned(EnumDroits) then FreeAndNil(EnumDroits);
      End;
    @initié par Caribansila

    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
      EnumDroits := TStringList.Create;
      Try
        EnumDroits.Delimiter := ',';
        EnumDroits.DelimitedText := Gauche(':FPrincipal',Droite('DPrincipal:',logiciel.Droits));
        for i:= 0 to ComponentCount-1 do
          if (Components[i] is TControl) then
            if (Components[i] is TsTabSheet) And ((Components[i] as TsTabSheet).Parent.Name = sPageControl.Name) then
              (Components[i] as TsTabSheet).TabVisible := EnumDroits.IndexOf(InttoStr(Components[i].Tag)) = -1
            else
              (Components[i] as TControl).Enabled := EnumDroits.IndexOf(InttoStr(Components[i].Tag)) = -1
          else
            if (Components[i] is TMenuItem) then
              (Components[i] as TMenuItem).Enabled := EnumDroits.IndexOf(InttoStr(Components[i].Tag)) = -1
     
      Finally
        if Assigned(EnumDroits) then FreeAndNil(EnumDroits);
      End;

    Au niveau vitesse vous auriez choisi laquelle ?

    @Merci pour votre aide.

  12. #12
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par BuzzLeclaire Voir le message
    Merci Rayek pour ta proposition, mais le enabled n'est pas la seule proriété que je doit toucher.
    Comme tu as pu le voir cela ne se limite pas qu'au enabled

    Citation Envoyé par BuzzLeclaire Voir le message
    De plus GetPropInfo(Component[i].ClassInfo, 'Enabled') ne retourne pas un boolean apparement avec cette modification cela marche.
    oublier le <> nil

    Citation Envoyé par BuzzLeclaire Voir le message
    Au niveau vitesse vous auriez choisi laquelle ?

    @Merci pour votre aide.
    Je pense que les deux se valent

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/09/2007, 16h43
  2. [Perf] Comment optimiser son code ?
    Par Frifron dans le forum Général Java
    Réponses: 12
    Dernier message: 11/08/2005, 09h05
  3. [Performance]Comment optimiser la vitesse ?
    Par le Daoud dans le forum Général Java
    Réponses: 13
    Dernier message: 03/06/2005, 15h47
  4. Comment optimiser une jointure ?
    Par seb_asm dans le forum Administration
    Réponses: 21
    Dernier message: 25/06/2004, 16h42
  5. Comment peut on integer des controles dans un prog opengl
    Par franck31400 dans le forum OpenGL
    Réponses: 2
    Dernier message: 28/04/2004, 09h06

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