AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Modaler Doppelklick gibt Event an Ursprungsfenster weiter

Modaler Doppelklick gibt Event an Ursprungsfenster weiter

Ein Thema von michaelg · begonnen am 11. Sep 2018 · letzter Beitrag vom 13. Sep 2018
Antwort Antwort
Seite 2 von 3     12 3   
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
6.468 Beiträge
 
Delphi 2010 Architect
 
#11

AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter

  Alt 12. Sep 2018, 08:38
Zitat:
Das stimmt so leider nicht.
Unter Delphi 10.2 Tokyo wird beim ShowModal für jedes Fenster der Anwendung MSDN-Library durchsuchen EnableWindow aufgerufen mit bEnable = false .
Ok Danke!

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

Geändert von EWeiss (12. Sep 2018 um 08:57 Uhr)
  Mit Zitat antworten Zitat
Schokohase

Registriert seit: 17. Apr 2018
770 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#12

AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter

  Alt 12. Sep 2018, 08:47
Ich vergaß noch zu erwähnen, dass die Lösung von @hoika das Problem nicht beseitigt.

Geändert von Schokohase (12. Sep 2018 um 08:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
6.468 Beiträge
 
Delphi 2010 Architect
 
#13

AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter

  Alt 12. Sep 2018, 08:53
Ich vergaß noch zu erwähnen, dass die Lösung von @hoika das Problem nicht beseitigt.
Hmm.. nun wie ich schon sagte wenn er ModalResult NICHT auswertet kann er auch auf ShowModal verzichten ist wohl die beste Lösung.
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:
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.
Man kann jetzt noch das neue Fenster über das alte zentrieren das habe ich mir aber erspart.

gruss

Geändert von EWeiss (12. Sep 2018 um 09:27 Uhr)
  Mit Zitat antworten Zitat
Schokohase

Registriert seit: 17. Apr 2018
770 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#14

AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter

  Alt 12. Sep 2018, 09: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
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
6.468 Beiträge
 
Delphi 2010 Architect
 
#15

AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter

  Alt 12. Sep 2018, 09:30
Jo wenn er ModalResult auswertet ansonsten überflüssig
Trotzdem guter Ansatz.

Ok.. Bin raus irgendwie kommt vom TE keine Rückmeldung..

gruss

Geändert von EWeiss (12. Sep 2018 um 09:33 Uhr)
  Mit Zitat antworten Zitat
Schokohase

Registriert seit: 17. Apr 2018
770 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#16

AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter

  Alt 12. Sep 2018, 09:37
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.

Geändert von Schokohase (12. Sep 2018 um 09:41 Uhr)
  Mit Zitat antworten Zitat
michaelg

Registriert seit: 20. Apr 2008
39 Beiträge
 
#17

AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter

  Alt 12. Sep 2018, 10:19
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:
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.
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?
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
2.263 Beiträge
 
Delphi 2010 Professional
 
#18

AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter

  Alt 12. Sep 2018, 10:27
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?
Gruß vom KodeZwerg
Wenn ein unerwarteter Fehler aufgetreten ist, frage ich mich immer, welche Fehler erwartet wurden...
  Mit Zitat antworten Zitat
Schokohase

Registriert seit: 17. Apr 2018
770 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#19

AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter

  Alt 12. Sep 2018, 17:44
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?
Probier es doch einfach mal aus ...
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
2.263 Beiträge
 
Delphi 2010 Professional
 
#20

AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter

  Alt 12. Sep 2018, 20:37
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?
Probier es doch einfach mal aus ...
Ich bekomme Fehler nicht reproduziert, deshalb meine Frage. Problem ist ja bereits gelöst, aber interessiert hätte es mich schon.
Gruß vom KodeZwerg
Wenn ein unerwarteter Fehler aufgetreten ist, frage ich mich immer, welche Fehler erwartet wurden...
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf