gpt4 book ai didi

arrays - 将静态数组转换为不同元素类型的开放数组

转载 作者:行者123 更新时间:2023-12-03 14:44:04 25 4
gpt4 key购买 nike

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

最佳答案

这些 Actor 阵容都相当丑陋。它们都可以工作,但是使用它们会让你感觉很脏。使用辅助函数是完全合理的:

type
TControlArray = array of TControl;

function ControlArrayFromLabelArray(const Items: array of TLabel): TControlArray;
var
i: Integer;
begin
SetLength(Result, Length(Items));
for i := 0 to high(Items) do
Result[i] := Items[i];
end;

然后你像这样调用你的函数:

DoSomethingWithControls(ControlArrayFromLabelArray(...));

当然,如果您可以使用泛型,这会干净得多。

关于arrays - 将静态数组转换为不同元素类型的开放数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31557207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com