🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[本例 delphi 7 源码下载](https://www.jianguoyun.com/p/DU2LG1kQxMf4BRjK2VM) 本例定义三个TForm类, TForm1 , TForm2 , TForm3 ,其中:TForm1 为主窗口,对本工程做如下设置: ![](https://box.kancloud.cn/b21ee726b519651cab2c43ae08d35c04_424x402.png) 要把另两个窗口,从 Auto-Create Forms 移动到 Available forms 中去。打开本界面的方法,菜单 Project-->Options.. 另一种方法,亦可达到相同目的。菜单 Project -->View source 得到如下代码。 ~~~ program TestPassParam; uses Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {Form2}, Unit3 in 'Unit3.pas' {Form3}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. ~~~ 此处代码显示,只创建了 TForm1 。稍加分析这几句代码,就可以灵活运用它们做更多的事情。 传值方法一:两个窗口传值,实质上是类之间传值,用类的事件,很容易达到这一目的。于是,我们设计 TForm2 类如下: ~~~ unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls; type TForm2 = class; // 提前申明 TOnGetParam = procedure(Sender: TForm2) of object; // 定义一个事件 TForm2 = class(TForm) Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private public OnGetParam: TOnGetParam; // 定义一个事件变量 end; implementation {$R *.dfm} procedure TForm2.Button1Click(Sender: TObject); begin if Assigned(OnGetParam) then OnGetParam(self); //引发事件 Self.Close; end; end. ~~~ 传值方法二:利用模态窗口的阻塞功能。 以下是 TForm1 中的全部代码 ~~~ unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Unit2, Unit3, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; Edit2: TEdit; Button2: TButton; Label1: TLabel; Label2: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } FForm2: TForm2; procedure GetParamEvent(Sender: TForm2); public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin // 用事件传递,应该重点掌握。 FForm2.Show; end; procedure TForm1.Button2Click(Sender: TObject); var LForm3: TForm3; begin // 用模态窗口传值,简单粗暴直观 // 符合常规思维 LForm3 := TForm3.Create(nil); if LForm3.ShowModal = mrok then // 此句会阻塞(模态窗口的特性) begin Edit2.Text := LForm3.Edit1.Text; end; LForm3.Free; end; procedure TForm1.FormDestroy(Sender: TObject); begin FForm2.Free; end; procedure TForm1.FormCreate(Sender: TObject); begin FForm2 := TForm2.Create(nil); FForm2.OnGetParam := self.GetParamEvent; // 给事件赋值 end; procedure TForm1.GetParamEvent(Sender: TForm2); begin Edit1.Text := Sender.Edit1.Text; end; end. ~~~ 此文介绍的知识点: 1.使 Form 不再自动创建,此方法对 TDataMoudule 同样有效。 2.事件的初步写法 3.模态窗口的写法 面向对象的知识,不复杂,但也不简单,需要反复练习,才能真正理解。