在Delphi中迭代变量
鉴于声明:在Delphi中迭代变量,delphi,variables,loops,Delphi,Variables,Loops,鉴于声明: Unit MyUnit; interface type TMyFileStream= class(TFileStream); ... end; var a1,a2,a3,a4,a5: integer; b1,b2,b3: boolean; c1: char; d1,d2,d3,d4: TDateTime; f1,f2,f3,f4,f5,f6,f7,f8: TMyFileStream // LineX ... procedure MyPro
Unit MyUnit;
interface
type
TMyFileStream= class(TFileStream);
...
end;
var
a1,a2,a3,a4,a5: integer;
b1,b2,b3: boolean;
c1: char;
d1,d2,d3,d4: TDateTime;
f1,f2,f3,f4,f5,f6,f7,f8: TMyFileStream // LineX
...
procedure MyProc;
implementation
procedure MyProc
begin
// I wanna iterate over all integer (or any other type) variables here with a loop regardless of their count and identifier name
end;
一些特定类型变量的计数在代码中会定期发生变化——主要是随着我添加新函数而增加。如何在循环中引用它们以对所有它们执行相同的操作?我想保留这样一个事实,即当我添加一个新代码时,只需要在一个地方修改代码
我已经考虑过将它们放在静态或动态数组中,但这涉及到在引用它们的每个位置修改代码,如果可能的话,这是我想做的大量工作
目前有38个变量我想用acton,引用的数量是它的倍数,远远超过100
希望我说得够清楚。
谢谢你的建议
Peter如果将这些变量放入一个类中,则可以使用RTTI循环该类的属性。据我所知,没有一种方法可以循环不属于某个类的变量。尽管设计很有味道,但指针就是为了这个目的而设计的:
type
PMyFileStream = ^TMyFileStream;
TMyFileStream= class(TFileStream)
end;
var
a1,a2,a3,a4,a5: integer;
b1,b2,b3: boolean;
c1: char;
d1,d2,d3,d4: TDateTime;
f1,f2,f3,f4,f5,f6,f7,f8: TMyFileStream; // LineX
function GetVarsInt: TArray<PInteger>;
begin
result := TArray<PInteger>.Create(@a1, @a2, @a3, @a4, @a5);
end;
function GetVarsBool: TArray<PBoolean>;
begin
result := TArray<PBoolean>.Create(@b1, @b2, @b3);
end;
function GetVarsChar: TArray<PChar>;
begin
result := TArray<PChar>.Create(@c1);
end;
function GetVarsDateTime: TArray<PDateTime>;
begin
result := TArray<PDateTime>.Create(@d1, @d2, @d3, @d4);
end;
function GetVarsMyFileStream: TArray<PMyFileStream>;
begin
result := TArray<PMyFileStream>.Create(@f1, @f2, @f3, @f4, @f5, @f6, @f7, @f8);
end;
procedure HandleInt(var Value: Integer);
begin
end;
procedure HandleBool(var Value: Boolean);
begin
end;
procedure HandleChar(var Value: Char);
begin
end;
procedure HandleDateTime(var Value: TDateTime);
begin
end;
procedure HandleMyFileStream(var Value: TMyFileStream);
begin
end;
procedure MyProc;
var
vInt: PInteger;
vBool: PBoolean;
vChar: PChar;
vDateTime: PDateTime;
vMyFileStream: PMyFileStream;
begin
for vInt in GetVarsInt do
HandleInt(vInt^);
for vBool in GetVarsBool do
HandleBool(vBool^);
for vChar in GetVarsChar do
HandleChar(vChar^);
for vDateTime in GetVarsDateTime do
HandleDateTime(vDateTime^);
for vMyFileStream in GetVarsMyFileStream do
HandleMyFileStream(vMyFileStream^);
end;
对于TMyFileStream变量,当您只想操作现有的对象实例时,可能不需要指针
我已经考虑过将它们放在静态或动态数组中,但这涉及到在引用它们的每个位置修改代码,如果可能的话,这是我想做的大量工作
那又怎样!做吧!
你拖延修复可怕代码的时间越长,它就会变得越糟糕。而且,它也没有你想象的那么糟糕
例如,更改以下内容:
var
a1,a2,a3,a4,a5: integer;
致:
现在,所有与a有关的东西?除非发生范围冲突,否则将无法编译,这在任何情况下都将是一场酝酿中的灾难。这些编译错误可以通过更改?到[?]
如果您只是经历一个循环:编译->修复->编译->修复->。。。你会发现清理的速度比你想象的要快得多。如果你找到一种迭代变量的方法,你就必须在引用变量的地方修改代码。这与使用需要修改的数组有什么区别?不,我想保留旧的引用,这将是唯一的目标。你应该真正切换到该数组,你可以自动进行替换。你想要的东西会很乱。想象一下,有一天你会添加一个整数变量,你不想在迭代中使用它,但由于其中使用了一些魔法。现在有空闲时间,以后会有一个很大的头痛,帮你自己一个忙,现在就开始重构……什么是整数,布尔,字符,TDateTime和TMyFileStream有一个共同点,就是您可以对它们执行相同的操作?你可以记下他们的地址,然后呢?你可能想指出,属性需要用{$M+}/{$TYPEINFO ON}来发布或定义。我们可以让Delphi做一些令人惊奇和现代的事情。我认为他是迭代的大师但是,这个概念本身不应该让任何人发抖:如果Delphi有元组,这将是更直接的。
var
A: array[1..5] of Integer;