Delphi:记录中的字符串大于255个字符

时间:2009-07-28 14:07:20

标签: delphi string record

有没有办法在大于255个字符的记录中获取字符串?

修改

我有以下内容:

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

如果我现在说:

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

它不起作用,编译器抱怨......如何解决?

5 个答案:

答案 0 :(得分:7)

如果您希望能够将记录写入文件,则可以将字符串定义为ansichar数组。之后你可以像对待一个字符串一样对待它。

示例:

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.

答案 1 :(得分:5)

Delphi和三个字符串

曾几何时,在pascal的早期,那里有短弦。它们由一个字节块组成,最大大小为256.第一个字节是长度字节:

5, H, e, l, l, o

您可以定义固定长度的字符串以节省内存:

a: string[5];

Windows使用C字符串,它是指向以0字符结尾的内存块的指针。这些字符串不限于255个字节。首先,它们作为PChar(指向char的指针)提供。但后来默认字符串被解释为C类型字符串。你仍然可以使用短串:

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

使用Delphi 2009,引入了Unicode。现在每个字符串都是一个Unicode字符串。这是指向包含unicode字符的内存的指针。 我们仍然有ShortString类型。 AnsiString或PAnsiChar可以访问旧的ansi字符串。

现在字符串是指针,大小没有限制。但字符串文字仍然限制为255个字符。

答案 2 :(得分:4)

通常是的。只要使用普通的String类型(或其他长字符串类型)而不是ShortString,就不必做一些特殊的事情。

type
  TMyRec = record
    Value: string;
  end;

在实践中,这取决于你想对记录做什么。如果要阻止将某些内容写入文件或将记录提供给DLL函数,则必须切换到char数组:

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

答案 3 :(得分:1)

在Delphi中有不同类型的字符串:

  • ShortString - 最多255个字符
  • AnsiString - 最多2 ^ 31个字符
  • WideString - 最多2 ^ 31个WideChars

string通常被解释为AnsiString。 AnsiString& WideStrings实际上是指向存储字符串的内存的指针。编译器在那里做了一些魔术来节省资源。

因此将字符串放入记录可以得到所需的结果,但我想记录中的sizeof运算符将会失败。


Thx向Smasher指出这一点:这是引自Delphi 2006的帮助。不同的Delphi版本可能表现不同。

答案 4 :(得分:0)

如果您的意思是将其存储到数据库中,那么它完全依赖于您正在使用的数据库。一些数据库支持长度达8K的字符串;和SQL 2005引入了varchar(MAX),其限制为,i 相信 2GB。对于相同的数据类型,MySql 5似乎限制在大约65K。

但是,一些较旧的只允许[var] char(255)。

你想把它放进去什么?