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

Maw*_*awg 1 delphi

用户坚持在应用程序中为每个"重要事件"弹出一个框.在备忘录或列表框中添加一行是不可接受的.

我使用标准模式盒bceuase PC通常是未经过的,我的应用程序将等待用户在继续之前单击"确定".

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

我试过了,当点击OK时我遇到了访问冲突.

问题:

  • 是否需要启动一个线程来显示表单,因为它是无模式显示的?
  • 我应该传递什么作为构造函数参数(prent)?没有,因为形式将自己毁灭?
  • 当用户点击OK我应该拨打什么?关闭()或免费()?单击"确定"后,这些中的任何一个都会在大约1/2秒内发出访问冲突,但如果我在函数中没有执行任何操作,则代码运行正常(当然,内存泄漏)

谷歌没有那么有用,因为形式应该自我毁灭,而例子有它的创造者摧毁它.


主要形式:

     theDialogForm := TDialogFormForm.Create(Nil);
     theDialogForm.ShowTheForm('Database error '+#13+#10+''+#13+#10+
                E.ClassName+#13+#10+
                E.Message);
Run Code Online (Sandbox Code Playgroud)

和对话形式......

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.
Run Code Online (Sandbox Code Playgroud)

调用堆栈

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
Run Code Online (Sandbox Code Playgroud)

Gol*_*rol 7

要关闭表单,您可以

  • 通过在OnClose事件中调用Close并设置操作来关闭它caFree
  • Release,这是一种特殊的自由风味,特别适用于表格.

调用的问题Free是,当您仍然在关闭按钮上处理click事件时,表单会立即释放.在该过程中,表单和因此按钮被释放,导致访问冲突.Release在内部向表单发送消息,使其处理单击关闭.