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

时间:2015-10-14 07:23:30

标签: forms delphi vcl circular-reference

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

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

Unit3 中,使用列表中添加了 Unit1 Unit2 。我设法创建了一个可以操纵其他单位的(Unit1& Unit2):

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.

如何运行(或正确创建)共享代码单元以管理 Form1 & Form2 如果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.
  

我正在尝试这些算法以避免循环引用作为我的理解水平,通过Lieven Keersmaekers在How to manage circular references in delphi units?上的答案

1 个答案:

答案 0 :(得分:1)

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元素,用户可以激活和/或显示其他窗体并执行程序任务。

Delphi命名表单类型,如您所见,TForm1TForm2 ...等,并为每个表单类型声明一个全局变量来保存表单的实例:Form1Form2 ...等再次,使用这些标准名称Form1是应用程序的主要形式,如果它是第一个创建的致电Application.CreateForm()

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

  • Form1,一个新的表单,用f.ex.替换当前的Unit3并作为主要表单。二 按钮,每个按钮分别显示Form2和Form3。
  • Form2,实际上当前Form1只是重命名为Form2。
  • Form3,实际上当前的Form2只是重命名为Form3。

在这种情况下,您需要将Unit2Unit3添加到uses的{​​{1}}条款中:

Unit1

implementation uses Unit2, Unit3; 上按钮的事件处理程序如下所示:

Form1