procedure Tpayfrm.Button3Click(Sender: TObject);
begin
with datamodule5.ADOQuery1 do
begin
if modified then
begin
if messagedlg(' 数据以修改,是否保存?',mtconfirmation,[mbyes,mbno],0)=mryes then
post;
end;end;
payfrm.close;
payfrm:=tpayfrm.Create(self);
payfrm.ShowModal;
end;执行以后,新窗体可创建,可是旧窗体不消失,关闭新窗体时,旧窗体才同时消失。为什么?
如果用PAYFRM。FREE,旧窗体会消失,但关闭程序时会出错

解决方案 »

  1.   

    我的代码:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls,Unit2;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      payfrm:TForm2;
    implementation{$R *.dfm}
    procedure TForm1.Button2Click(Sender: TObject);begin
      payfrm.Free;//不管用Free还是Close都不出问题
      payfrm:=TForm2.Create(self);
      payfrm.Show;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      payfrm:=TForm2.Create(self);
      payfrm.Show;
    end;end.
      

  2.   

    on FormDestroy even add ;
      payfrm := nil;
      

  3.   

    你在调用窗体的时候 需要自己调用(create) 并且释放了(free)
      

  4.   

    payfrm.free;
    payfrm:=tpayfrm.Create(self);
    payfrm.ShowModal;
      

  5.   

    最好不要在类的成员函数中destroy自己。
      

  6.   

    to firetoucher(风焱) 
    FREE会出错啊
      

  7.   

    加这个procedure Tpayfrm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action := acFree;
      payfrm := nil;
    end;
      

  8.   

    1. 菜单Project -> Options -> Forms  把payfrm从Auto-createForm 移到 avialiableform
    即可
    2.
    procedure Tpayfrm.Button3Click(Sender: TObject);
    begin
    with datamodule5.ADOQuery1 do
    begin
    if modified then
    begin
    if messagedlg(' 数据以修改,是否保存?',mtconfirmation,[mbyes,mbno],0)=mryes then
    post;
    end;end;
    payfrm.close;
    payfrm.free;
    payfrm:=tpayfrm.Create(self);
    payfrm.ShowModal;
    payfrm.free;
    end;
      

  9.   

    TO ronaldli(木的) 
    不行啊。
      

  10.   

    用freeandnil(payfrm);
    相当于payfrm.free; payfrm:=nil;
      

  11.   

    to zhanghw20030303(xiaoxiao) 
    试下2先
      

  12.   

    不知道你为什么把当前窗体关闭了又创建,为了刷新数据集?
    你在payfrm.close;之前加上两句看看
    payfrm.Visible :=false;
    payfrm.Update;并且好像你每次都创建了窗体对象,浪费资源,不知释放了没有
      

  13.   

    加什么也没用
    因为你用 payfrm.ShowModal;
    所以其后面的代码在payfrm关闭之前都是不执行的。既:你关闭的窗口代码还没执行完,当然不会没。如果你只是不想看到可以用 payfrm.Hide;如果用你用PayFrm.Show应该是没问题的。呵呵
      

  14.   

    procedure TForm1.Button2Click(Sender: TObject);begin
      if assigned(payfrm) then
         FreeAndNil(payFrm);
      payfrm:=TForm2.Create(Application);
      payfrm.Show;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      payfrm:=TForm2.Create(Application);
      payfrm.Show;
    end;
      

  15.   

    TO xuejinlong(-@判官@-) 
    FREE的话,有用,但是关闭整个程序出错
     TO  yk1028() 
    的确为刷新数据,控件太多了
      

  16.   

    TO  prosectinfo(有问题) 
    我要显示模式窗体啊
      

  17.   

    刷新数据你可以重新Show呀.OnShow.
      

  18.   

    晕。。
    在ONSHOW中
    PAYFRM。UPDATE?
      

  19.   

    呵呵,知道,你在自己类的代码里自己释放自己
    不要刚这段代码作为类的函数,
    procedure Tpayfrm.Button3Click(Sender: TObject);
    begin
      myfunction(PAYFRM);
    end;用
    procedure  MyFunction(Sender: Tpayfrm);
    begin
    ...
      

  20.   

    TO  xuejinlong(-@判官@-) 
    老大,你误解了,我的主要目的是更新窗体,不是数据:(TO firetoucher(风焱) ( ) 
    等我TEST看
      

  21.   

    FreeAndNil(payFrm);
    没问题呀!!!