![]() |
AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter
Zitat:
Aber unter D2010 ist es leider so.. zumindest bei mir. Ich sollte also nach einem ShowModal das Parent Fenster nicht mehr verschieben dürfen aber das kann ich. Muss da nochmal recherchieren. OK! Recherchiert Habe da wohl quatsch geschrieben.. Es ist wie du sagst. Kann mich aber erinnern das ich das Problem schon mal hatte das ich die Parent Form trotzdem verschieben konnte. Ist vielleicht gefixt worden. gruss |
AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter
Ich vergaß noch zu erwähnen, dass die Lösung von @hoika das Problem nicht beseitigt.
|
AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter
Zitat:
EnableWindow und SetWindowPos liefern dann das gleiche Ergebnis. Emuliertes ShowModal.. und fertig.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Unit2; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Form2.Show; end; end.
Delphi-Quellcode:
Man kann jetzt noch das neue Fenster über das alte zentrieren das habe ich mir aber erspart.
unit Unit2;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm2 = class(TForm) procedure FormShow(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form2: TForm2; implementation uses Unit1; {$R *.dfm} procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Form1.Enabled := True; end; procedure TForm2.FormShow(Sender: TObject); begin Form1.Enabled := False; SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE); end; end. gruss |
AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter
Eine funktionierende Lösung für
Delphi-Quellcode:
sieht so aus:
ShowModal
Delphi-Quellcode:
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.
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. |
AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter
Jo wenn er ModalResult auswertet ansonsten überflüssig ;)
Trotzdem guter Ansatz. :thumb: Ok.. Bin raus irgendwie kommt vom TE keine Rückmeldung.. gruss |
AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter
Ich habe gerade mal geschaut wie das Verhalten bei .NET WinForms ist.
Da wird der Doppel-Klick-Event erst ausgelöst, wenn die Maustaste wieder oben ist. @Hobbycoder Da war dein Vorschlag ja doch richtig. |
AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter
Erstmal vielen Dank an alle, die sich meinen Kopf zerbrochen haben. Ich bin begeistert über so viel Mithilfe.
Die Lösung von Schokohase funktioniert super.
Delphi-Quellcode:
Ich weiss nur nicht, ob es Auswirkungen hat, dass ich im Mainform des Programms bereits ein tApplicationEvents habe. Arbeitet das dann auch noch, wenn mein modaler Dialog gerade angezeit wird?
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. |
AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter
Nur mal nachgehakt, warum nicht einfach vor dem Close von Fenster X einfach Mauspuffer löschen, man ist doch eh im Event drinnen was getriggert werden sollte?
|
AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter
Zitat:
|
AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz