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 :

Petite question de prog


Sujet :

Delphi

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 92
    Par défaut Petite question de prog
    Bonjour,

    Je charge une liste de code options dans une TListBox .

    Si un de ces codes est du type 'toto' je met un flag à 'true'.

    L'utilisateur peut ajouter et supprimer à sa guise les options dans la liste à partir de boutons ajouter/supprimer.
    Donc si on ajoute ou supprime l'option "toto" le flag passe de 'true' à 'false' et inversement.

    J'ai créé une fonction commune aux 2 boutons. Le problème c'est que le code est lourd : il faut à chaque fois tester si le code ajouté est 'toto'. D'après vos expériences, y aurait il un moyen plus simple de gérer ce cas.

    Merci d'avance.

  2. #2
    Membre émérite Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Par défaut
    Bonjour!

    Je suis désolé j'aimerais beaucoup t'aider mais je ne comprends pas ta question .

    Est-ce qu'il te serait possible de la reformuler avec la terminologie de Delphi stp ?

    Par exemple est-ce que "code" c'est un Item de ta TListBox ? À quoi correspond le "flag" au juste ? Une case à cocher dans la list box ? Une variable globale ? Un tableau de variables globales ?

    Aussi, si tu pouvais décrire en gros ce que tu cherches à faire non seulement nous serons en mesure de te conseiller sur ton problème précis mais peut-être aussi pourrons-nous te suggérer des techniques générales qui nous semblerons plus efficaces.

    Merci !

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 947
    Billets dans le blog
    6
    Par défaut
    je suppose que le mieux est de détecter la présence ou absence de l'item dans le OnChange de la TListBox, pour mettre le flag à jour à chaque modif, qu'elle soit en plus ou en moins
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 92
    Par défaut
    Désolé j'avais voulu faire vite et simple...

    isCodeSpecifique est déclaré comme variable booleen dans Ma TForm.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    Type
      TForm1 : class(TForm)
      ds : TClientDataSet;  
      dsCode : TStringField;
      {...}
    Var 
      isCodeSpecifique : boolean;
      insertiondansliste :boolean;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    {Corps du programme} 
    //Exécuté une seule fois ! 
    for j := 0 to NbItemsDansMaliste - 1 do begin
        ds.Insert;
        dsCode.Value    := Maliste.Items[j] ;
        if ( Maliste.Items.Strings[i] = 'toto' ) or 
           ( Maliste.Items.Strings[i] = 'tata' ) then
           isCodeSpecifique := true;
        ds.Post;
    end;
    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
     
    procedure TForm1.dsAfterInsert(DataSet: TDataSet);
    Begin
        insertiondansliste := True;
    End;
     
    procedure TForm1.dsAfterPost(DataSet: TDataSet);
    var
      i      : integer;
      bool : Boolean;
    begin
        if insertiondansliste then begin
          NbItemsDansMaliste := NbItemsDansMaliste + 1;
          insertiondansliste := False;
        end;
        bool:= False;
        for i := 0 to NbItemsDansMaliste - 1 do begin
          if ( Copy(Maliste.Items.Strings[i],0,10) = dsCode.Value ) then begin
            bool := True;
            break;
          end;
        end;
        if ( bool = False ) then
          i := NbItemsDansMaliste - 1;
        Maliste.Items.Strings[i] := dsCode.Value;
        if ( Maliste.Items.Strings[i] = 'toto' ) or 
           (  Maliste.Items.Strings[i]= 'tata' ) then
           isCodeSpecifique := true;
    end;
     
    procedure TForm1.dsBeforeDelete(DataSet: TDataSet);
    var
      i : integer;
      bool : boolean;
    Begin
      bool := false;
      for i := 0 to NbItemsDansMaliste - 1 do begin
        if ( copy(Maliste.Items.Strings[i],0,10) = dsCode.Value ) then begin
         	if ( Maliste.Items.Strings[i] = 'toto' ) or 
           	   (  Maliste.Items.Strings[i]= 'tata' ) then
           isCodeSpecifique := False;
          bool := true;
          break;
        end;
      end;
    {...}
    End;
    J'espère avoir été plus clair!

  5. #5
    Membre Expert
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Par défaut
    Regarde si tes items ne possèderaient pas une propriété libre comme Tag ou Hint ou quelque chose d'autre qui pourrait te permettre de stocker ce flag... car en effet, si tu dois à chaque fois parcourir la totalité des items, ça risque d'être lourd lorsque tu auras beaucoups d'items. Sinon, la solution sera de créer une propriété suplémentaire à l'objet.
    [EDIT] Malgré tout, si tu veux effectuer une action à l'ensemble des items, tu seras bien obligé de parcourir la liste...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 92
    Par défaut
    Merci à tous.
    Ce qui me pose le plus de problème c'est la répétition du test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if ( Maliste.Items.Strings[i] = 'toto' ) or 
      ( Maliste.Items.Strings[i] = 'tata' ) then
      isCodeSpecifique := ...
    En effet je dois rajouter un nouveau test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ( Maliste.Items.Strings[i] = 'titi' ) then
      isCodeSpecif2 := true;
    Tous ces tests en dur polluent le code. Peut-être faudrait-il que je crée une table pour chaque spécificité. Mais est-ce malin de créer une table pour 2 codes?? Sinon j'avais pensé à une classe dédiée qui traite les codes spécifiques mais ça me paraît un peu dur à monter dans mon cas.

  7. #7
    Membre émérite
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Par défaut
    voilà ce que j'ai fais dans une sitation similaire :

    déclaration de ta liste de mots dans une var globale de type TStringList, plus une procédure pour remplir cette liste; ensuite pour tester si un mot fait partie de cette liste, tu fais encore une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var
      ListeMotsInterdits : TStringList;
     
    function IsMotInterdit(mot : string) : Boolean;
    begin
      IsMotInterdit := ListeMotsInterdits.IndexOf(mot) >= 0;
    end;

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 92
    Par défaut
    Denokan. Ta méthode est très bonne pour éviter les répétitions.

    Si je remplace ma partie de code par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for j := 0 to NbItemsDansMaliste - 1 do begin
        ds.Insert;
        dsCode.Value    := Maliste.Items[j] ;
        if ( IsMotInterdit(Maliste.Items.Strings[i])  then
           isCodeSpecifique := true;
        ds.Post;
    end
    cela ne risque pas d'être un peu long?? la méthode indexof de l'objet tstringlist fait elle un accès direct ou parcours t - elle la liste du début à la fin?? Ce qui reviendrai à faire 2 boucles.

    Merci d'avance.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 92
    Par défaut
    Dernière problème : Cas ou je dois traiter plusieurs code spécifiques.

    Je reviens un peu sur ce que j'ai dis avant. Je pensais créer une table pour chaque code spécifique: chacune des tables référencerait les codes qui valideraient ou invalideraient mon code spécif.

    Table1:code spécif 1
    Code
    Toto
    Tata

    Table2: code spécif 2
    Code
    Titi
    Tutu

    Le truc c'est que je pourrais éventuellement avoir une troisième table voire une 4e table sur le modèle des 2 autres. Ce qui est un peu lourd je pense.

    Sinon je pensai créer une table comme suit :
    Table: codes spécifiques
    Code Flag_code_spé1 Flag_code_spé2
    Toto 1 0
    Tata 1 0
    Titi 0 1
    Tutu 0 1

    Laquelle semble pour vous la meilleure solution?

    Merci d'avance.

  10. #10
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    la méthode indexof de l'objet tstringlist fait elle un accès direct 
    ou parcours t - elle la liste du début à la fin??
    Si on cherche des performances, la méthode IndexOf est à proscrire : il faut se créer son propre code qui parcoure la liste qui sera 10 fois plus performant.

    Ssi on gère plusieurs listes, il faut soit créer un objet qui hérite des Tstringlist avec sa méthode "IsMotInterdit" , soit passer la liste en paramètre de la fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function IsMotInterdit(mot : string;ListeMotsInterdits : TStringList) ...

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

Discussions similaires

  1. [Visuel XP] Petite question sur le theme XP...
    Par ZoumZoumMan dans le forum C++Builder
    Réponses: 12
    Dernier message: 20/01/2005, 15h41
  2. [CR8.5] petite question ..
    Par mcrocher dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 13/09/2004, 16h04
  3. Une petite question
    Par Etienne1 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 10/08/2004, 17h19
  4. [FOREIGN KEY] petite question bete ...
    Par dzincou dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 17h35
  5. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 14h49

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