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