如何解决德尔福2个或更多单元之间的循环关系问题?



我在Delphi 2010中使用了2个单元:Unit1有一个带有TEditButton的表单,这个Button将从Unit2调用一个过程(Unit2没有表单(。该过程将更改Unit1TEdit的"caption"属性,我尝试将Unit2放在Unit1的"用途"中以访问该过程,并将Unit1放在Unit2的"用途"中以访问Unit1中的TEdit,但这种关系是循环的。

我不确定我能做些什么来解决这个问题,有什么建议吗?

有很多方法可以做到这一点,哪一种最合适主要取决于确切的情况,所以从技术上讲,这个问题对于堆栈溢出来说太宽泛了,我怀疑。

方法 1

不过,让我向您展示一种非常简单的方法。这可能不是一个好方法,但它接近你似乎正在尝试做的事情。

  1. 创建新的 VCL 应用程序。
  2. 在主窗体上放置一个TButton和一个TEdit控件(TForm1Unit1中(。
  3. 创建一个新单元 Unit2:

    unit Unit2;
    interface
    procedure SetCaption;
    implementation
    uses
    Unit1;
    procedure SetCaption;
    begin
    Unit1.Form1.Edit1.Text := 'Hello, World!';
    end;
    end.
    
  4. 在主窗体上,将此事件处理程序用于按钮的OnClick事件:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    Unit2.SetCaption;
    end;
    

    Unit2添加到implementation部分的uses子句之后。完全,

    unit Unit1;
    interface
    uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
    type
    TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;
    var
    Form1: TForm1;
    implementation
    uses
    Unit2;
    {$R *.dfm}
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    Unit2.SetCaption;
    end;
    end.
    

请注意,如果仅在实现部分中引用,则单元可以如何相互使用。另请注意,我们在Unit1中使用全局Form1变量来引用自动创建的TForm1实例。在许多情况下(大多数(情况下,您不想使用自动创建的表单,但那是另一回事(我可以在这里写一本 100 页的德尔菲教科书!

方法 2

另外,让我重申,还有许多其他方法可以实现这一结果。例如,这可以说是一种更好的方法:

unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses
Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Unit2.SetCaption(Edit1);
end;
end.

unit Unit2;
interface
uses
StdCtrls;
procedure SetCaption(AEdit: TCustomEdit);
implementation
procedure SetCaption(AEdit: TCustomEdit);
begin
AEdit.Text := 'Hello, World!';
end;
end.

方法 3

可以说更好:

unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses
Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := Unit2.GetText;
end;
end.

unit Unit2;
interface
function GetText: string;
implementation
function GetText: string;
begin
Result := 'Hello, World!';
end;
end.

最新更新