Как уже говорилось, это не сработает, потому что запись размером с вариант добавляет несколько длин для StringStart/StringMiddle/StringEnd
в середине типа EntireString
.
Вы путаете *char
тип С с типом паскаль shortstring
.В позиции [0]
находится скрытый символ, длина которого shortstring
.
. Вы можете использовать обычный тип строки, а затем разделить его нарочно:
procedure StringSplit(const EntireString: string; out StringStart, StringMiddle, StringEnd: string);
begin
if length(EntireString)<>20 then
exit;
StringStart := copy(EntireString,1,8);
StringMiddle := copy(EntireString,9,4);
StringEnd := copy(EntireString,13,8);
end;
Обратите внимание, что *Тип параметра 1014 * установит все выходные переменные String * в '' перед вызовом функции.
В этой версии ожидается ввод всей строки длиной 20 символов.
Вы можете использовать короткие строки, но спользовательские типы точной длины, если вы хотите избежать скрытых копий от / до string[255]
(которые появляются, когда вы используете тип shortstring
и работаете с string[n]
с n <255): </p>
type
String20 = string[20];
String4 = string[4];
String8 = string[8];
procedure StringSplit(const EntireString: String20; out StringStart: String8;
out StringMiddle: String4; out StringEnd: String8);
begin
if length(EntireString)<>20 then
exit;
StringStart := copy(EntireString,1,8);
StringMiddle := copy(EntireString,9,4);
StringEnd := copy(EntireString,13,8);
end;