Delphi 全局变量 setter

Delphi global variable setter

我在 Delphi 单元中设置全局变量时遇到问题:

unit SomeUnit;
...
interface
...
var
variable1: String;
...
implementation

procedure TSomeForm.SetNewVersion(variable1: String);
begin

    variable1 := variable1; //here is problem

end;

如果全局变量与过程中的局部参数值同名,如何给全局变量赋值?如果这是某种形式的价值,那可以这样做:

TSomeForm.variable1 = variable1;

但问题是什么时候variable是unit中的全局变量?

SomeUnit.variable1 = variable1; // this dont work

FWIW:以下工作方式可能符合预期:

var
  SomeForm: TSomeForm;
  variable1: string;

implementation

{$R *.dfm}

{ TSomeForm }

procedure TSomeForm.FormCreate(Sender: TObject);
begin
  Assert(SomeUnit.variable1 = '');
  SetNewVersion('1');
  Assert(SomeUnit.variable1 = '1');
end;

procedure TSomeForm.SetNewVersion(variable1: string);
begin
  SomeUnit.variable1 := variable1;
end;

为避免此类问题,您可以考虑在参数前加上 'A' 前缀,这是 Delphi 中的一种半标准。当你在做的时候,制作字符串参数 const:

procedure TSomeForm.SetNewVersion(const AVariable1: string);
begin
  variable1 := AVariable1;
end;

您可以通过以下任一方式解决您的问题:

  • 为参数(或全局变量)选择不同的名称。我个人倾向于使用名称 Value 作为 setter 方法的参数。或者,
  • 像这样完全限定名称 SomeUnit.variable1

注意赋值运算符是:=而不是=

我强烈建议您重新考虑设计。

变量真的应该是全局的吗?如果它与您的 setter 暗示的表单实例相关联,它不应该是表单 class 的私有成员变量。

如果变量确实在实例之间共享,请将变量设为私有 class 变量,将 setter 设为 class 方法。

如果您的 Delphi 没有 class 变量,则将全局变量移动到实现部分。正如您的代码所代表的那样, setter 没有意义,因为您还在接口部分公开了支持变量。