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 :

Question de TSTringList


Sujet :

Delphi

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut Question de TSTringList
    Bonsoir à tous

    J'ai cherché, mais rien trouvé. Le TStringList est-il une liste de chaînes de type string (short) ou existe-t-il un type de TStringList de WideString? i non, il me faut passer par une TList ?

    Merci

  2. #2
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 763
    Points : 959
    Points
    959
    Par défaut
    Depuis que Delphi est Unicode TStringList est donc Unicode.

  3. #3
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Depuis que Delphi est Unicode TStringList est donc Unicode.
    petite précision qui a son importance:
    Il est UNICODE, Oui
    Mais seulement depuis la version Delphi 2009

    Cordialement,
    @+

  4. #4
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut
    Donc, selon ce que j'ai lu sur unicode, une TStringList liste des chaînes WideString. C'est bien ça ?

  5. #5
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Citation Envoyé par bvsud Voir le message
    Donc, selon ce que j'ai lu sur unicode, une TStringList liste des chaînes WideString. C'est bien ça ?
    oui mais c'est totalement transparent pour toi.

    pour t'en rendre compte tu peux tester ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    uses SysUtils;
    ...
    var
     Pc: PChar;
     S: string;
    begin
      S:= 'Essai';
      Pc := SysUtils.StrAlloc(Length(S));
      ShowMessageFmt('Taille de %s = %d caractère(s)'+#13+
                     'Taille réelle = %d', [S, Length(S), SysUtils.StrBufSize(Pc)]);
      SysUtils.StrDispose(Pc);
    end;
    ...
    Si ta version est UNICODE la taille réelle sera de 10 (2 fois le nombre de caractères)
    et ensuite tu changes PC: PChar en Pc: PAnsiChar pour voir la différence.

    tout comme:
    SizeOf(Char) == 1 jusqu'à D2007
    et
    SizeOf(Char) == 2 depuis D2009

    Plus globalement
    jusqu'à D2007
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string == AnsiString
    Char == AnsiChar;
    PChar == PAnsiString;
    et depuis D2009
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string == WideString
    Char == WideChar;
    PChar == PWideString;
    Cordialement,
    @+

  6. #6
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut
    Bonjour, et merci

    Cela répond à ma question... sans régler mon problème. Mais je sais à présent qu'il n'a rien à voir avec la longueur des chaînes dans un TSTringList.

    J'utilise beaucoup le composant JvSerachFiles des Jedi. Et même plusieurs treads. L'un de mes progs qui l'appelle plante aléatoirement. Et uniquement sur le PC-1, la "grande" tour. Pas sur le portable, dont la partition de sauvegarde (sur port USB) ne compte pas la même quantité de répertoires. 32 Go RAM sur le PC-1 : ce n'est pas une saturation de la mémoire. Ce doit être la longueur elle-même des path qui excèdent certaines limites.

    J'ai donc bien des TStringList de WideString. Donc, ça ne vient pas de là.

    Merci

  7. #7
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Petite correction, le TStringLIst n'est pas forcément en Unicode, il peut être an AnsiString.

  8. #8
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut
    Bonjour, Alweber.
    Ca change quelque chose à la longueur des string ?

  9. #9
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Citation Envoyé par ALWEBER
    Petite correction, le TStringLIst n'est pas forcément en Unicode, il peut être an AnsiString.
    Alors oui on peut y ajouter des chaines de type AnsiString mais elles seront implicitement tanstypées en string donc en UNICODE
    sur une instruction du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        aStringList.Add(AnsiString(s));
    le compilateur prévient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [DCC Avertissement] Unit1.pas(249): W1057 Transtypage de chaîne implicite de 'AnsiString' en 'string'
    Citation Envoyé par bvsud Voir le message
    Bonjour, Alweber.
    Ca change quelque chose à la longueur des string ?
    ça ne change absolument rien !!
    La chaine : 'Essai' vaut 5 en UNICODE comme en Ainsi
    mais en mémoire elle occupera le double dans un environnement UNICODE

    Cordialement,
    @+

  10. #10
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 763
    Points : 959
    Points
    959
    Par défaut
    Citation Envoyé par Cirec Voir le message
    petite précision qui a son importance:
    Il est UNICODE, Oui
    Mais seulement depuis la version Delphi 2009

    Cordialement,
    @+
    C'est bien ce que je disait en intégrant dans ma phrase le mot : depuis….

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    String est un alias pour UnicodeString et non WideString (et PChar, PWideChar)

    Le type UnicodeString (à l'instar de AnsiString) contient une entête située à PChar -12 dont l'élément principal est le compteur de référence.
    En mémoire, "Essai" en ANSI prendra donc 12 +5 +1 (ne pas oublier le 0 terminal) = 18 octets et en Unicode 12 +10 +2 = 24 (on pourrait encore ajouter la variable de type string elle-même, un pointeur)

    Et sauf erreur au début de Delphi-Unicode, l'UnicodeString était un type susceptible de contenir une chaîne ANSI ou Unicode. D'où les éléments CodePage et ElemSize dans l'entête (ça a été abandonné depuis).

  12. #12
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Je rectifie il y a bien conversion en Unicode dans le TStringList depuis un certain nombre de versions de Delphi.
    Lors du saveToFile il régénère s'il y a lieu de l'ANSIString mais qui n'est pas forcément identique au fichier chargé.
    En complément :

    Voici un jeu de test avec du cyrillique
    ABCD
    ЁЂЃЄ
    EFGH
    ЅІЇЈ

    Flux initial :
    EF BB BF // entete indication UTF8
    41 42 43 44 0D 0A // ligne ansi
    D0 81 D0 82 D0 83 D0 84 0D 0A // ligne cyrillique
    45 46 47 48 0D 0A // ligne ansi
    D0 85 D0 86 D0 87 D0 88 0D 0A // ligne cyrillique

    Une fois chargé dans le TStringlist chaque ligne est en format unicodeString
    Les caractères en Ansi UTF8 codé sur un octet dans le fichier sont convertis en unicodeString
    Les caractères en cyrillique UTF8 "Little Indian" dans le fichier sont convertis dans un autre format UTF 16
    D0 81 => 01 04
    D0 82 => 02 04 et ainsi de suite

    Voici les 4 lignes du stringList - Les huits premiers octets de chaque ligne donnent des informations sur le contenu de la ligne
    01 00 00 00 04 00 00 00 41 00 42 00 43 00 44 00
    01 00 00 00 04 00 00 00 01 04 02 04 03 04 04 04
    01 00 00 00 04 00 00 00 45 00 46 00 47 00 48 00
    01 00 00 00 04 00 00 00 05 04 06 04 07 04 08 04

    Fonctions utilisées pour visualiser :
    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
     
     
    function VisuXOctets(pDepart : pointer; nbOctet : integer = 64 ): string;
    var
      pb1: ^byte;
      i1, i2 : integer ;
      st1 : string ;
    begin
      result := '' ;
      pb1 := pDepart ;
      for i1 := 1 to (nbOctet div 8) do
      begin
        st1 := '';
        for i2 := 1 to 8 do
        begin
          st1 := st1 + ' ' + intToHex(pb1^, 2);
          inc(pb1);
        end;
        result := result + st1 + #13#10
      end;
    end;
     
    function Visu(stTitre: string; p1: pointer; decalage: integer): string;
    var
      pb1: ^byte;
    begin
      pb1 := pointer(integer(p1) + decalage);
      result := '-- ' + stTitre + ' --' + #13#10 + VisuXOctets(pb1, 24);
    end;
    Appel de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Visu('dans TStringlist :', @sl1[0][1], -8);
    Ce qui veut dire voir à partir du 8ème octet précédant le premier caractère du premier élément de la liste

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/08/2002, 21h27
  2. Divers questions
    Par Freakazoid dans le forum DirectX
    Réponses: 2
    Dernier message: 06/08/2002, 21h57
  3. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11
  4. Question de faisabilité
    Par lisarasu dans le forum CORBA
    Réponses: 3
    Dernier message: 14/05/2002, 11h26
  5. [HyperFile] 2 questions de débutant
    Par khan dans le forum HyperFileSQL
    Réponses: 2
    Dernier message: 29/04/2002, 23h18

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