delphi - 如何创建无模式对话框并在用户单击确定时将其关闭?

标签 delphi

用户坚持为应用程序中的每个“重要事件”提供一个弹出框。在备忘录或列表框中添加一行是 Not Acceptable 。

我不能使用标准模式框,因为 PC 经常无人看管,我的应用程序将等待用户单击“确定”,然后再继续。

我可以动态地创建一个带有备忘录组件和一个确定按钮的表单并传递一些文本以显示在备忘录中吗?

我试过了,当点击确定时我遇到了访问冲突。

问题:

  • 是否需要启动线程来显示表单,因为它是无模式显示的?
  • 我应该传递什么作为构造函数参数(prent)?无,因为形式会自我毁灭?
  • 当用户单击确定时,我应该怎么称呼?关闭()或免费()?在单击“确定”后大约 1/2 秒,其中任何一个都会导致访问冲突,但如果我在函数中什么都不做,则代码运行良好(当然存在内存泄漏)

  • 谷歌并没有那么有用,因为表单应该自我毁灭,而示例却让其创建者破坏它。

    主要形式:
         theDialogForm := TDialogFormForm.Create(Nil);
         theDialogForm.ShowTheForm('Database error '+#13+#10+''+#13+#10+
                    E.ClassName+#13+#10+
                    E.Message);
    

    和对话框形式...
    unit fDialogForm;
    
    interface
    
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
      System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
    
    type
      TDialogFormForm = class(TForm)
        Memo1: TMemo;
        OkButton: TButton;
        procedure OkButtonClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
          procedure ShowTheForm(const theMessage : String);
      end;
    
    implementation
    
    {$R *.dfm}
    
    // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
    procedure TDialogFormForm.FormCreate(Sender: TObject);
    begin
       Visible := False;
    end;
    
    // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
    procedure TDialogFormForm.OkButtonClick(Sender: TObject);
    begin
    //   Close();
       Free();
    end;
    
    // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
    procedure TDialogFormForm.ShowTheForm(const theMessage : String);
    begin
       Memo1.Text := theMessage;
       Show();
    end;
    
    end.
    

    调用栈
    main thread ($630):
    005164e3 +013 StoreRoom.exe Vcl.Controls          TControl.WMLButtonUp
    00515b30 +2d4 StoreRoom.exe Vcl.Controls          TControl.WndProc
    0051a47b +5b3 StoreRoom.exe Vcl.Controls          TWinControl.WndProc
    00537bf0 +06c StoreRoom.exe Vcl.StdCtrls          TButtonControl.WndProc
    00519ad0 +02c StoreRoom.exe Vcl.Controls          TWinControl.MainWndProc
    0048dea4 +014 StoreRoom.exe System.Classes        StdWndProc
    76677885 +00a USER32.dll                          DispatchMessageW
    005b7c63 +0f3 StoreRoom.exe Vcl.Forms             TApplication.ProcessMessage
    005b7ca6 +00a StoreRoom.exe Vcl.Forms             TApplication.HandleMessage
    005b7fd9 +0c9 StoreRoom.exe Vcl.Forms             TApplication.Run
    00823616 +17a StoreRoom.exe StoreRoom      56 +24 initialization
    75c43398 +010 kernel32.dll                        BaseThreadInitThunk
    

    最佳答案

    要关闭表单,您可以

  • 通过调用 Close 关闭它并将操作设置为 caFree在 OnClose 事件中
  • 调用Release , 这是 Free 的一种特殊风格,尤其是对于表单。

  • 调用 Free 的问题, 是立即释放表单,而您仍在处理关闭按钮上的单击事件。在该过程中,表单和按钮被释放,导致访问冲突。 Release在内部向表单发送一条消息,使其在处理点击后关闭。

    关于delphi - 如何创建无模式对话框并在用户单击确定时将其关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12475252/

    相关文章:

    c++ - 如何将 D3DCOLORVALUE 转换为 delphi tcolor

    regex - Delphi PCRE/正则表达式实现和堆栈溢出

    delphi - 如何在启用 VCL 样式的情况下为 TComboBox 的背景着色

    delphi - 从接口(interface)获取子接口(interface)

    德尔福RTTI : Get property's class

    delphi - WMMouseWheel 在 Delphi 中不工作

    delphi - 使用 Indy 和 Delphi 7 从 protected 网页获取 html 源时出现问题

    delphi - 如何检查 OleInitialize 是否已被调用?

    delphi - 列表中的对象需要访问父列表属性

    delphi - 为动态按钮创建一个新的 btnClick 过程