ユーザーは、アプリケーション内の「重要なイベント」ごとにポップアップ ボックスを要求します。メモまたはリスト ボックスに行を追加することは受け入れられません。
PC が無人であることが多いため、標準のモーダル ボックスを使用できません。アプリケーションは、ユーザーが [OK] をクリックするのを待ってから続行します。
メモ コンポーネントと [OK] ボタンを含むフォームを動的に作成し、メモに表示するテキストを渡すことはできますか?
やってみたところ、OKをクリックするとアクセス違反になってしまいました。
質問:
- モードレスに表示されているため、フォームを表示するためにスレッドを起動する必要はありますか?
- コンストラクターのパラメーター (prent) として何を渡す必要がありますか? 無、フォルム自体が壊れてしまうので?
- ユーザーが [OK] をクリックしたとき、何を呼び出せばよいですか? Close() または Free() ? これらのいずれも、[OK] をクリックしてから約 1/2 秒後にアクセス違反が発生しますが、関数で何もしなければ、コードは正常に実行されます (もちろん、メモリ リークが発生します)。
フォームはそれ自体を破壊する必要があるため、Google はあまり役に立ちませんが、例では作成者がフォームを破壊しています。
主な形式:
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