问题一
我有
var example : array[0..15] of char;
Run Code Online (Sandbox Code Playgroud)
我想将输入值分配给该变量
example := inputbox('Enter Name', 'Name', '');
Run Code Online (Sandbox Code Playgroud)
在高分单元中,我有记录和数组
type
points = record
var
_MemoryName : array[0..15] of char;
_MemoryScore : integer;
end;
var
rank : array[1..3] of points;
Run Code Online (Sandbox Code Playgroud)
var s: string;
a: packed array[0..15] of char;
highscoresdata.position[1]._MemoryName := StrPLCopy(a, s, Length(a)) ;
Run Code Online (Sandbox Code Playgroud)
返回 - >(186): E2010 Incompatible types: 'array[0..15] of Char' and 'PWideChar'
var s: string;
a: packed array[0..15] of char;
s := InputBox('caption', 'Caption', 'Caption');
FillChar(a[0], length(a) * sizeof(char), #0);
Move(s[1], a[0], length(a) * sizeof(char));
scores.rank[1]._MemoryName := <<tried both s and a>> ;
Run Code Online (Sandbox Code Playgroud)
回报 (189): E2008 Incompatible types
问题一
有很多方法.一个是:
procedure TForm1.FormCreate(Sender: TObject);
var
s: string;
a: packed array[0..15] of char;
begin
s := InputBox(Caption, Caption, Caption);
assert(length(s) <= 16);
FillChar(a[0], length(a) * sizeof(char), #0);
Move(s[1], a[0], length(s) * sizeof(char));
end;
Run Code Online (Sandbox Code Playgroud)
但我怀疑,你的原始问题可能会有更优雅的解决方案.
问题二
每当您希望函数/过程没有特定的参数时,您应该意识到项目的设计可能存在问题.然而,Sender参数是多余的并不罕见,因为它们几乎无所不在,因为VCL的设计(特别是TNotifyEvent).如果您知道接收程序不关心Sender参数,只需给它任何东西,比如Self或nil.
问题三
考虑以下代码:
procedure TForm4.FormCreate(Sender: TObject);
var
a: packed array[0..15] of char;
b: packed array[0..15] of char;
begin
a := b;
end;
Run Code Online (Sandbox Code Playgroud)
这不起作用.你不能像字符串一样对待数组; 特别是,你不能像这样(a := b)分配静态数组.
相反,你必须做一些像......
Move(b[0], a[0], length(a) * sizeof(char));
Run Code Online (Sandbox Code Playgroud)
...或者只是一次循环并复制一个值.但是a := b如果声明一个静态数组类型,上面的简单赋值()确实有效:
type
TChrArr = packed array[0..15] of char;
procedure TForm4.FormCreate(Sender: TObject);
var
a: TChrArr;
b: TChrArr;
begin
b := a;
end;
Run Code Online (Sandbox Code Playgroud)