Je suis depuis peu sous Delphi XE...et je reprend du code Delphi 6

alors rapidement j'ai ajouté ceci dans mon code

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
type
{$IFNDEF UNICODE}
  RawByteString  = string;
{$ENDIF}
sous D6 j'utilisais beaucoup les strings comme buffer de données binaires. C'est en effet très pratique de manipuler des buffers avec Pos(), + Insert(), Delete() etc...

sauf que le type string sous D2009+ est un UnicodeString...il faut donc remplacer string par RawByteString et ajouter ce type pour les version de Delphi non-unicode.

ça c'est pour le binaire...maintenant les string

dans une appli je teste qu'une chaîne comprend au moins x caractères, sinon je lui ajoute les espaces manquants

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
var
  cLen : Integer;
begin
  cLen := Length(cStr);
  if cLen < x then
  begin
    SetLength(cStr, x);
    FillChar(cStr[cLen + 1], x - cLen, ' ');
  end;
end;
ça compile sans problème, mais à l'exécution on se retrouve avec un chaîne tordue qui contient des caractères Wide $4040 !

en version Unicode on aura
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
     {$IFDEF UNICODE}
      cStr := cStr + StringOfChar(' ', x - cLen);
     {$ELSE}
      SetLength(cStr, x);
      FillChar(cStr[cLen + 1], x - cLen, ' ');
     {$ENDIF}
je trouve cela d'autant plus vicieux que FillChar se nomme bien FillChar et non FillMem ou FillByte...alors que tout ce qui était Char avant devient WideChar en unicode : Char, Chr(), PChar...maintenant FillChar n'est pas toujours utilisé sur des string...donc le forcer en Wide aurait posé bien d'autres problèmes