[本例 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.模态窗口的写法
面向对象的知识,不复杂,但也不简单,需要反复练习,才能真正理解。
- 0.1 教程说明
- 0.2 delphi xe8 安装
- 0.2.2 XE 10.3.3 安装
- 0.3 delphi IDE 的非常必要的配置
- 0.4 调试中的异常处理
- 0.5 工程路径设置
- 0.6 开发工具界面切换成中文的问题
- 一、实用技巧
- 0.尝试为event取名叫伊文特
- 1.各种(变量)数据在内存中是什么样子的?
- 2
- 3
- 4.乱码问题
- 5
- 二、多线程
- 三、DLL相关
- 1.DLL中函数参数如何设计?
- 2.调用易语言DLL识别验证码
- 四、界面设计
- 1.关于解耦问题
- 2.登录功能设计
- 五、面向对象基础知识
- 1.窗口间传递值
- 3.避免又臭又长的裹脚布
- 2.扩展 TStringGrid , delphi 7 示例
- 六、初学者误区集锦
- 七 TList 集合
- 1.附加信息Pointer设计
- 2.用 TList 来建立组件间的联系
- 3.泛型 TList<T> 示例