pchars in a record need a known length. pchars are - obviously - pointers, so if you try to use them without allocated memory it goes BOOM.
Shortstrings are part of the record itself, but need to be declared with a fixed length. example;
type
TRecord1 = record
s:string[255]
end;
TRecord2 = record
s:PChar;
end;
var
a:TRecord1;
b:TRecord2;
begin
a.s:='this is a shortstring';
b.s:='this is a pchar';
writeln(SizeOf(a));
writeln(SizeOf(b));
end.
In the first record, the content of the string is included in the record, in the second only the pointer is part of the record, not any content, iow an indirection.
The difference is very important. If you store the first record to disk you can read it back and the content will be the same. If you write the second to disk and read it back the content is lost.
i