Domanda

C'è un modo per ottenere le stringhe nei record più grandi di 255 caratteri?

Modifica

ho qualcosa di simile al seguente:

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

se ora dico:

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

Non funziona e il compilatore si lamenta ... Come risolvere questo?

È stato utile?

Soluzione

Se si vuole essere in grado di scrivere il tuo record in un file, è possibile definire la stringa come una matrice di ANSIChar per esempio. È possibile trattarlo come una stringa in seguito.

Esempio:

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.

Altri suggerimenti

Delphi e le tre corde

Una volta, nei primi giorni di Pascal, là dove brevi stringhe. Essi sono costituiti da un blocco di byte con una dimensione massima di 256. Il primo byte è il byte di lunghezza:

5, H, e, l, l, o

Si potrebbe definire le stringhe di lunghezza fissa per risparmiare memoria:

a: string[5];

Windows utilizza stringhe C, che sono un puntatore a un blocco di memoria terminato con un carattere 0. Queste stringhe dove non limitati a 255 byte. Prima hanno ove previsto come PChar (puntatore a char). Ma più tardi la stringa di default è stato interpretato come una stringa di tipo C. È comunque possibile utilizzare shortstrings:

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

Con Delphi 2009, Unicode è stato introdotto. Ora ogni stringa è una stringa Unicode. Che è un puntatore a un pezzo di memoria che contiene caratteri Unicode. Abbiamo ancora il tipo ShortString. Le vecchie stringhe ANSI potrebbero essere accessibili da AnsiString o PAnsiChar.

Ora che le stringhe sono puntatori, non v'è alcun limite alla dimensione. Ma stringhe letterali sono ancora limitati a 255 caratteri.

In genere sì. Non è necessario fare qualcosa di speciale fino a quando si utilizza il tipo normale stringa (o gli altri tipi di lungo arco) e non ShortString.

type
  TMyRec = record
    Value: string;
  end;

In pratica dipende da cosa si vuole fare con il record. Se si desidera bloccare-scrivere qualcosa in un file o fornire il record a una funzione DLL, si deve passare ad array char:

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

In Delphi ci sono diversi tipi di stringhe:

  • ShortString - fino a 255 caratteri
  • AnsiString - fino a 2 ^ 31 Caratteri
  • WideString - fino a 2 ^ 31 WideChars

stringa viene normalmente interpretato come AnsiString. AnsiString & WideStrings sono in realtà puntatore alla memoria in cui è memorizzata la stringa. Il compilatore non qualche magia lì per risparmiare risorse.

Quindi, mettendo una stringa in un record può dare il risultato desiderato, ma credo che l'operatore sizeof sul record fallirà.


Ringraziamo Smasher per la precisazione: Questo è citato da Delphi 2006 aiuto. Diverse versioni di Delphi possono comportarsi in modo diverso.

Se vuoi dire, la memorizzazione in un database, allora è completamente dipendente dal database in uso. Più stringhe di supporto database fino a 8K di lunghezza; e SQL 2005 ha introdotto varchar (MAX), che ha un limite di, i credo 2GB. MySql 5 sembra essere limitata a circa 65K per quello stesso tipo di dati.

Tuttavia, alcuni tra i più grandi permettono solo [var] char (255).

Che cosa stai cercando di metterla in?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top