4

我想从一个从主调用的类中访问一个主表单变量。像这样的东西:

单元1:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,Unit2, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
  public
  end;
var
  Form1: TForm1;
  Chiled:TChiled;
const
 Variable = 'dsadas';
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Chiled.ShowMainFormVariable;
end;

end.

单元2:

unit Unit2;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

  type
  TChiled = class
  private
  public
    procedure ShowMainFormVariable;
  end;
var
  Form1: TForm1;
implementation

procedure TChiled.ShowMainFormVariable;
begin
  ShowMessage(Form1.Variable);
end;
end.

如果在 Unit2 我添加到使用 Unit1 会弹出一个循环错误。

如何使 Unit1 成为 GLOBAL?

4

4 回答 4

6

正如其他答案所说,您应该使用实现部分中的一个单元。

假设您在“unit2”中选择了在实现中使用“unit1”。那么您需要设计一种机制来告诉“TChiled”如何访问“Form1”。那是因为你没有在'unit2'的接口部分使用'unit1',你不能在接口部分声明'Form1:TForm1'变量。以下只是一种可能的解决方案:

unit2

type
  TChiled = class
  private
    FForm1: TForm;
  public
    procedure ShowMainFormVariable;
    property Form1: TForm write FForm1;
  end;

implementation

uses
  unit1;

procedure TChild.ShowMainFormVariable;
begin
  ShowMessage((FForm1 as TForm1).Variable);
end;

那么在unit1中你可以在调用TChiled的方法之前设置TChiled的Form1属性:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Chiled.Form1 := Self;
  Chiled.ShowMainFormVariable;
end;
于 2012-04-16T13:01:43.553 回答
3

好吧,简单天真的答案是您应该添加Unit1实施部分的uses子句中:Unit2

unit Unit2;
......
implementation

uses
  Unit1;
.....

您不能将其添加到usesinterface 部分的子句中,Unit2因为这会在 interface 部分创建循环引用。换句话说,Unit1将使用的接口和将使用Unit2的接口。语言不允许这样做。常见的解决方案是实现级别的单元之一。Unit2Unit1use


话虽如此,您的代码相当混乱,并且在许多其他方面都失败了。您的问题比循环引用更深。例如,你的意思是Form1.Variable什么?该常数Variable不是 的成员TForm1。您声明了两个名为Form1type 的全局变量TForm1。你为什么这样做?

另外,你拼错了child。

于 2012-04-16T12:42:08.783 回答
3

最简单的解决方案是将 Unit1 添加到 Unit2 的 implementation 部分内的 uses 子句,因为这绕过了循环引用。

但是我建议这种设计是有缺陷的。通过示例代码很难看出您想要实现什么,因此很难提供任何真正的建议。

于 2012-04-16T12:42:45.820 回答
1

我通常创建一个数据模块(或任何类型的非可视容器)来共享全局变量。这样,两个单元都可以在没有循环引用的情况下使用变量。

于 2012-04-16T12:48:08.473 回答