Eine funktionierende Lösung für
ShowModal
sieht so aus:
Delphi-Quellcode:
unit Forms.SomeDialogForm;
interface
uses
Winapi.Windows,
Winapi.Messages, System.SysUtils, System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.Grids,
Vcl.StdCtrls,
Vcl.ExtCtrls,
Vcl.AppEvnts;
type
TSomeDialogForm =
class( TForm )
ApplicationEvents1: TApplicationEvents;
procedure ApplicationEvents1Idle(
Sender: TObject;
var Done: Boolean );
procedure FormDblClick( Sender: TObject );
private
FModalResult: TModalResult;
procedure SetModalResult(
const Value: TModalResult );
public
end;
var
SomeDialogForm: TSomeDialogForm;
implementation
{$R *.dfm}
procedure TSomeDialogForm.ApplicationEvents1Idle(
Sender: TObject;
var Done: Boolean );
begin
if ( FModalResult <> 0 )
and ( GetAsyncKeyState( VK_LBUTTON ) = 0 )
then
begin
// Wir setzen den ModalResult erst dann, wenn der linke Maus-Button nicht gedrückt ist
ModalResult := FModalResult;
end;
end;
procedure TSomeDialogForm.FormDblClick( Sender: TObject );
begin
SetModalResult( mrOK );
end;
procedure TSomeDialogForm.SetModalResult(
const Value: TModalResult );
begin
if ( Value <> Self.ModalResult )
or ( Value <> FModalResult )
then
begin
FModalResult := Value;
end;
end;
end.
Schön ist dabei im Auge des Betrachters, denn nach einem MouseDown/MouseUp/MouseDown wird der DoppelKlick ausgelöst aber die Form noch nicht geschlossen. Erst wenn man MouseUp kommt (die Maus-Taste losgelassen wird) wird ModalResult gesetzt und die Form geschlossen.