标签: open-array-parameters

当参数类型是Char的数组打开时,是否允许动态数组Char?

我在看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 dynamic-arrays open-array-parameters

11
推荐指数
1
解决办法
2363
查看次数

为什么我可以将类型X的var传递给该类型的open数组参数?

使用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(只是单个变量)传递给它们各自类型的开放数组参数而不将它放在它之间[]并且没有编译器将它直接反馈给我吗?

我认为它可能与接口数组,甚至涉及的泛型有关,但编译器接受传递给整数的开放数组的整数.

delphi open-array-parameters delphi-xe2

9
推荐指数
1
解决办法
412
查看次数

强制转换静态数组以打开不同元素类型的数组

(我已经在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)

arrays delphi casting open-array-parameters

9
推荐指数
1
解决办法
531
查看次数

无法传递类型化的char数组来打开char数组?

在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)

delphi delphi-7 delphi-xe open-array-parameters

6
推荐指数
1
解决办法
140
查看次数

如何在TVarRec中设置字符串(或AnsiString)常量?

我想将格式化参数传递ArgsFormat函数.我找到了一些例子,但是我无法找到如何在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 string constant-expression open-array-parameters

5
推荐指数
2
解决办法
8335
查看次数

为什么将开放数组参数转换为数组类型会导致E2089无效的类型转换?

我正在使用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无效的类型转换

为什么会发生这种情况,我该如何避免呢?

arrays delphi casting delphi-2007 open-array-parameters

5
推荐指数
1
解决办法
210
查看次数

如何将一组对象传递给函数进行创建?

所以我在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

0
推荐指数
1
解决办法
292
查看次数