Delphi全局变量setter

Neb*_*tic -2 delphi variables global

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

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

procedure TSomeForm.SetNewVersion(variable1: String);
begin

    variable1 := variable1; //here is problem

end;
Run Code Online (Sandbox Code Playgroud)

如果它具有与过程中的本地参数值相同的名称,如何为全局变量赋值?如果这是某种形式值,可以这样做:

TSomeForm.variable1 = variable1;
Run Code Online (Sandbox Code Playgroud)

但问题是变量是单位的全局变量吗?

SomeUnit.variable1 = variable1; // this dont work
Run Code Online (Sandbox Code Playgroud)

Uli*_*rdt 8

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;
Run Code Online (Sandbox Code Playgroud)

为了避免这些问题,你可以考虑在参数前加上'A',这是Delphi中的一种半标准.当你在它时,创建字符串参数const:

procedure TSomeForm.SetNewVersion(const AVariable1: string);
begin
  variable1 := AVariable1;
end;
Run Code Online (Sandbox Code Playgroud)


Dav*_*nan 7

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

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

需要注意的是赋值运算符是:=和不是=.

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

变量真的应该是全局变量吗?如果它与您的setter隐含的表单实例相关联,则它不应该是表单类的私有成员变量.

如果变量确实在实例之间共享,则将变量设为私有类变量,将setter设置为类方法.

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