我在看Delphi:Char和TCharArray数组"不兼容的类型"并开始尝试.我发现的很有趣.
procedure Clear(AArray: array of Integer);
var
I: Integer;
begin
for I := Low(AArray) to High(AArray) do
AArray[I] := 0;
end;
var
MyArray: array of Integer;
begin
Clear(MyArray);
end.
Run Code Online (Sandbox Code Playgroud)
这个简单的小例子展示了如何使用Open Array参数将动态数组传递给过程.它编译和运行完全符合预期.
procedure Clear(AArray: array of Char);
var
I: Integer;
begin
for I := Low(AArray) to High(AArray) do
AArray[I] := #0;
end;
var
MyArray: array of Char;
begin
Clear(MyArray);
end.
Run Code Online (Sandbox Code Playgroud)
这是几乎完全相同的代码唯一的区别是它使用的是数组Char而不是Integer.它不编译.相反,编译器吐出:
E2010 Incompatible types: 'Array' and 'Dynamic array'
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
在搜索了一段时间后,我发现了这个 QC报告.我正在运行Delphi 2009,它仍然在发生.
使用Delphi XE-2(应用所有更新).
我希望以下代码在DoSomething和DoInteger调用上生成编译错误,但事实并非如此.
program OpenArrayQuestion;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
type
IComposite = interface(IInterface)
['{1AC3CF6A-1316-4838-B67B-9FB075585C1E}']
end;
IComposite<T: IComposite> = interface(IComposite)
['{7F866990-9973-4F8E-9C1F-EF93EF86E8F2}']
end;
function DoSomething(const aData: array of IComposite): Boolean;
begin
Result := True;
end;
function DoInteger(const aData: array of Integer): boolean;
begin
Result := True;
end;
var
FData: IComposite;
FInteger: Integer;
begin
DoSomething(FData);
DoInteger(FInteger);
end.
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么我可以将FData/FInteger(只是单个变量)传递给它们各自类型的开放数组参数而不将它放在它之间[]并且没有编译器将它直接反馈给我吗?
我认为它可能与接口数组,甚至涉及的泛型有关,但编译器接受传递给整数的开放数组的整数.
(我已经在CodeReview上询问了这个问题,因为它已经关闭了主题.希望这是关于主题的.)
我有一个派生类型的静态数组(如LabelsA: array[0..3] of TLabel;下面的示例代码)和一个接受基类型的开放数组的例程(如procedure DoSomethingWithControls(const AControls: array of TControl);),我想DoSomethingWithControls用这些静态数组调用.请看我的样本:
procedure DoSomethingWithControls(const AControls: array of TControl);
var
i: Integer;
begin
for i := Low(AControls) to High(AControls) do
Writeln(AControls[i].Name);
end;
procedure Test;
var
LabelsA: array[0..3] of TLabel;
LabelsB: array[0..1] of TLabel;
procedure Variant1;
type
TArray1 = array[Low(LabelsA)..High(LabelsA)] of TControl;
TArray2 = array[Low(LabelsB)..High(LabelsB)] of TControl;
begin
DoSomethingWithControls(TArray1(LabelsA));
DoSomethingWithControls(TArray2(LabelsB));
end;
procedure Variant2;
type
TControlArray = array[0..Pred(MaxInt div SizeOf(TControl))] of TControl;
PControlArray = ^TControlArray;
begin
DoSomethingWithControls(Slice(PControlArray(@LabelsA)^, …Run Code Online (Sandbox Code Playgroud) 在Delphi 7或Delphi XE下编译时,下面的代码会抱怨
[DCC Error] Project1.dpr(25): E2010 Incompatible types: 'array of Char' and 'TAChar'
Run Code Online (Sandbox Code Playgroud)
根据Rudy的文章,应该允许将类型数组传递给open数组?
此外,为什么它不抱怨'布尔'数组和'TABoolean'?
非常感谢您的帮助!
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TAChar = array of Char;
TABoolean = array of Boolean;
procedure Test1(const CharArr: array of Char);
begin
end;
procedure Test2(const BoolArr: array of Boolean);
begin
end;
var
Arr1: TAChar;
Arr2: TABoolean;
begin
try
Test1(Arr1); // <------- Does not compile in Delphi 7 & XE
Test2(Arr2);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end; …Run Code Online (Sandbox Code Playgroud) 我想将格式化参数传递Args给Format函数.我找到了一些例子,但是我无法找到如何在TVarRec成员中分配字符串常量.以下代码在编译时失败E2089 Invalid typecast.
procedure TForm1.Button1Click(Sender: TObject);
var Arguments: array of TVarRec;
begin
SetLength(Arguments, 2);
Arguments[0].VInteger := 111;
Arguments[1].VAnsiString := PAnsiString('Text'); // I want to set this member
ShowMessage(Format('Decimal: %d, String: %s', Arguments));
end;
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议我如何将字符串(或AnsiString)常量设置为TVarRec成员?我正在使用Delphi 2009.
非常感谢
我正在使用Delphi 2007(Pre generics),我已经定义了许多可以用于所有TObject后代数组的函数,例如:
function IndexOf(AArray : array of TObject; AItem : TObject) : integer;
begin
//...
end;
Run Code Online (Sandbox Code Playgroud)
为了传递它们TObject后代的动态数组,我已经定义了一个数组类型TObjectArray = array of TObject.通过这种方式,我可以投射动态数组并将它们传递给我的函数而不会出现任何问题
type
TChild = class(TObject);
...
procedure Test();
var
Items : array of TChild;
Item : TChild;
begin
//...
IndexOf(TObjectArray(Items), Item);
end;
Run Code Online (Sandbox Code Playgroud)
当我尝试传递它们打开数组参数时出现问题:
procedure Test(AItems : array of TChild);
var
Item : TChild;
begin
//...
IndexOf(TObjectArray(AItems), Item);
end;
Run Code Online (Sandbox Code Playgroud)
在这些情况下,编译器会引发以下错误消息:
E2089无效的类型转换
为什么会发生这种情况,我该如何避免呢?
所以我在Delphi 2007工作,我正在清理我的代码.我注意到在很多程序中我声明了许多相同类型的不同变量.
例如我现在正在查看的一个程序我声明了4个不同的字符串列表,我必须var1 := TStringList.Create为每个列表输入.
我有想法制作一个程序,它接受一个开放的变量数组,我的4个变量列表,然后创建它们.电话会是这样的
CreateStringLists([var1,var2,var3,var4]);
Run Code Online (Sandbox Code Playgroud)
但据我所知,你不能通过引用传递开放数组,因此不能做我希望的事情.有没有人对此有任何有趣的想法?
delphi delphi-2007 variable-initialization open-array-parameters
delphi ×7
arrays ×2
casting ×2
delphi-2007 ×2
delphi-7 ×1
delphi-xe ×1
delphi-xe2 ×1
string ×1