2009-07-28 12 views
2

Existe-t-il un moyen d'obtenir des chaînes dans les enregistrements de plus de 255 caractères?Delphi: chaînes dans les enregistrements de plus de 255 caractères

EDIT:

J'ai quelque chose comme ce qui suit:

TQuery = Record 
    Action: string[255]; 
    Data: string; 
end; 

si je dis maintenant:

Test: TQuery; 
Test.Data := 'ABCDEFGHIJKLMN...up to 255...AISDJIOAS'; //Shall be 255 chars 

Il ne fonctionne pas et le compilateur se plaint ... Comment réparer ça?

Répondre

7

Si vous voulez pouvoir écrire votre enregistrement dans un fichier, vous pouvez définir votre chaîne comme un tableau d'ansichar par exemple. Vous pouvez le traiter comme une chaîne après.

Exemple:

program StrInRecTest; 
{$APPTYPE CONSOLE} 
uses SysUtils; 

type 
    TStringRec= 
    packed record 
     S:array[0..1023] of ansichar; 
    end; 

var 
    StringRec:TStringRec; 
    F:File of TStringRec; 
begin 
    StringRec.S := 'Hello'; 
    WriteLn(StringRec.S); 
    WriteLn('First char is:'+StringRec.S[0]); // watch out with this 


    // now let's try saving this to a file and reading it back... 

    // make a long string with x-es 
    FillChar(StringRec.S,Length(StringRec.S),'X'); 
    StringRec.S[High(StringRec.S)] := #0; // terminate the string 

    WriteLn(StringRec.S); 

    // write to a file 
    AssignFile(F,'tmp.txt'); 
    ReWrite(F); 
    Write(F,StringRec); 
    CloseFile(F); 

    WriteLn; 

    // read from file 
    AssignFile(F,'tmp.txt'); 
    Reset(F); 
    Read(F,StringRec); 
    CloseFile(F); 

    WriteLn(StringRec.S); // yay, we've got our long string back 

    ReadLn; 
end. 
+0

mis à jour ma question. – Acron

4

Normalement oui. Vous n'avez pas besoin de faire quelque chose de spécial tant que vous utilisez le type String normal (ou les autres types de chaînes longs) et non ShortString.

type 
    TMyRec = record 
    Value: string; 
    end; 

En pratique, cela dépend de ce que vous voulez faire avec l'enregistrement. Si vous voulez bloquer-écrire quelque chose dans un fichier ou de fournir l'enregistrement à une fonction DLL, vous devez passer à des réseaux char:

type 
    TMyRec = record 
    Value: array[0..1023] of Char; 
    end; 
+1

Je pense que ce sera un problème quand quelque chose comme « fichier d'enregistrement » entre en jeu. –

+0

Merci pour l'indice. J'ai mis à jour ma réponse. –

0

Si vous voulez dire, le stockage dans une base de données alors il est totalement dépendant de la base de données que vous utilisez. Plusieurs bases de données prennent en charge des chaînes d'une longueur maximale de 8 Ko; et SQL 2005 introduit varchar (MAX) qui a une limite de, i crois 2GB. MySql 5 semble être limité à environ 65K pour ce même type de données. Cependant, certains des plus anciens n'acceptent que [var] char (255).

Qu'essayez-vous de mettre dedans?

+0

je dis: "sélectionnez * des commandes" et récupérez une énorme chaîne. – Acron

+2

Ensuite, il semble que votre DB le supporte. Pouvez-vous définir le problème que vous avez un peu plus loin? Par exemple, recevez-vous un message d'erreur lorsque vous essayez de mettre à jour cet enregistrement? – NotMe

+0

"record" dans ce contexte est un Pascal [type structuré] (http://docwiki.embarcadero.com/RADStudio/Seattle/en/Structured_Types#Records_.28traditional.29), et n'a rien à voir avec les bases de données. (De la même manière, ma voiture et la Joconde n'ont rien à voir l'une avec l'autre, même si elles ont toutes deux de la peinture :) – DaveBoltman

1

Dans Delphi il existe différents types de chaîne:

  • ShortString - jusqu'à 255 Chars
  • AnsiString - jusqu'à 2^31 Chars
  • WideString - jusqu'à 2^31 WideChars

chaîne est normalement interprétée comme AnsiString. AnsiString & WideStrings est en fait un pointeur vers la mémoire où la chaîne est stockée. Le compilateur fait un peu de magie pour économiser des ressources. Donc, mettre une chaîne dans un enregistrement peut vous donner le résultat désiré, mais je suppose que l'opérateur sizeof sur l'enregistrement échouera.


Thx à Smasher pour le signaler: Ceci est cité dans l'aide de Delphi 2006. Différentes versions de Delphi peuvent se comporter différemment.

+4

SizeOf compte la longueur du pointeur. Vous avez besoin de la fonction Longueur pour obtenir la longueur d'une chaîne. –

+0

"string est normalement interprété comme AnsiString" - Ceci n'est pas vrai pour Delphi 2009, où String est interprété comme une chaîne unicode. – jpfollenius

4

Delphi et les trois chaînes

une fois, dans les premiers jours de pascals, là où des chaînes courtes. Ils consistaient en un bloc d'octets d'une taille maximale de 256.Le premier octet est l'octet de longueur:

5, H, e, l, l, o 

Vous pouvez définir des chaînes de longueur fixe pour économiser de la mémoire:

a: string[5]; 

Windows utilise des chaînes C, qui sont un pointeur sur un bloc de mémoire terminé par un caractère 0 . Ces chaînes ne sont pas limitées à 255 octets. D'abord ils ont été fournis comme PChar (pointeur vers char). Mais plus tard, la chaîne par défaut a été interprétée comme une chaîne de type C. Vous pouvez toujours utiliser des chaînes courtes:

a: string[22]; 
b: ShortString; 
c: string; // C (Delphi) string 

Avec Delphi 2009, Unicode a été introduit. Maintenant, chaque chaîne était une chaîne Unicode. Qui est un pointeur vers un morceau de mémoire contenant des caractères Unicode. Nous avons toujours le type ShortString. Les anciennes chaînes ansi pouvaient être accédées par AnsiString ou PAnsiChar.

Maintenant que les chaînes sont des pointeurs, il n'y a pas de limite à la taille. Mais les littéraux de chaîne sont toujours limités à 255 caractères.

+5

belle histoire! Avez-vous remarqué que le PO a spécifiquement posé des questions sur les "dossiers"? Vous n'avez pas utilisé ce mot! :-) – Argalatyr

Questions connexes