Einzelnen Beitrag anzeigen

Schokohase
(Gast)

n/a Beiträge
 
#14

AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter

  Alt 12. Sep 2018, 10:28
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.
  Mit Zitat antworten Zitat