首页 > 其他分享 >delphi中FormDestroy和FormClose的区别和联系

delphi中FormDestroy和FormClose的区别和联系

时间:2023-10-05 11:33:05浏览次数:32  
标签:begin FormDestroy end delphi FormClose 窗体 关闭

在Delphi中,FormDestroyFormClose 是用于处理窗体关闭事件的两个不同的事件处理程序。它们有一些区别和联系,下面我将详细解释它们之间的差异和关联:

FormDestroy 事件:

  • FormDestroy 事件是一个在窗体销毁时触发的事件。
  • 这个事件通常用于释放在窗体生命周期内创建的资源,如对象、数据结构、内存分配等。
  • 当窗体关闭时,窗体的 OnDestroy 事件处理程序将被触发。
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      // 在这里执行资源释放的操作
    end;

     

FormClose 事件:

 

  • FormClose 事件是一个在窗体即将关闭时触发的事件。
  • 这个事件通常用于询问用户是否保存未保存的更改、执行清理操作、防止窗体关闭等。
  • FormClose 事件有一个 Action 参数,可以设置为 caNone(取消关闭)、caHide(隐藏窗体)、caFree(销毁窗体)等不同的值,用于确定窗体的关闭行为。
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      // 在这里执行窗体关闭相关的操作,如保存数据或者取消关闭
      if not DataIsSaved then
      begin
        if MessageDlg('是否保存更改?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
        begin
          // 保存数据
          SaveData;
        end
        else
        begin
          // 取消关闭窗体
          Action := caNone;
        end;
      end;
    end;

     

联系和关系:

  • FormClose 事件通常在窗体即将关闭时触发,可以用来处理关闭窗体前的逻辑,包括询问用户是否保存数据、执行清理操作等。
  • FormDestroy 事件在窗体销毁时触发,用于释放资源。通常,FormDestroy 事件会在 FormClose 事件之后触发,因为窗体关闭时会导致窗体最终被销毁。
  • 如果你需要在窗体关闭时进行资源释放,通常会在 FormDestroy 事件中执行,而在 FormClose 事件中处理用户是否取消关闭等交互逻辑。
  • 你可以通过 Action 参数来控制窗体关闭的行为,例如,你可以在 FormClose 事件中将 Action 设置为 caNone 来取消关闭窗体,或者设置为 caFree 来销毁窗体。

总之,FormDestroy FormClose 事件是在Delphi窗体中管理关闭和销毁的两个重要事件,它们允许你在窗体关闭前和窗体销毁时执行特定的操作。

 

以下是使用Delphi中的 FormDestroyFormClose 事件的应用示例:

示例 1:资源释放和关闭确认

假设你有一个编辑器窗体,用户可以在其中编辑文本。当用户关闭窗体时,你想询问他们是否保存更改,并在窗体销毁时释放资源。

procedure TTextEditorForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  // 在窗体关闭前询问用户是否保存更改
  if not DataIsSaved then
  begin
    if MessageDlg('是否保存更改?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
    begin
      SaveData;
    end;
  end;
end;

procedure TTextEditorForm.FormDestroy(Sender: TObject);
begin
  // 释放资源,如释放文本编辑器所用的内存
  FreeEditorResources;
end;

 

这个示例中,在 FormClose 事件中,我们询问用户是否保存更改,并根据用户的选择来决定是否执行保存操作或取消窗体的关闭。在 FormDestroy 事件中,我们释放了与文本编辑器相关的资源。

示例 2:防止窗体关闭

假设你有一个设置窗体,用户可以在其中更改应用程序的设置。你想要确保用户不会意外关闭窗体而没有保存更改。

procedure TSettingsForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  // 在窗体关闭前检查是否有未保存的更改
  if HasUnsavedChanges then
  begin
    if MessageDlg('是否保存更改?', mtWarning, [mbYes, mbNo, mbCancel], 0) = mrYes then
    begin
      SaveChanges;
    end
    else
    begin
      // 取消关闭窗体
      Action := caNone;
    end;
  end;
end;

在这个示例中,如果用户在设置窗体上进行了更改并试图关闭窗体,我们会询问他们是否保存更改。如果他们选择是,我们会保存更改并允许窗体关闭。如果他们选择取消,我们将通过将 Action 设置为 caNone 阻止窗体的关闭。这样可以确保用户不会意外关闭窗体而没有保存更改。

标签:begin,FormDestroy,end,delphi,FormClose,窗体,关闭
From: https://www.cnblogs.com/mmii/p/17743177.html

相关文章

  • Delphi dll 传递字符串
    //dllcodeuses//ShareMem,SysUtils,Windows,Math;{$R*.res}functionTestString1(Buffer:PChar):PChar;stdcall;varTmpstr:string;begintryTmpstr:=Buffer;ifTmpstr<>''thenbeginResult:=StrAlloc(Length......
  • delphi泛型模板编程
    delphi泛型模板编程泛型模板编程的关键:泛型作用体现在模板,体现在虚实之间相互转换,以虚概实,以实就虚。unitTxInfo;interfaceusesSystem.Types,System.Classes,System.SysUtils,Generics.Collections;typeTPeople=recordName:string;Age:str......
  • 恢复Delphi工具栏
    打开注册表,找到下面项,把Toolbars删除!计算机\HKEY_CURRENT_USER\SOFTWARE\Embarcadero\BDS\22.0\Toolbars 重新进入Delphi,恢复默认状态!如下图的状态,删除后,恢复了! ......
  • Delphi:cxGrid的使用方法
    Delphi:cxGrid的使用方法1.去掉cxgrid中抬头的box,在tableview1的ptionsview的groupbybox=false;2.在GRIDfooter中加入sum(列),tableview1的optionsview的footer=ture然后在cxGRid1的customize中的summary的footer.add需要合计的列kind=skSum3.去掉cxgrid中的过滤下拉......
  • delphi Base64转换(加密、解密)
    Base64转换(加密、解密)代码字符串加密、解密usesSystem.NetEncoding;procedureTForm1.Button1Click(Sender:TObject);varstr1,str2:string;begin//加密str1:=TNetEncoding.Base64.Encode('测试数据');Memo1.Lines.Add('加密数据'+str1);//解密s......
  • Delphi XE 时间和时间戳互转换
    usesSystem.DateUtils;functionTForm1.Gettamptime(vlen:Integer):string;varss:string;beginifvlen=13thenbeginss:=DateTimeToTimeStamp(now).time.ToString;Result:=IntToStr(DateTimeToUnix(Now,false))+Copy(ss,Length(ss)-......
  • delphi JSON序列化(四)
    {TDateTimeConverter}functionTDateTimeConverter.CanConvert(ATypeInf:PTypeInfo):Boolean;beginResult:=True;end;functionTDateTimeConverter.ReadJson(constAReader:TJsonReader;ATypeInf:PTypeInfo;constAExistingValue:TValue;constASerial......
  • delphi 操作INI文件
    转载自: delphi读写INI文件_delphi写数据到ini_苏生米沿的博客-CSDN博客Delphi提供了读写INI文件的方法,Delphi操作INI文件最为简洁,这是因为Delphi提供了一个TInifile类,使我们可以非常灵活的处理INI文件。  一、INI文件的结构:;注释[小节名]关键字=值...INI文件允许有多个小节,......
  • Delphi EOL Program
    1.语言代码,德语为Windows-1252Windows-1252 或 CP-1252 是拉丁字母的字元编码,主要用于英文、爱尔兰语、意大利语、挪威语、葡萄牙语、西班牙语、瑞典语以及德语、芬兰语、冰岛语、法语、荷兰语(除了IJ字符)、斯洛文尼亚语(除了č字符)等西方文字版本 MicrosoftWindows 的预......
  • GOLANG:调用delphi7编写的dll
    0. delphi对winapi有很强的封装,使其更易用。1.delphi声明dll内函数需要尽量以此方式: proceduretest(data:pchar;count:integer);stdcall;2.golang调用方法:str:=[]byte("abcdedf")printTextDll:=syscall.NewLazyDLL("demo.dll")printBytes:=p......