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 :

TStringList avec = dans le name ne fonctionne pas


Sujet :

Langage Delphi

  1. #1
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut TStringList avec = dans le name ne fonctionne pas
    Bonjour tout le monde,

    voici un code qui fait buguer les fonctionalités de la classe TStringList.

    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
    procedure Test( Sender : TObject );
    var
      sl : TStringList;
      i : Integer;
    begin
      sl := TStringList.Create;
      sl.Values[ 'Toto' ] := 'Test';
      sl.Values[ 'Tata = Titi' ] := 'Mon second test';
     
      for i := 0 to sl.Count - 1 do
      begin
        ShowMessage( sl[ i ] );
        ShowMessage( sl.Names[ i ] );
        ShowMessage( sl.ValueFromIndex[ i ] );
        ShowMessage( sl.Values[ sl.Names[ i ] ] );
      end;
     
      sl.Free;
    end;
    Cela retrouver Tata comme nom et Titi = Mon second test comme valeur.
    Est-ce que vous avez déjà rencontré ce problème ?
    Quelle est la solution que vous préconisez ?

    Personnellement, je ne voudrais pas devoir modifier le code de Borland car c'est mettre le doigt dans un engrenage que je ne maitrise pas.

    Merci par avance.

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    Cela me semble être un comportement normal vu que ce qui sépare le nom de sa valeur est justement le signe "="

    TStringList ne gère pas des couples de valeurs mais de simples chaines de caractères.

    Tu as deux solutions :
    1) ne pas mettre de "=" dans le nom de clé
    2) ne pas utiliser TStringList

  3. #3
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Salut,

    pourtant la TStringList sait gérer les couples clé/valeur indépendament du fait qu'elle ne les stocke pas comme des couple mais comme un simple dans la liste, cf les "" rajoutés quand il y a des espaces dans les valeurs.
    Les méthodes Names, Values et ValueFromIndex fonctionnent bien même si on utilise des caractères utilisés en interne par la StringList (; , " ...) sauf le caractère =.
    Ils auraient pu gérer ce caractère comme les autres en délimitant le name par des ".
    En gros sl.values[ cle ] fonctionne dans tous les cas sauf si on utilise un = et ce n'est pas documenté, donc ça fait vraiment penser un oubli de leur part plus qu'à une caractéristique de fonctionnement de la StringList.

    Devoir ne pas utiliser d'= m'embête un peu car je dois interpréter ce que l'insère dans la StringList pour ensuite le réinterpréter quand je récupère ce qui est mis dans la StringList.

    Ne plus utiliser de StringList m'intéresse, mais ça me fait casser beaucoup de code existant et repartir avec du code neuf et ça m'embête aussi car ce n'est pas le genre de chose que j'aime faire entre 2 versions mineures de réparation de bug car on perd en stabilité globale de l'application.
    Tout ceci pour un simple problème d'égale dans un cas bien particulier.

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 435
    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 435
    Points : 5 848
    Points
    5 848
    Par défaut
    salut

    as tu essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      sl.Values[ '= Tata = Titi' ] := 'Mon second test';
    le problème étant que le Tstringlist décent du TString
    si tu regarde la méthode IndexOfName ou ExtractName tu
    t'aperçois clairement qu'il recherche le caractère "="

    @+ Phil

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Pour ma part j'essayerais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sl.Values[ 'Tata' ] := '"Titi = Mon second test"';

  6. #6
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Salut,

    non je n'avais pas essayé mais je viens de le faire et ça bugue comme l'exemple que j'avais mis plus haut.

    Si tu veux, je veux bien aussi essayer
    sl.Values[ 'Tata = Titi =' ] := 'Mon second test';
    Il y a des chances que ça bugue de la même façon.

    En fait, je n'ai pas compris ce que ce test apportait de plus.

    Pour cloturer ce sujet (car je me doute qu'il n'a pas vraiment bcp d'intérêts au final), je vais adopter la première solution dans un premier temps (remplacer = par une constante puis remplacer la constante par =) et adopter la seconde solution lors d'une phase de refactoring avant une belle période de bêta tests.

    ++

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Et avec ma méthode ?

  8. #8
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Je ne comprends pas où vous voulez en venir, je n'ai pas dû être clair dans mon premier message.

    En fait, j'ai donné un exemple de code qui met en avant un bug dans les fonctionnalités clé/valeur des stringlist, je n'utilise pas ce code tel quel dans l'application et les clés et valeurs sont définies dynamiquement suivant des noms définis par l'utilisateur (en l'occurence des noms de feuilles dans Excel) et l'utilisateur n'a pas de limite dans ces noms mises à part celles d'Excel.
    Il faut donc que je puisse travailler avec les clé/valeur sans bug et sans savoir à priori ce que valent les clés.
    Pour les valeurs, c'est bien géré lorsqu'il y a des caractères interprétés par la StringList, mais en ce qui concerne les clés, ce n'est pas le cas.

    PS : je travaille avec Delphi 7, peut-être que dans les nouvelles versions il y a eu des correctifs de fait, je ne sais pas.

  9. #9
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 290
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 290
    Points : 1 941
    Points
    1 941
    Par défaut
    Ce n'est pas une question de correctif.

    A chaque ligne ne correspond qu'une seule clef, si tu as plusieurs signes "=", il faut en choisir un qui détermine la clef. Celui qui est choisi est le premier. Sinon tu as plusieurs clés qui correspondent à la même ligne.

    Une autre façon de faire de serait de géréer deux TStringList, l'un ou l'on ajoute la clé et l'autre où l'on stocke la valeur (elle serait retrouvée grâce à IndexOf sur la première)

  10. #10
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 435
    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 435
    Points : 5 848
    Points
    5 848
    Par défaut
    salut

    rien ne t'empêche de derive un TStringList en modifiant les deux méthode que j'ai mentionnées (methode virtual)

    @+ Phil

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Et bien tel qu'est tournée ta phrase :

    Citation Envoyé par WebPac Voir le message
    Cela retrouver Tata comme nom et Titi = Mon second test comme valeur.
    Moi je comprend :
    clé : 'Tata'
    valeur : 'Titi = Mon second test'

    Maintenant au vu de ton dernier message ce serait plutôt :
    clé : 'Tata = Titi'
    valeur : 'Mon second test'

    Bon, j'ai testé et effectivement le nom de clé n'accepte pas d'avoir un =, dans ce cas soit tu fais comme tu as dis, soit tu joues avec la propriété NameValueSeparator en lui mettant autre chose que =.

  12. #12
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Citation Envoyé par Linkin Voir le message
    Ce n'est pas une question de correctif.

    A chaque ligne ne correspond qu'une seule clef, si tu as plusieurs signes "=", il faut en choisir un qui détermine la clef. Celui qui est choisi est le premier. Sinon tu as plusieurs clés qui correspondent à la même ligne.

    Une autre façon de faire de serait de géréer deux TStringList, l'un ou l'on ajoute la clé et l'autre où l'on stocke la valeur (elle serait retrouvée grâce à IndexOf sur la première)
    Je ne désire pas mettre plusieurs valeurs pour la même clé, je souhaite utiliser une clé qui est Toto = Titi.

    Citation Envoyé par anapurna Voir le message
    salut

    rien ne t'empêche de derive un TStringList en modifiant les deux méthode que j'ai mentionnées (methode virtual)

    @+ Phil
    Merci, en effet, c'est une idée, le problème est que la façon dont sont stockées les valeurs, il n'est plus possible de savoir si le premier égal fait parti de la clé où s'il est le séparateur clé/valeur.
    Il faudrait donc aussi surcharger les méthodes set et stocker les valeurs différement, par exemple en rajoutant des " pour délimiter les noms.

    Citation Envoyé par Aka Guymelef Voir le message
    Et bien tel qu'est tournée ta phrase :



    Moi je comprend :
    clé : 'Tata'
    valeur : 'Titi = Mon second test'

    Maintenant au vu de ton dernier message ce serait plutôt :
    clé : 'Tata = Titi'
    valeur : 'Mon second test'

    Bon, j'ai testé et effectivement le nom de clé n'accepte pas d'avoir un =, dans ce cas soit tu fais comme tu as dis, soit tu joues avec la propriété NameValueSeparator en lui mettant autre chose que =.
    En effet, mon premier message n'était pas explicite, j'otiens clé 'Tata' alors que je souhaite obtenir clé 'Tata = Titi'.

    Mais l'idée de changer le NameValueSeparator est une bonne idée, en plus, je connais quelques caractères qui ne peuvent pas être utilisés par le client. C'est la solution la plus légère, je vais faire ainsi.

    Merci.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/09/2014, 16h34
  2. Réponses: 2
    Dernier message: 25/02/2010, 13h49
  3. fonction onClick= dans IE6 ok Firefox fonctionne pas
    Par rejy_l'Édimestre dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 06/08/2007, 21h58
  4. padding dans un table ne fonctionne pas sur IE
    Par J0r_x dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 05/03/2007, 11h15
  5. Réponses: 3
    Dernier message: 26/01/2006, 13h11

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