(我已经在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)^, Length(LabelsA)));
DoSomethingWithControls(Slice(PControlArray(@LabelsB)^, Length(LabelsB)));
end;
procedure Variant3;
var
ControlsA: array[Low(LabelsA)..High(LabelsA)] of TControl absolute LabelsA;
ControlsB: array[Low(LabelsB)..High(LabelsB)] of TControl absolute LabelsB;
begin
DoSomethingWithControls(ControlsA);
DoSomethingWithControls(ControlsB);
end;
begin
Variant1;
Variant2;
Variant3;
end;
有一些可能的调用变体DoSomethingWithControls
:
变体 1 非常简单,但需要一个“适配器”类型,例如
TArray1
每个大小的 TLabel 数组。我希望它更灵活。变体 2 更加灵活和统一,但丑陋且容易出错。
变体 3(由 TOndrej提供)类似于变体 1 - 它不需要显式强制转换,但是如果您搞砸了一些事情(例如,在复制粘贴时弄错了数组边界),变体 1 会提供更多的编译器安全性。
有什么想法可以在没有这些缺点的情况下制定这些调用(不更改数组的元素类型)?它应该适用于 D2007 和 XE6。