Дельфи:Строки в записях длиной более 255 символов.
Вопрос
Есть ли способ получить строки в записях размером более 255 символов?
РЕДАКТИРОВАТЬ:
У меня есть что-то вроде следующего:
TQuery = Record
Action: string[255];
Data: string;
end;
если я сейчас скажу:
Test: TQuery;
Test.Data := 'ABCDEFGHIJKLMN...up to 255...AISDJIOAS'; //Shall be 255 chars
Это не работает, и компилятор жалуется...Как это исправить?
Решение
Если вы хотите иметь возможность записывать свою запись в файл, вы можете определить свою строку, например, как массив 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.
Другие советы
Delphi и три струны
Когда-то, на заре Паскаля, были короткие строки.Они состояли из блока байтов с максимальным размером 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.Это указатель на часть памяти, содержащую символы Юникода.У нас все еще есть тип ShortString.Доступ к старым строкам ansi можно было получить с помощью AnsiString или PAnsiChar.
Теперь, когда строки являются указателями, ограничений на размер нет.Но строковые литералы по-прежнему ограничены 255 символами.
Обычно да.Вам не нужно делать что-то особенное, если вы используете обычный тип String (или другие типы длинных строк), а не ShortString.
type
TMyRec = record
Value: string;
end;
На практике это зависит от того, что вы хотите делать с записью.Если вы хотите блокировать запись чего-либо в файл или предоставить запись функции DLL, вам придется переключиться на массивы символов:
type
TMyRec = record
Value: array[0..1023] of Char;
end;
В Delphi существуют разные типы строк:
- ShortString — до 255 символов.
- AnsiString — до 2^31 символов
- WideString — до 2^31 WideChars
строка обычно интерпретируется как AnsiString.AnsiString и WideStrings на самом деле являются указателями на память, в которой хранится строка.Компилятор творит чудеса, чтобы сэкономить ресурсы.
Таким образом, помещение строки в запись может дать вам желаемый результат, но я предполагаю, что оператор sizeof для записи потерпит неудачу.
Спасибо Smasher за указание на это:Это цитируется из справки Delphi 2006.Различные версии Delphi могут вести себя по-разному.
Если вы имеете в виду сохранение его в базе данных, то это полностью зависит от базы данных, которую вы используете.Некоторые базы данных поддерживают строки длиной до 8 КБ;и SQL 2005 представил varchar(MAX), который имеет предел, i полагать 2 ГБ.MySql 5, похоже, ограничен примерно 65 КБ для того же типа данных.
Однако некоторые из старых версий допускают только [var]char(255).
Что ты пытаешься вставить?