web-dev-qa-db-fra.com

comment les littéraux delphi 'string' peuvent-ils être plus de 255?

je travaille sur delphi 7 et je travaillais sur une chaîne, je suis tombé sur ce

Pour une chaîne de longueur par défaut, c'est-à-dire déclarée simplement sous forme de chaîne, la taille maximale est toujours 255. Une chaîne courte n'est jamais autorisée à atteindre plus de 255 caractères.

sur chaînes delphi

une fois que je devais faire quelque chose comme ça dans mon code delphi (c'était pour une très grosse requête)

  var
    sMyStringOF256characters : string;
    ilength : integer;
    begin
       sMyStringOF256characters:='ThisStringisofLength256,ThisStringisofLength256,.....'
       //length of sMyStringOF256characters is 256
    end;

je reçois cette erreur

[Erreur] u_home.pas (38): les littéraux de chaîne peuvent avoir au maximum 255 éléments.

mais quand j'essaye

    var
      iCounter              : integer;
      myExtremlyLongString  : string;
   begin
      myExtremlyLongString:='';
      Label1.Caption:='';
      for iCounter:=0 to 2500 do
         begin
            myExtremlyLongString:=myExtremlyLongString+inttostr(iCounter);
            Label1.Caption:=myExtremlyLongString;
         end;
         Label2.Caption:=inttostr(length(myExtremlyLongString));
   end; 

et le résultat est

enter image description here

Comme vous pouvez le voir, la longueur de myExtremlyLongString est de 8894 caractères.

pourquoi delphi n'a-t-il pas donné d'erreur indiquant que la longueur est supérieure à 255 pour myExtremlyLongString ?

[~ # ~] modifier [~ # ~] j'ai utilisé

SetLength(sMyStringOF256characters,300);

mais ça ne marche pas.

25
PresleyDias

pourquoi delphi n'a-t-il pas donné d'erreur en disant que la longueur est au-delà de 255 pour myExtremlyLongString?

Vous avez votre réponse un peu plus bas dans le texte de la section Long String (AnsiString).

Dans les versions actuelles de Delphi, le type de chaîne est simplement un alias pour AnsiString,

Ainsi, la chaîne n'est pas limitée à 255 caractères, mais un littéral de chaîne l'est. Cela signifie que vous pouvez créer une chaîne de plus de 255 caractères, mais vous ne pouvez pas avoir une valeur de chaîne dans le code qui dépasse 255 caractères. Vous devez les diviser si vous le souhaitez.

sMyString:='ThisStringisofLength255'+'ThisStringisofLength255';
35
Mikael Eriksson

Divisez-le en:

sMyStringOF256characters := 
  'ThisStringis' +
  'ofLength256' +
  'And ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'ManyManyManyManyManyManyManyManyManyManyManyManyMany' + 
  'CharactersCharactersCharactersCharactersCharactersCharactersCharactersCharacters';
9
Arjen van der Spek

À l'époque ancienne DOS/Turbo Pascal, les "chaînes" étaient en effet limitées à 255 caractères. En grande partie parce que le 1er octet contenait la longueur de chaîne et qu'un octet ne peut avoir qu'une valeur comprise entre 0 et 255.

Ce n'est plus un problème dans les versions contemporaines de Delphi.

"ShortString" est le type de l'ancien type de chaîne DOS/Pascal.

"LongString" est depuis longtemps le type de chaîne par défaut (y compris le Borland Delphi 2006 que j'utilise actuellement pour la plupart des travaux de production). Les LongStrings (alias "AnsiStrings") contiennent des caractères 8 bits et ne sont limités que par la mémoire disponible.

Les versions récentes de Delphi (Delphi 2009 et versions supérieures, y compris le nouveau Delphi XE2) utilisent désormais par défaut des chaînes Unicode "WideString" multi-octets. Les WideStrings, comme AnsiStrings, sont également effectivement "illimités" en longueur maximale.

Cet article explique plus en détail:

http://delphi.about.com/od/beginners/l/aa071800a.htm

4
paulsm4

La différence est que dans votre premier exemple de code, vous mettez la chaîne dans votre code - chaîne littérale. Cela a une limitation sur le nombre de caractères autorisés.

Dans votre deuxième exemple de code, vous le générez dynamiquement et ne le placez pas comme une grande chaîne littérale.

Le type de chaîne dans Delphi (contrairement aux raccourcis qui ne peuvent aller que jusqu'à 255) peut être aussi grand que votre mémoire.

2
Nethy

Vous pouvez essayer d'utiliser la classe StringBuilder:

procedure TestStringBuilder;
var
    I: Integer;
    StringBuilder: TStringBuilder;
begin
    StringBuilder := TStringBuilder.Create;
    try
        for I := 1 to 10 do
        begin
            StringBuilder.Append('a string ');
            StringBuilder.Append(66); //add an integer
            StringBuilder.Append(sLineBreak); //add new line
        end;

        OutputWriteLine('Final string builder length: ' + IntToStr(StringBuilder.Length));
    finally
        StringBuilder.Free;
    end;
end;
1
Cameron M

Si vous avez besoin d'une chaîne vraiment longue dans Delphi, vous pouvez la charger à partir d'autres ressources comme des fichiers txt ou simplement du texte brut avec n'importe quelle extension. Je l'utilise et cela fonctionne. Vous pouvez créer des tableaux "similaires à" en utilisant des numéros de lignes en texte brut. Dans le code delphi, vous pouvez faire comme @arjen van der Spek et d'autres disent seulement.

Pour moi, les fichiers avec du texte sous forme de var -

sometext:string=
'txt...'+
'txt...'+
'txt...';

sont mauvais pour l'édition future.

avantages: vous pouvez utiliser n'importe quel texte long.

inconvénients: le code texte est ouvert, tout le monde peut le lire en ouvrant le fichier dans le bloc-notes, etc.

0
Dudeist