Delphi объявляет размер строки ANSI - PullRequest
3 голосов
/ 30 мая 2011

Теперь легко определить строку размером 3 (в старом коде delphi)

st:string[3];

Теперь мы хотим переместить код в ANSI

st:ansiString[3];

won 't работать!

и для расширенного типа oem

st:oemString[3]; 

та же проблема, где

type
  OemString = Type AnsiString(CP_OEMCP);

как можно объявить строку ANSI фиксированной длины и новый тип oem?

обновление: я знаю, что это создаст строку фиксированной длины.это часть разработки программного обеспечения для защиты от ошибок, и она необходима для программы.

Ответы [ 5 ]

5 голосов
/ 30 мая 2011

Вам не нужно определять размер AnsiString.

Обозначения

string[3] 

- для коротких строк, используемых Паскалем (и Delphi 1), и в основном он используется для устаревших целей.

Короткие строки могут быть длиной от 1 до 255 байт. Первый («скрытый») байт содержит длину.

AnsiString - указатель на символьный буфер (0 завершен). Он имеет некоторую внутреннюю магию, такую ​​как подсчет ссылок. И вы можете безопасно добавлять символы в существующую строку, потому что компилятор будет обрабатывать все неприятные детали для вас.

UnicodeStrings похожи на AnsiStrings, но с символами Unicode (в данном случае 2 байта). Строка по умолчанию сейчас (Delphi 2009) отображается в UnicodeString.

тип AnsiString имеет конструкцию для добавления кодовой страницы (используется для определения символов выше 127), следовательно, CP_OEMCP:

OemString = Type AnsiString(CP_OEMCP);
4 голосов
/ 30 мая 2011

«Короткие строки» - это строки «Ansi», потому что они доступны только для обратной совместимости кода перед Delphi.

       st: string[3];

всегда будет создавать «короткую строку» фиксированной длины с текущейКодовая страница Ansi / Char Set, начиная с Delphi 2009.

Но такие короткие строки НЕ совпадают с так называемыми AnsiString.Там нет кодовой страницы для коротких строк.Поскольку для коротких строк не существует подсчета ссылок.

Кодовая страница существует только для типа AnsiString, который имеет не фиксированную длину, а переменную длину и счетчик ссылок, так что это совершенно другой тип, чемкороткая строка, определяемая как string[...].

. Вы не можете просто смешивать объявления типов Short String и AnsiString в зависимости от конструкции.Оба называются «строками», но различаются по типам.

Вот отображение Short String

  st[0] = length(st)
  st[1] = 1st char (if any) in st
  st[2] = 2nd char (if any) in st
  st[3] = 3rd (if any) in st

Вот отображение памяти типа AnsiString или UnicodeString:

  st = nil   if st=''
  st = PAnsiChar if st<>''

и вот макет PSt: PAnsiChar:

  PWord(PSt-12)^ = code page
  PWord(PSt-10)^ = reference count
  PInteger(PSt-8)^  = reference count
  PInteger(PSt-4)^  = length(st) in AnsiChar or UnicodeChar count
  PAnsiChar(PSt) / PWideChar(PSt) = Ansi or Unicode text stored in st, finished by a #0 char (AnsiChar or UnicodeChar)

Так что если есть некоторые сходства между типами AnsiString и UnicodeString, тип short stringсовершенно разнообразен, и не может быть смешан, как вы хотели.

2 голосов
/ 30 мая 2011

Это было бы полезно, только когда String [3] в версиях Delphi для Unicode по умолчанию имеет значение 3 WideChars. Это меня удивит, но в случае, если это так, используйте:

st: array[1..3] of AnsiChar;
1 голос
/ 30 мая 2011

Но старый тип ShortString, новые типы строк в Delphi являются динамическими. Они растут и сжимаются по мере необходимости. Вы можете предварительно выделить строку заданной длины, вызвав SetLength (), что полезно, чтобы избежать перераспределения памяти, если вам нужно добавлять данные по частям в строку, в которой вы знаете конечную длину, так или иначе, но даже после этого строка может расти и увеличиваться. уменьшить при добавлении или удалении данных. Если вам нужны статические строки, вы можете использовать массив [0..n] символов, размер которого не будет изменяться динамически.

1 голос
/ 30 мая 2011

Размер ANISTring и UnicoDestring будет динамически расти. Компилятор и исполняемый код обрабатывают все эти вещи для вас.
Смотри: http://delphi.about.com/od/beginners/l/aa071800a.htm

Более подробное объяснение см .: http://www.codexterity.com/delphistrings.htm

Длина может быть от 1 символа до 2 ГБ.

...