(Re-)Bonjour,
Je voudrais simplement savoir comment mon TEdit.text ou encore mon TLabel.Text puisse prendre un ShortString plutot que du String ?
Mon erreur :
Je vous remercie d'avance,
Bonne soirée,
(Re-)Bonjour,
Je voudrais simplement savoir comment mon TEdit.text ou encore mon TLabel.Text puisse prendre un ShortString plutot que du String ?
Mon erreur :
Je vous remercie d'avance,
Bonne soirée,
Bonjour !
J'ai un peu de mal à saisir le sens de la question. Le titre fantaisiste de la discussion ne nous aide pas beaucoup non plus.
Je suggère que tu postes les lignes de code qui sont à l'origine de l'avertissement.
Mon site personnel consacré à MSEide+MSEgui : msegui.net
Ce n'est pas possible
Un ShortString est un type obsolète qui correspond soit à de l'ASCII, soit à un code page/ MBCS
Un String, c'est de l'UTF-16.
Il faut convertir ta chaîne de caractères en UTF-16. Je ne connais pas l'API Delphi pour cela
Ou éventuellement dans les options de ton projet, caster _TChar (*) en char et non pas en wchar_t.
Et la meilleure de toutes, c'est de refactoriser ton code en n'utilisant que des UnicodeString.
* -> Avec Xe, l'option s'appelle "_TChar maps to"
Salut,
J'étais dans la précipitation pour écrire mon message ce jour là, c'est pourquoi pas tout très explicite. En gros je voulais mettre un ShortString dans un text de TLabel (qui demande du String).
Mais du coup, foetus à parfaitement répondu à ma demande. Je t'en remercie.
Mais par contre String n'est qu'un alias d'UnicodeString à a connaissance, donc qu'est-ce que ça changerais de changer mes String en UnicodeString ?
Merci, bonne journée.
Ça, c'est possible :
Mais l'avertissement que tu as reproduit dans ton premier message correspond à une tentative de conversion dans le sens inverse.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 var s: shortstring; begin s := 'Martin'; Label1.Caption := string(s); end;
C'est dans ce sens-là qu'il y une "perte de données potentielle".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 var s: shortstring; begin s := Label1.Caption; end;
Mon site personnel consacré à MSEide+MSEgui : msegui.net
Merci pour ta réponse,
Bon, en fin de compte c'est pas bien utile de caster du ShortString vers du String. Je ne vais pas gagner de mémoire ? Vu que je vais revenir en String dans tout les cas.
Oui, fuite de mémoire possible, mais dans mon cas impossible vu que je gère que mes textes ne fassent pas plus de 255 caractères, donc sa passe pile.
Il ne s'agit pas d'une fuite de mémoire mais d'une perte de données, ce qui est différent. Et la longueur de tes textes n'est pas le problème. Le problème, c'est qu'un caractère d'une chaîne de type string peut contenir plus de choses qu'un caractère d'une chaîne de type shortstring.
Mon site personnel consacré à MSEide+MSEgui : msegui.net
Le premier truc le plus embêtant, c'est que l'UTF-16 n'est pas compatible ASCII
Une chaîne ASCII comme "Bonjour" va donner en UTF-16 "B\0o\0n\0j\0o\0u\0r\0" (<- en gros)
Donc tu vois bien que
- Si tu mets de l'UTF-16 dans une chaîne ASCII, tu n'auras [en apparence] que la première lettre
- Si tu mets de l'ASCII dans une chaîne UTF-16, tu auras n'importe quoi "Bo" + "nj" + "ou" + "r\0"
Édit: Dans l'exemple ci-dessous de Roland Chastain avec de l'ASCII cela fonctionne parce qu'il doit y avoir une moulinette dans l'opérateur d'affectation et/ ou les constructeurs [en fonction des types] pour ajouter/ supprimer les '\0' nécessaires pour avoir 1 octet dans 2 octets
Édit: Comme l'a indiqué Andnotor, si on renseigne le code page, alors la conversion a de grande chance d'être sans perte puisque les moulinettes ont tous les renseignements.
J'ai essayé de faire un petit exemple qui mette en évidence le problème.
L'idée est de transtyper une chaîne de type string en une chaîne de type shortstring, puis de faire un transtypage en sens inverse pour voir si des données ont été perdues en cours de route. Avec une lettre de l'alphabet latin, on constate qu'aucune donnée n'est perdue : à la limite on pourrait ignorer l'avertissement. En revanche, avec une lettre de l'alphabet grec, les données sont bel et bien perdues. Le caractère grec ne "rentre" pas dans la chaîne de type shortstring.
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 program DataLoss; {$APPTYPE CONSOLE} var s: string; ss: shortstring; begin SetLength(s, 1); // Exemple de transtypage sans perte de données : s[1] := #$0041; // LATIN CAPITAL LETTER A ss := s; // W1058 WriteLn(string(ss) = s); // TRUE // Exemple de transtypage avec perte de données : s[1] := #$0391; // GREEK CAPITAL LETTER ALPHA ss := s; // W1058 WriteLn(string(ss) = s); // FALSE ReadLn; end.
Mon site personnel consacré à MSEide+MSEgui : msegui.net
La conversion est implicite, le compilateur se débrouille très bien à ce niveau. Les problèmes surviennent lorsqu'un buffer est rempli manuellement ou qu'un mauvais type a été utilisé dès le départ (ex. définir un paramètre d'une procédure exportée d'une DLL en ansistring plutôt que widestring).
Parlons également d'ANSI et non d'ASCII.
Simplement parce que le Code Page n'est pas bon, la partie étendue de la table ANSI (128 à 255) n'est pas correctement mappée
Essaye ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 type GreekString = type AnsiString(1253); var s1 :string; s2 :GreekString; begin s1 := #$03A9; //Omega s2 := s1; //s2 contient bien Omega Label1.Caption := s2; //Retour en UnicodeString end;
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager