Les Chaînes de Caractères (STRING)

Traditionnellement, en Pascal, un STRING est une variable de 256 caractères (de 0 à 255) dont le premier contient le nombre de caractères utilisés. On peut alors, pour une chaine s:string, utiliser s[0] pour obtenir le nombre de caractères de la chaîne. Notez bien la différence entre l'occupation mémoire de la variable (256 octets) et le nombre de caractères utilisés (s[0]).

Delphi 2 introduit un nouveau type STRING (supportant jusque 2 Go - deux gigaoctets - de mémoire); l'ancien type de 256 caractères devient un SHORTSTRING.

La différence majeure entre STRING et SHORTSTRING et qu'un STRING ne possède pas d'élément 0.
  { modification de la longeur d'un SHORTSTRING }

  var
   s:shortstring;
   i:integer;
  begin
   s[0]:=#15; { le contenu n'est pas déterminé...}
   for i:=1 to 15 do s[i]:=chr(i);
  end;
  { modification de la longeur d'un STRING }
  var
   s:string;
   i:integer;
  begin
  SetLength(s,15); { le contenu n'est pas déterminé...} 
  for i:=1 to 15 do s[i]:=chr(i);
  end;
Notez que SetLength fonctionne pour les deux types de chaînes.

Concrètement, un STRING sous Delphi 2 (et au delà) est un pointeur sur une structure contenant trois informations
  1. La taille de la chaîne
  2. L'adresse mémoire contenant la chaîne
  3. Le nombre de variable l'utilisant
Les deux premières informations permettent à Delphi de gérer de façon transparente les affectations de chaînes; la troisième nécessite un peu plus d'explications. Delphi gérant tout seul l'allocation mémoire des chaînes, il conserve en interne un compteur indiquant si la chaîne est utilisée, et combien de fois elle l'est.
  { Mécanismes d'allocation des STRING }
  var

   s1,s2:string;
  begin
   s1:='Exemple de données'; { allocation d'une nouvelle chaîne dont le compteur passe à 1 }
   s2:=s1; { s2 et s1 pointent sur la même structure dont le compteur passe à 2 } 
   s2:=s2+' modifiées'; { allocation d'une nouvelle chaîne (compteur=1) pour une copie de s1/s2 dont le compteur repasse à 1 } 
   s1:=''; { désallocation de s1 car son compteur passe à 0 } 
  end; { désallocation automatique de s2 car son compteur passe à 0 } 
  

Notez que ces mécanismes d'allocation interdisent le passage de variable de type STRING vers ou depuis une DLL...sauf dans le cas de DLL écritent en Delphi qui utilisent toutes l'unité SHAREMEM; celle-ci permettant de partager entre le programme et les DLL une même gestion de la mémoire.

Les Chaînes à 0 terminal

Dans le mode C, les chaînes de caractères sont manipulées par un pointeur sur un caractère, et c'est le caractère nul (#0) qui indique la fin de la chaîne (il appartient au programmeur de gérer l'allocation mémoire).

Les API Windows qui manipulent des chaînes utilisent quasiment toute ce genre de chaînes; il sagit du type Pascal PChar

Delphi 2 propose en standard une compatibilité entre STRING et PChar.
  { transtypage d'un SHORTSRING en PCHAR }

  var
   s:shortstring;
   p:pchar;
  begin
   s:='Exemple de chaîne'; { chaîne pascal }
   s:=s+#0;   { ajout du 0 terminal }
   p:=@s[1];  { pointer sur le premier caractère  }

  end;
  { transtypage d'un STRING en PCHAR }
  var
   s:string;
   p:pchar;
  begin
   s:='Exemple de chaîne';  { chaîne pascal }

   p:=pchar(s); <{ Delphi se charge de tout ! }
  end;