Delphi: archi in Records più grande di 255 caratteri
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?
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?