菜鸟请教

sunang4379 2014-10-11 10:28:07
使用delphi 7建立一个两个窗体的项目,其中主窗体为FORM1,动态创建FORM2窗体。
Unit1代码如下:
unit Unit1;

interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
{$R *.dfm}
uses
unit2;
//button1的click事件为建立FORM2窗体
procedure TForm1.Button1Click(Sender: TObject);
var
cform:tform2;
begin
cform:=tform2.Create(application);
cform.Show;
end;
end.

Unit2的代码如下:
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}
//此按钮为FORM2的关闭按钮,即关闭整个form2窗体
procedure TForm2.Button1Click(Sender: TObject);
var
Fform:tform2;
begin
Fform.Close;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action:=cafree;
end;
end.
想请教在form2的关闭按钮事件中,定义了一个空指针的Fform对象,为什么可以执行close方法,并能触发form2的close事件并关闭释放掉动态创建的form2窗体?望高手解答!!!
...全文
151 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
s11ss 2014-10-11
  • 打赏
  • 举报
回复
procedure TForm2.Button1Click(Sender: TObject);
var
Fform:tform2;
begin
Fform.Close;
end;
因为默认的代码优化,使得Fform.Close没对eax赋值,直接调用TCustomForm.Close,而eax此时正好指向cform对象实例,所以跟cform.Close效果一样。
lyhoo163 2014-10-11
  • 打赏
  • 举报
回复
分析应该是这样: 1、你的TFom2 .Button1.OnClick事件中,定义一个TFom2类型的Fform变量:
procedure TForm2.Button1Click(Sender: TObject);
var Fform:tform2;
begin
  Fform.Close;
end;
这是犯了对象(自身)内部,再定义引用自身的错误,Button1,就是Fom2(对象)实体,在它内部定义引用一个它的父类,这样的变量是不能使用的; 2、Delphi有修改错误的机制,它约定你这样的错误,就是引用自身的一个方法。 这样,Delph也就执行了,Fom2.Close;
yct0605 2014-10-11
  • 打赏
  • 举报
回复
每个开发软件的编译器都有优化代码的功能,虽然定义了空指针但是编译器编译的时候已经帮你优化了。
sunang4379 2014-10-11
  • 打赏
  • 举报
回复
我总觉得这个东西与编译器有关系,但说不上为什么
Playmaster 2014-10-11
  • 打赏
  • 举报
回复
按楼上的说法,这样的优化就是个BUG,应该弹出“指针越界”或是“访问的对象不存在”异常。

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧