我在Delphi 2010中使用了2个单元:Unit1有一个带有TEdit
和Button
的表单,这个Button
将从Unit2调用一个过程(Unit2没有表单(。该过程将更改Unit1TEdit
的"caption"属性,我尝试将Unit2放在Unit1的"用途"中以访问该过程,并将Unit1放在Unit2的"用途"中以访问Unit1中的TEdit
,但这种关系是循环的。
我不确定我能做些什么来解决这个问题,有什么建议吗?
有很多方法可以做到这一点,哪一种最合适主要取决于确切的情况,所以从技术上讲,这个问题对于堆栈溢出来说太宽泛了,我怀疑。
方法 1
不过,让我向您展示一种非常简单的方法。这可能不是一个好方法,但它接近你似乎正在尝试做的事情。
- 创建新的 VCL 应用程序。
- 在主窗体上放置一个
TButton
和一个TEdit
控件(TForm1
在Unit1
中(。 创建一个新单元 Unit2:
unit Unit2; interface procedure SetCaption; implementation uses Unit1; procedure SetCaption; begin Unit1.Form1.Edit1.Text := 'Hello, World!'; end; end.
在主窗体上,将此事件处理程序用于按钮的
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.