我想在某一窗体關閉時,實現某一行動.
procedure TForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin;;;;;;;;;;;;;;;end;如果點擊關閉按鈕 沒問題.
但如果程序最小化時,右鍵關閉,此代碼不執行.是什麽原因?如何讓程序關閉前執行以上代碼?

解决方案 »

  1.   

    procedure TForm1.FormDestroy(Sender: TObject);
    begin;;;;;;;;;;;;;;;end;
      

  2.   

    最小化右键关闭应该是windows系统行为,所以与程序代码无关,是强行中断
      

  3.   

    实际上无论你采取什么样的关闭方式
    上面的代码都会执行
    不信的话,你可以加上代码
    ShowMessage('退出');试试我估计你是其它的地方出现了错误
    达不到预期的结果
      

  4.   

    SilveryFox(银狐):
    那如何讓程序判斷是強行中斷,而實現代馬? My_first(海浪):
    “action:=cafree“ 好像在屬性欄内添加不進去。
      

  5.   

    hansome(连环) :
    我剛試過,沒有執行!
      

  6.   

    我试过了
    好象可以执行啊!?
    写在closequery试试!!
      

  7.   

    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
        form2.m2adotable2.open;
       case num of
        0:   begin
                form2.m2adotable2.edit;
                form2.m2adotable2.Fields[0].AsString:='0';
                form2.m2adotable2.post;
                form2.m2adotable2.Close;
                end;      1: begin
                form2.m2adotable2.edit;
                form2.m2adotable2.Fields[1].AsString:='0';
                form2.m2adotable2.post;
                form2.m2adotable2.Close;
               end;
         .........................................
    end;
      

  8.   

    最小化時右鍵關閉是WINDOWS系统消息,这是Delphi的bug,没有将这一消息体现在FormClose事件中,只能这样补救:

    protected
       procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
    procedure TMainForm.WMSysCommand(var Message: TWMSysCommand);
    begin
      case Message.CmdType of
        SC_CLOSE:
        begin
          FormClose(Self,); 
        end else inherited;
      end;
    end;一切OK了!
      

  9.   

    我在程序中加入以下代碼:procedure TForm1.FormDestroy(Sender: TObject);
    begin
      showmessage('aaaa');
    end;關閉程序,也未執行!
      

  10.   

    又發現奇怪的事情:
    我用ALT+F4 關閉程序,代碼還是會執行的,而右鍵關閉的快捷方式也是ALT+F4,
    但不執行.哇,快瘋了!
      

  11.   

    Borlandor(五角▲大民): 我對window内部的編程還很陌生, 能否再說清楚一點?此代碼放在那邊?
      

  12.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TForm1 = class(TForm)
        {.....}
      private
        {.....}
      protected
        procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
      public
        {.....}
      end;...implementation
    ...procedure TMainForm.WMSysCommand(var Message: TWMSysCommand);
    begin
      case Message.CmdType of
        SC_CLOSE:
        begin
          FormClose(Self,); 
        end else inherited;
      end;
    end;...你明白了?
      

  13.   

    CloneCenter(复制中心):
    我試過了 不行。
      

  14.   

    Borlandor(五角▲大民):抱歉,能不能全部完整,我確實沒有全看明白.我再給你兩百分!
      

  15.   

    别的方法都不行,不要瞎弄了,浪费时间,除非你修改Delphi的消息分发机制
      

  16.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Buttons, ExtCtrls, StdCtrls, DBCtrls, Mask, Grids, DBGrids,
      ComCtrls, Menus, DB, ADODB, jpeg, OleCtrls;type
      TForm1 = class(TForm)
        Panel1: TPanel;
        Panel2: TPanel;
        Panel3: TPanel;
        Panel4: TPanel;
        SpeedButton1: TSpeedButton;
        SpeedButton2: TSpeedButton;
        SpeedButton4: TSpeedButton;
        Label1: TLabel;
        Label2: TLabel;
        m1DBEdit1: TDBEdit;
        m1DBEdit2: TDBEdit;
        m1DBEdit5: TDBEdit;
        m1DBEdit4: TDBEdit;
        Label3: TLabel;
        Label4: TLabel;
        Label5: TLabel;
        m1DBImage1: TDBImage;
        Label6: TLabel;
        m1DBEdit6: TDBEdit;
        Label7: TLabel;
        SpeedButton5: TSpeedButton;
        m1DBEdit7: TDBEdit;
        DBText1: TDBText;
        Label8: TLabel;
        DBText2: TDBText;
        Label9: TLabel;
        Panel5: TPanel;
        Panel6: TPanel;
        SpeedButton6: TSpeedButton;
        Panel7: TPanel;
        Panel8: TPanel;
        Panel9: TPanel;
        MainMenu1: TMainMenu;
        Panel12: TPanel;
        N5: TMenuItem;
        N6: TMenuItem;
        N4: TMenuItem;
        N7: TMenuItem;
        N8: TMenuItem;
        N9: TMenuItem;
        Edit1: TMenuItem;
        N10: TMenuItem;
        N12: TMenuItem;
        N13: TMenuItem;
        N14: TMenuItem;
        N15: TMenuItem;
        N16: TMenuItem;
        N18: TMenuItem;
        N20: TMenuItem;
        N1: TMenuItem;
        SpeedButton3: TSpeedButton;
        N2: TMenuItem;
        m1ADOConnection1: TADOConnection;
        m1ADOTable1: TADOTable;
        m1DataSource1: TDataSource;
        OpenDialog1: TOpenDialog;
        Panel10: TPanel;
        Panel11: TPanel;
        Panel14: TPanel;
        Panel13: TPanel;
        Panel15: TPanel;
        Panel16: TPanel;
        Panel17: TPanel;
        Panel18: TPanel;
        Panel19: TPanel;
        Panel20: TPanel;
        Panel21: TPanel;
        Panel22: TPanel;
        Panel23: TPanel;
        DBGrid1: TDBGrid;
        m1ADOTable1DSDesigner: TWideStringField;
        m1ADOTable1DSDesigner2: TWideStringField;
        m1ADOTable1DSDesigner3: TWideStringField;
        m1ADOTable1DSDesigner4: TWideStringField;
        m1ADOTable1DSDesigner5: TFloatField;
        m1ADOTable1DSDesigner6: TFloatField;
        m1ADOTable1DSDesigner7: TFloatField;
        m1ADOTable1DSDesigner8: TBlobField;
        SpeedButton7: TSpeedButton;
        SpeedButton8: TSpeedButton;
        m1DBEdit3: TDBEdit;
        Label10: TLabel;
        Label11: TLabel;
        Label12: TLabel;
        procedure SpeedButton1Click(Sender: TObject);
        procedure SpeedButton2Click(Sender: TObject);
        procedure SpeedButton3Click(Sender: TObject);
        procedure SpeedButton4Click(Sender: TObject);
        procedure SpeedButton5Click(Sender: TObject);
        procedure fsd1Click(Sender: TObject);
        procedure fsdafg1Click(Sender: TObject);
        procedure N3Click(Sender: TObject);
        procedure N4Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure N13Click(Sender: TObject);
        procedure N14Click(Sender: TObject);
        procedure N15Click(Sender: TObject);
        procedure N18Click(Sender: TObject);
        procedure N16Click(Sender: TObject);
        procedure N2Click(Sender: TObject);
        procedure FormShow(Sender: TObject);
        procedure N9Click(Sender: TObject);
        procedure m1DBImage1DblClick(Sender: TObject);
        procedure SpeedButton6Click(Sender: TObject);
        procedure SpeedButton7Click(Sender: TObject);
        procedure SpeedButton8Click(Sender: TObject);
        procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
          DataCol: Integer; Column: TColumn; State: TGridDrawState);
        procedure N6Click(Sender: TObject);
        procedure m1ADOTable1AfterPost(DataSet: TDataSet);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      num:integer;
    implementationuses Unit4, Unit7, Unit2, Unit8, Unit5, Unit6, Unit9;{$R *.dfm}procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
            form2.m2adotable2.open;
       case num of
        0:   begin
                form2.m2adotable2.edit;
                form2.m2adotable2.Fields[0].AsString:='0';
                form2.m2adotable2.post;
                form2.m2adotable2.Close;
                end;      1: begin
                form2.m2adotable2.edit;
                form2.m2adotable2.Fields[1].AsString:='0';
                form2.m2adotable2.post;
                form2.m2adotable2.Close;
               end;
           2: begin
               form2.m2adotable2.edit;
               form2.m2adotable2.Fields[2].AsString:='0';
               form2.m2adotable2.post;
               form2.m2adotable2.Close;
               end;
            3: begin
                form2.m2adotable2.edit;
                form2.m2adotable2.Fields[3].AsString:='0';
                form2.m2adotable2.post;
                form2.m2adotable2.Close;
               end;       4: begin
                form2.m2adotable2.edit;
                form2.m2adotable2.Fields[4].AsString:='0';
                form2.m2adotable2.post;
                form2.m2adotable2.Close;
               end;
           end;  Form2.Close;
    end;
      

  17.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Buttons, ExtCtrls, StdCtrls, DBCtrls, Mask, Grids, DBGrids,
      ComCtrls, Menus, DB, ADODB, jpeg, OleCtrls;type
      TForm1 = class(TForm)
        Panel1: TPanel;
        Panel2: TPanel;
        Panel3: TPanel;
        Panel4: TPanel;
        SpeedButton1: TSpeedButton;
        SpeedButton2: TSpeedButton;
        SpeedButton4: TSpeedButton;
        Label1: TLabel;
        Label2: TLabel;
        m1DBEdit1: TDBEdit;
        m1DBEdit2: TDBEdit;
        m1DBEdit5: TDBEdit;
        m1DBEdit4: TDBEdit;
        Label3: TLabel;
        Label4: TLabel;
        Label5: TLabel;
        m1DBImage1: TDBImage;
        Label6: TLabel;
        m1DBEdit6: TDBEdit;
        Label7: TLabel;
        SpeedButton5: TSpeedButton;
        m1DBEdit7: TDBEdit;
        DBText1: TDBText;
        Label8: TLabel;
        DBText2: TDBText;
        Label9: TLabel;
        Panel5: TPanel;
        Panel6: TPanel;
        SpeedButton6: TSpeedButton;
        Panel7: TPanel;
        Panel8: TPanel;
        Panel9: TPanel;
        MainMenu1: TMainMenu;
        Panel12: TPanel;
        N5: TMenuItem;
        N6: TMenuItem;
        N4: TMenuItem;
        N7: TMenuItem;
        N8: TMenuItem;
        N9: TMenuItem;
        Edit1: TMenuItem;
        N10: TMenuItem;
        N12: TMenuItem;
        N13: TMenuItem;
        N14: TMenuItem;
        N15: TMenuItem;
        N16: TMenuItem;
        N18: TMenuItem;
        N20: TMenuItem;
        N1: TMenuItem;
        SpeedButton3: TSpeedButton;
        N2: TMenuItem;
        m1ADOConnection1: TADOConnection;
        m1ADOTable1: TADOTable;
        m1DataSource1: TDataSource;
        OpenDialog1: TOpenDialog;
        Panel10: TPanel;
        Panel11: TPanel;
        Panel14: TPanel;
        Panel13: TPanel;
        Panel15: TPanel;
        Panel16: TPanel;
        Panel17: TPanel;
        Panel18: TPanel;
        Panel19: TPanel;
        Panel20: TPanel;
        Panel21: TPanel;
        Panel22: TPanel;
        Panel23: TPanel;
        DBGrid1: TDBGrid;
        m1ADOTable1DSDesigner: TWideStringField;
        m1ADOTable1DSDesigner2: TWideStringField;
        m1ADOTable1DSDesigner3: TWideStringField;
        m1ADOTable1DSDesigner4: TWideStringField;
        m1ADOTable1DSDesigner5: TFloatField;
        m1ADOTable1DSDesigner6: TFloatField;
        m1ADOTable1DSDesigner7: TFloatField;
        m1ADOTable1DSDesigner8: TBlobField;
        SpeedButton7: TSpeedButton;
        SpeedButton8: TSpeedButton;
        m1DBEdit3: TDBEdit;
        Label10: TLabel;
        Label11: TLabel;
        Label12: TLabel;
        procedure SpeedButton1Click(Sender: TObject);
        procedure SpeedButton2Click(Sender: TObject);
        procedure SpeedButton3Click(Sender: TObject);
        procedure SpeedButton4Click(Sender: TObject);
        procedure SpeedButton5Click(Sender: TObject);
        procedure fsd1Click(Sender: TObject);
        procedure fsdafg1Click(Sender: TObject);
        procedure N3Click(Sender: TObject);
        procedure N4Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure N13Click(Sender: TObject);
        procedure N14Click(Sender: TObject);
        procedure N15Click(Sender: TObject);
        procedure N18Click(Sender: TObject);
        procedure N16Click(Sender: TObject);
        procedure N2Click(Sender: TObject);
        procedure FormShow(Sender: TObject);
        procedure N9Click(Sender: TObject);
        procedure m1DBImage1DblClick(Sender: TObject);
        procedure SpeedButton6Click(Sender: TObject);
        procedure SpeedButton7Click(Sender: TObject);
        procedure SpeedButton8Click(Sender: TObject);
        procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
          DataCol: Integer; Column: TColumn; State: TGridDrawState);
        procedure N6Click(Sender: TObject);
        procedure m1ADOTable1AfterPost(DataSet: TDataSet);
      private
        { Private declarations }
      protected
        procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      num:integer;
    implementationuses Unit4, Unit7, Unit2, Unit8, Unit5, Unit6, Unit9;{$R *.dfm}procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
            form2.m2adotable2.open;
       case num of
        0:   begin
                form2.m2adotable2.edit;
                form2.m2adotable2.Fields[0].AsString:='0';
                form2.m2adotable2.post;
                form2.m2adotable2.Close;
                end;      1: begin
                form2.m2adotable2.edit;
                form2.m2adotable2.Fields[1].AsString:='0';
                form2.m2adotable2.post;
                form2.m2adotable2.Close;
               end;
           2: begin
               form2.m2adotable2.edit;
               form2.m2adotable2.Fields[2].AsString:='0';
               form2.m2adotable2.post;
               form2.m2adotable2.Close;
               end;
            3: begin
                form2.m2adotable2.edit;
                form2.m2adotable2.Fields[3].AsString:='0';
                form2.m2adotable2.post;
                form2.m2adotable2.Close;
               end;       4: begin
                form2.m2adotable2.edit;
                form2.m2adotable2.Fields[4].AsString:='0';
                form2.m2adotable2.post;
                form2.m2adotable2.Close;
               end;
           end;  Form2.Close;end;
    procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
    var CloseAction:TCloseAction;
    begin
      case Message.CmdType of
        SC_CLOSE:
        begin
          CloseAction := caNone;
          FormClose(Self,CloseAction);
        end else inherited;
      end;
    end;
      

  18.   

    若主窗体是form2,这样,100%成功:TForm2 = class(TForm)
      {pulished fields}
      private
        { Private declarations }
      protected
        procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
      public
        { Public declarations }
      end;var
      Form2: TForm2;implementationuses Unit1;procedure TForm2.WMSysCommand(var Message: TWMSysCommand);
    var CloseAction:TCloseAction;
    begin
      case Message.CmdType of
        SC_CLOSE:
        begin
          CloseAction := caNone;
          Form1.FormClose(Form1,CloseAction);
        end else inherited;
      end;
    end;
      

  19.   

    action:=cafree;
    放在那邊?
    我在事件框内放不進去
      

  20.   

    “TForm2 = class(TForm)“好像有錯誤阿錯誤: "Exepected ":"but '='found
    可我加了':'還是不行啊
      

  21.   

    搞定了吗?昨晚CSDN死了。
    type
      TForm2 = class(TForm)
    放在Form2所在单元。
      

  22.   

    我试了。delphi6.0 中写的程序最小化后,点击右键可以关闭。
      

  23.   

    下面,主窗口为Form2,从窗口为Form1:{------------------------ Form2---------------------- }
    unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm2 = class(TForm)
        Button1: TButton;
        procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
      private
        { Private declarations }
      protected
        procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
      public
        { Public declarations }
      end;var
      Form2: TForm2;implementationuses Unit1;{$R *.dfm}procedure TForm2.WMSysCommand(var Message: TWMSysCommand);
    begin
      case Message.CmdType of
        SC_CLOSE:
        begin
          ShowMessage('Closed Form2 by system!');
          inherited;
        end else inherited;
      end;
    end;procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
      ShowMessage('Closed Form2 by self!');
      CanClose := TRUE;
      Form1.Close;//这句比较关键!!
    end;end.
    {------------------------ Form1---------------------- }
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
      protected
        procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
    begin
      case Message.CmdType of
        SC_CLOSE:
        begin
          ShowMessage('Closed Form1 by system!');
          inherited;
        end else inherited;
      end;
    end;
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      ShowMessage('Closed Form1 by self!');
    end;end.
      

  24.   

    謝謝 !我可能有些地方和你的例子不同。
    我的程序時這樣的:
    form2為主窗口(一個登陸窗口,登陸成功后,我將它隱藏),登陸進入
    form1内.
    所以關閉程序時是關閉form1。
    在procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
     form2.close;
    end;