Открытые строковые параметры могут описываться двумя способами:
Идентификатор OpenString описывается в модуле System. Он обозначает специальный строковый тип, который может использоваться только в описании строковых параметров. В целях обратной совместимости OpenString не является зарезервированным словом и может, таким образом, быть переопределен как идентификатор, заданный пользователем.
Когда обратная совместимость значения не имеет, для изменения смысла ключевого слова string можно использовать директиву компилятора {$P+}. В состоянии {$P+} переменная, описанная с ключевым словом string, является открытым строковым параметром.
Для открытого строкового параметра фактический параметр может быть переменной любого строкового типа. В процедуре или функции атрибут размера (максимальная длина) формального параметра будет тем же, что у фактического параметра.
Открытые строковые параметры ведут себя также как параметры-переменные строкового типа, только их нельзя передавать как обычные переменные другим процедурам или функциям. Однако, их можно снова передать как открытые строковые параметры.
В следующем примере параметр S процедуры AssignStr - это открытый строковый параметр:
procedure AssignStr(var S: OpenString);
begin
S := '0123456789ABCDEF';
end;
Так как S - это открытый строковый параметр, AssignStr можно передавать переменные любого строкового типа:
var | ||
S1: string[10]; S1: string[20]; |
||
begin | ||
AssignStr(S1); AssignStr(S2); |
{ S1 := '0123456789' }
{ S2 := '0123456789ABCDEF' } |
|
end; |
В AssingStr максимальная длина параметра S та же самая, что у фактического параметра. Таким образом, в первом вызове AssingStr при присваивании параметра S строка усекается, так как максимальная длина S1 равна 10.
При применении к открытому строковому параметру стандартная функция Low возвращает 0, стандартная функция High возвращает описанную максимальную длину фактического параметра, а функция SizeOf возвращает размер фактического параметра.
В следующем примере процедура FillString заполняет строку заданным символом до ее максимальной длины. Обратите внимание на использование функции High для получения максимальной длины открытого строкового параметра.
procedure FillStr(var S: OpenString;
Ch: Char); begin |
||
S[0] := Chr(High(S));
FillChar(S[1], High(S), Ch); |
{ задает длину строки } { устанавливает число символов } |
|
end; |
Значения и параметры-константы, описанные с использованием идентификатора OpenString или ключевого слова string в состоянии {$P+}, не являются открытыми строковыми параметрами. Они ведут себя также, как если бы были описаны с максимальной длиной строкового типа 255, а функция Hingh для таких параметров всегда возвращает 255.