Дельфи:Строки в записях длиной более 255 символов.

StackOverflow https://stackoverflow.com/questions/1194339

  •  19-09-2019
  •  | 
  •  

Вопрос

Есть ли способ получить строки в записях размером более 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).

Что ты пытаешься вставить?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top