第1个窗体中的button1onclick中动态创建窗体2,并显示,此时释放form1。
form2 := TForm2.Create(Application);
Free;
form2.Show;
第1个窗体中的button2onclick中动态创建窗体3,并显示,此时释放form1。
form3 := TForm3.Create(Application);
Free;
Form3.Show;
第2个窗体中的buttononclick中动态创建窗体1,并显示,此时释放form2。
form1 := TForm1.Create(Application);
Free;
Form1.Show;
第3个窗体中的buttononclick中动态创建窗体1,并显示,此时释放form3。
form1 := TForm1.Create(Application);
Free;
Form1.Show;
form2 := TForm2.Create(Application);
Free;
form2.Show;
第1个窗体中的button2onclick中动态创建窗体3,并显示,此时释放form1。
form3 := TForm3.Create(Application);
Free;
Form3.Show;
第2个窗体中的buttononclick中动态创建窗体1,并显示,此时释放form2。
form1 := TForm1.Create(Application);
Free;
Form1.Show;
第3个窗体中的buttononclick中动态创建窗体1,并显示,此时释放form3。
form1 := TForm1.Create(Application);
Free;
Form1.Show;
解决方案 »
- 谁能给出一个判断字符串编码(codepage,如简体936)的代码?
- 匹配一下 QueryThisYear.CommandText字符串
- 深圳公司招聘
- 打算在武汉找一份delphi开发的工作,那位朋友公司招人呀?(顶者有分)
- 如何做到按用途分类打印并统计?有哪位兄弟帮帮
- 急!关于StringGrid 使用的一点小问题
- 有二个问题要麻烦大家?我是初学者,谢谢大家。
- 给大家一些f1book的操作介绍
- 怎样设置StringGrid的每一列字符的对齐方式
- ado的常见错误!'Either bof or eof is true,or the current...'
- 到底是怎么回事,北京拨号163有调整了吗?
- Socket编程小问题挑战高手.
form1是程序的主窗体,你把它释放之前要再指定form2为主窗体才可以吧?
我估计是这个问题。
form2 := TForm2.Create(self);
form2.Showmodal;
form1.Free;
第1个窗体中的button2onclick中动态创建窗体3,并显示,此时释放form1。
form3 := TForm3.Create(self);
Form3.Showmodal;
form1.Free;
第2个窗体中的buttononclick中动态创建窗体1,并显示,此时释放form2。
form1 := TForm1.Create(self);
Form1.Showmodal;
form2.Free;
第3个窗体中的buttononclick中动态创建窗体1,并显示,此时释放form3。
form1 := TForm1.Create(self);
Form1.Show;
form3.Free;
刚刚做了这个程序,d6通过!不需要设置任何属性!
Application.CreateForm(TForm2,Form2);
Form2.ShowModal;
Form1.Free;
要释放的话,须注意Create(Aowner)中的参数。
参数如果填form1,则会随form1的释放而释放。
填nil,则系统不进行自动释放
老兄,如果不是MDI的窗体,而且form1不是主窗体的话,这样是不是可以呢?
TO cuilj (往上爬) :
我不知道你这样做的目的是什么。
一个应用程序只能有一个主窗体,一般来说,.dpr中建立的form1就是
主窗体,其它的窗体只能自己编写代码实现、维护。
在DELPHI中所有的对象实际上都是指针,就象C中指针。
而调用对象的create方法就是生成对象的实例,比如说
formx:=tformx.create(nil);
就象C中的int *p;
p:=(int *)malloc(sizeof(int));
按照你的意思:
第1个窗体中的button1onclick中动态创建窗体2,并显示,此时释放form1。
第1个窗体中的button2onclick中动态创建窗体3,并显示,此时释放form1。就是:
procudure TForm1.Button1click(Sender:TObject);
var form2:TForm2;
begin
form2:=TFomr2.create(self);
form2.showmodal;
form1.free;
end;
procudure TForm1.Button2click(Sender:TObject);
var form3:TForm3;
begin
form3:=TFomr3.create(self);
form3.showmodal;
form1.free;
end;
那么我请问,你已经在Button1OnClick中将form1释放了,
在Button2OnClick中你还能释放form1吗?
而且,你自己建立的form2,form3还没释放呢,资源由谁来回收呢?
这就跟在C中
int function1()
{
int *p;
p=(int *)malloc(sizeof(int));
}
int function2()
{
int *q;
q=(int *)malloc(sizeof(int));
}
那么这些资源怎么办呢?
所以你的做法是错误的,正确的做法应该是:
procudure TForm1.Button1click(Sender:TObject);
var form2:TForm2;
begin
form2:=TFomr2.create(self);
form2.showmodal;
form2.free;
end;
procudure TForm1.Button2click(Sender:TObject);
var form3:TForm3;
begin
form3:=TFomr3.create(self);
form3.showmodal;
form3.free;
end;
或者使用全局对象,即form2,form3 不在按钮的单击事件中声明
而是声明成全局对象,不然,我们是没办法在其它的地方访问TFomr2.create(self)和TFomr3.create(self)所建立的对象的
**********************************************************
to prometheusphinx(白日梦) :
我觉得你的做法跟上面的一样,第1个窗体中的button1onclick中动态创建窗体2,并显示,此时释放form1。
1、form2 := TForm2.Create(Application);
Free;
form2.Show;第1个窗体中的button2onclick中动态创建窗体3,并显示,此时释放form1。
2、form3 := TForm3.Create(Application);
Free;
Form3.Show;
在1中已经将form1给释放了,在2中还能释放form1吗?因为这里的两次调用free
实际上是form1.free;
*********************************
to qhdsfh(飞翔的鹰) :
你这样做很不安全,也是对同一个对象form1使用了两次free方法,会没问题吗?关键是提问的那位,我不知道你到底要实现什么目的,如果我说错了,欢迎大家
纠正!mail:[email protected]
form2:tform2;
begin
form2:=tform2.create(application);//创建窗体form2
try
//dosomething
finally
form2.free;//为释放掉form2
end;
其他的类似这样的,
具体可以参考delphi的帮助文件!!
procedure form1.button1click;
begin
form2 := TForm2.Create(self);
form2.Showmodal;
form1.Free;
end;
我现在先讨论只有两个窗体的情况。
现在form1是主窗体,form2是显示出来了,form1是不见了。
但当你关闭form2的时候,应用程序是否关闭了吗?
当你按F9运行时,关闭form2时你就可以知道程序是否还在运行。
同时如果你用“任务管理器“查看时就知道程序并没有结束。
可见此方法是不行的。
便把新创建的 Form1 作为主 Form,根据这个原理,可如下实现:
Form1中的按钮事件
//创建Form2,释放Form1
If Not Assgined(Form2) Then //或If form2=nil then
Begin
Application.CreateForm(TForm2,Form2);
Self.Free;//Form1.Free;
Form2.ShowModal;
End;//创建Form3,释放Form1
If Not Assgined(Form3) Then //或If form3=nil then
Begin
Application.CreateForm(TForm3,Form3);
Self.Free;//Form1.Free;
Form3.ShowModal;
End;
//最好在三个窗体的Close,Destory中分别编写如下事件:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action := cafree;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
form1 :=nil;
end;//创建Form1,释放Form2
if Form1 = Nil then
begin
Application.CreateForm(TForm1,Form1);
form2.free;
form1.showmodal;
End;//创建Form1,释放Form3
if Form1 = Nil then
begin
Application.CreateForm(TForm1,Form1);
form3.free;
form1.showmodal;
End;