如何为其他单元创建共享代码单元?

How to create a shared code unit for other units?

我有两个 VCL 表单:Unit1 中的 Form1 和 Unit2 中的 Form2。

我还在项目中添加了另一个单元,即 Unit3

Unit3中,在[=21]中添加了Unit1Unit2 =] 使用 列表。我设法创建了一个可以操纵其他单元(单元 1 和单元 2)的 class

unit Unit3;

interface

uses
  Vcl.Forms, Unit1, Unit2;

type
  Tmain = class
    private
      procedure openForm1;
      procedure openForm2;
  end;

var
  Form1: TForm1;
  Form2: TForm2;

implementation

procedure Tmain.openForm1;
begin
  //I will create code to open Form1 soon
end;

procedure Tmain.openForm2;
begin
  //I will create code to open Form2 soon
end;

end.

如果Project1 的源代码似乎没有 运行 我的共享代码单元 (Unit3)?

program Project1;

uses
  Vcl.Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2},
  Unit3 in 'Unit3.pas';

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.

I am trying these algorithms to avoid circular references as my level of understanding through Lieven Keersmaekers's answer on How to manage circular references in delphi units?

首先是 Delphi VCL 应用程序中的一些基础知识。 顶部是 Application: TApplication 对象,它是在程序 (.exe) 初始化期间很早就创建的。 如您所见,它首先在您的程序文件中引用,在 .dpr:

begin 
  Application.Initialize; 
  Application.MainFormOnTaskbar := True; 
  Application.CreateForm(TForm1, Form1);  
  Application.CreateForm(TForm2, Form2); 
  Application.Run;
end.

Application 对象不可见。因此,Delphi就有了MainForm的概念。主窗体旨在成为用户的主要 UI,并由 首次调用 Application.CreateForm() 创建。除非程序员阻止,否则主窗体是可见的,因此用户可以与应用程序交互。当主窗体关闭时,应用程序终止。从广义上讲,我们可以说主窗体控制着应用程序的生命周期。

主窗体通常提供菜单或其他 UI 用户可以激活的元素 and/or 显示其他窗体并执行程序的任务。

Delphi 命名表单类型,如您所见,TForm1TForm2 ... 等,还声明了一个 global 为每个表单类型保存表单实例的变量:Form1Form2 ...等。再一次,使用这些标准名称 Form1 是应用程序的主要表单如果它是第一个通过调用 Application.CreateForm().

创建的

在你的情况下,设计三种形式是很自然的:

  • Form1,一个新的表格,取代您当前的 Unit3 并充当主表格,f.ex。二 按钮,每个按钮分别显示 Form2 和 Form3。
  • Form2,其实现在的Form1只是改名为Form2。
  • Form3,其实现在的Form2只是改名为Form3。

在这种情况下,您需要将 Unit2Unit3 添加到 Unit1uses 子句中:

implementation
  uses Unit2, Unit3;

Form1 上按钮的事件处理程序如下所示:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Show;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Form3.Show;
end;