有两个窗体form1、form2,form1中代码如下:
procedure TForm1.Button1Click(Sender: TObject);
begin
form2.myshowform();
end;-----------------------------
form2中代码为:
public
procedure myshowform();
end;var
Form2: TForm2;implementationprocedure TForm2.myshowform();
begin
form2:=TForm2.create(nil);
self.show;
end;并且将Application.CreateForm(TForm2, Form2);这一行从工程文件中删除(即不让其自动创建)当执行单击form1中的按钮执行 form2.myshowform();时就会出错! 不知原因何在?但如果将self.show改为 form2.show时,则一切正常!
procedure TForm1.Button1Click(Sender: TObject);
begin
form2.myshowform();
end;-----------------------------
form2中代码为:
public
procedure myshowform();
end;var
Form2: TForm2;implementationprocedure TForm2.myshowform();
begin
form2:=TForm2.create(nil);
self.show;
end;并且将Application.CreateForm(TForm2, Form2);这一行从工程文件中删除(即不让其自动创建)当执行单击form1中的按钮执行 form2.myshowform();时就会出错! 不知原因何在?但如果将self.show改为 form2.show时,则一切正常!
procedure myshowform();
var
Form2: TForm2;
begin
try
form2:=TForm2.create(nil);
form2.show;
Finally
Form2.Free;
End;
end;
public
Class Function myshowform() : boolean;
end; var
Form2: TForm2; implementation Function TForm2.myshowform(): boolean;
begin
form2:=TForm2.create(nil);
self.show;
end;
我也知道将self改成form2就正常,但请你解释一下原因!
self表示的是form1吗 ? 类的方法中,self代表的是由该类所创建的对象。 ------------------------------------------------------------------
我想了想,初步解释原因:当执行form2.myshowform(); 时,此时form2尚不存在,所以编译器并不知道myshowform()方法中的self代表的是哪个具体
对象(可能只是个空指针 nil ), 所以如果写成 self.show就会出错。但如果改成:
self:=TForm2.create(nil);
self.show; 则一切都正常了。甚至改成: TForm2.create(nil).Show; 都将是正常的。
----------------------------------------
不知以上解释正确否?
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementationuses Unit2;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
form2.myshowform();end;procedure TForm1.FormCreate(Sender: TObject);
begin
form2:=TForm2.create(nil);
end;end.unit Unit2;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm2 = class(TForm)
Edit1: TEdit;
private
{ Private declarations }
public // Class
Function myshowform() : boolean; { Public declarations }
end;var
Form2: TForm2;implementation{$R *.dfm}function TForm2.myshowform: boolean;
begin
form2:=TForm2.create(nil);
if self is tform then self.show;
//不要 if self is tform then 也可以
end;end.
上面的代码运行成功,哪就是说self 失败的原因是因为self 代表FORM2,但是这个时候,FORM2还是不存在的,所以调用出错!
与我看法一致。self 代表FORM2,而此时self还不存在。唉,惭愧,这种小问题,自己一时竟没想到其原因。
begin
TForm2.create(nil);
TForm2.create(nil).show ;
end;
//窗口的名字为FORM2_1
能否再细些,好像不是太懂!
不过楼主确实用上了class function ,不知用意也在此?
==>[/Quote]也就是说,变量Form2是用于TForm2类之外的模块来访问的。[/Quote]我想,懂点Delphi的都知道。
==>[/Quote]你创建10000个TForm2实例,变量Form2只有一份,且指向最后创建的实例[/Quote]你创建10000个TForm2的实例:
f1:=TForm2.create(nil);
f2:=TForm2.create(nil);
.......
f10000:=TForm2.create(nil);(最后一个TForm2实例)请问:此时变量Form2会指向最后创建的实例?
==>[/Quote]但每个TForm2实例,都有自己的Self![/Quote]这最后一句话倒是对的。
定义成全局函数,结构会好一些
而不是你新建的窗体