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
Hobbycoder

Registriert seit: 22. Feb 2017
1.002 Beiträge
 
#1

AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter

  Alt 11. Sep 2018, 17:52
Ah, ok. An sowas hab ich gar nicht gedacht.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter

  Alt 11. Sep 2018, 18:54
Hallo,
das hatte ich beim TAdvStringGrid (TMS) auch.

Lösung:
Vor dem Erzeugen des modalen Fensters das eigene Fensters disablen

Self.Enabled:= False;
Dialog->ShowModal
Self.Enabled:= True;

Hatte zumindestens mir geholfen.
Heiko
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter

  Alt 12. Sep 2018, 04:48
Hallo,
das hatte ich beim TAdvStringGrid (TMS) auch.

Lösung:
Vor dem Erzeugen des modalen Fensters das eigene Fensters disablen

Self.Enabled:= False;
Dialog->ShowModal
Self.Enabled:= True;

Hatte zumindestens mir geholfen.
Gute Lösung zumal ein aktiviertes Parent Fenster bei einem Modal angezeigten Fenster quatsch ist.
In dem Fall braucht man kein Modales Fenster wenn das Parent bedient werden kann.
Denn das ist der einzige sinn und zweck eines Modalen Fensters.


PS: [OT]
Nebenbei ein Modales Fenster ist unter Delphi ein Nonsens denn es erschließt sich mir nicht welchen sinn es bezwecken soll.
Da liegt wohl ein Design technisches Problem vor.

Ein Modales Fenster unter VB6 erstellt hat folgende Eigenschaften.
ZOrder = -1 (HWND_TOPMOST)
Parent Fenster Disabled

Delphi.
ZOrder = 0 (HWND_TOP)
Parent Fenster Enabled.

Welcher sinn und zweck steckt also dahinter dann kann ich direkt ein normales Fenster erstellen mit anschließenden SetWindowPos um die Zorder festzulegen.
Irgendwie quatsch das Modale Fenster unter Delphi!

Das hier ist schon ein Widerspruch!
Zitat:
ShowModal erlaubt es dem Anwender, nur das neue Fenster zu verwenden und blockiert alle Eingaben in andere Fenster. Erst, wenn dieses Fenster geschlossen wird, werden alle anderen wieder freigegeben. Man kennt das z.B. vom Infofenster der meisten Anwendungen.
Diese Verhalten kann ich unter Delphi nicht bestätigen (Ohne das Parent selbst zu deaktivieren) unter VB6 hingegen schon!

Es ist etwas anderes wenn man sich der Rückgabe Parameter einer Modalen Form bedienen möchte um in der Hauptform auf ein Ereignis zu warten.
bsp.
if Form.ShowModal = mrCancel then
Ansonsten sehe ich da keine Sinnvolle Verwendung für.
[/OT]

War Blödsinn habe mich über ein altes Problem ausgelassen was scheinbar gefixt wurde.

Dein Problem ist also das der Wert der Eigenschaft ModalResult zurückgegeben wird.. weil dein Parent Fenster aktiv ist.
Und zwar an die Funktion aus der du das Modale Fenster erstellst.
Erstelle ein normales Fenster wenn du ModalResult nicht auswerten willst und gut ist.
Ein .Show mit angehängter SetWindowPos wäre dann die bessere alternative.

gruss

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

n/a Beiträge
 
#4

AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter

  Alt 12. Sep 2018, 08:20
Dein Problem ist also das der Wert der Eigenschaft ModalResult zurückgegeben wird.. weil dein Parent Fenster aktiv ist.
Das stimmt so leider nicht.

Unter Delphi 10.2 Tokyo wird beim ShowModal für jedes Fenster der Anwendung MSDN-Library durchsuchenEnableWindow aufgerufen mit bEnable = false .
Delphi-Quellcode:
// Vcl.Forms.pas 2215
function DoDisableWindow(Window: HWnd; Data: LPARAM): Bool; {$IFNDEF CLR}stdcall;{$ENDIF}
var
  P: TTaskWindowType;
begin
  if (Window <> TaskActiveWindow) and IsWindowVisible(Window) and
    IsWindowEnabled(Window) then
  begin
{$IF DEFINED(CLR)}
    P := TTaskWindow.Create;
{$ELSE}
    New(P);
{$ENDIF}
    P.Next := TaskWindowList;
    P.Window := Window;
    TaskWindowList := P;
    EnableWindow(Window, False);
  end;
  Result := True;
end;
Diesen Wert kann man aber nicht über Delphi-Referenz durchsuchenTForm.Enabled auslesen. Trotz dass
Delphi-Referenz durchsuchenTForm.Enabled auf true steht, ist es für das Betriebssystem aber disabled.

Das Problem ist, dass das modale Fenster versteckt wird und das vorherige Fenster aktiviert wird, obwohl in der Message-Queue noch Nachrichten enthalten sind, die vom modalen Fenster verarbeitet werden müssten (MouseUp) und jetzt aber vom falschen Fenster verarbeitet werden.

Delphi-Quellcode:
// VCL.Forms.pas 7352
function TCustomForm.ShowModal: Integer;
var
  WindowList: TTaskWindowList;
  LSaveFocusState: TFocusState;
  SaveCursor: TCursor;
  SaveCount: Integer;
  ActiveWindow: HWnd;
begin
  // ... schnipp ...
  Application.ModalStarted;
  try
    { RecreateWnd could change the active window }
    ActiveWindow := GetActiveWindow;
    // ... schnipp ...
    WindowList := DisableTaskWindows(0);
    try
      Show;
      try
        SendMessage(Handle, CM_ACTIVATE, 0, 0);
        ModalResult := 0;
        repeat // Message-Loop zum Verarbeiten der Messages
          Application.HandleMessage;
          if Application.Terminated then ModalResult := mrCancel else
            if ModalResult <> 0 then CloseModal;
        until ModalResult <> 0;
        Result := ModalResult;
        SendMessage(Handle, CM_DEACTIVATE, 0, 0);
        if GetActiveWindow <> Handle then ActiveWindow := 0;
      finally
        Hide;
      end;
    finally
      if Screen.CursorCount = SaveCount then
        Screen.Cursor := SaveCursor
      else Screen.Cursor := crDefault;
      EnableTaskWindows(WindowList);
      if Screen.SaveFocusedList.Count > 0 then
      begin
        Screen.FocusedForm := TCustomForm(Screen.SaveFocusedList.First);
        Screen.SaveFocusedList.Remove(Screen.FocusedForm);
      end else Screen.FocusedForm := nil;

      // Hier wird jetzt versucht das alte Fenster wieder zu aktivieren

      { ActiveWindow might have been destroyed and using it as active window will
        force Windows to activate another application }

      if (ActiveWindow <> 0) and not IsWindow(ActiveWindow) then
        ActiveWindow := FindTopMostWindow(0);
      if ActiveWindow <> 0 then
        SetActiveWindow(ActiveWindow);
      RestoreFocusState(LSaveFocusState);
      Exclude(FFormState, fsModal);
    end;
  finally
    Application.ModalFinished;
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Modaler Doppelklick gibt Event an Ursprungsfenster weiter

  Alt 12. Sep 2018, 08:25
Vielleicht hilft es auch im Event sowas hier einzubauen, damit werden folge-Befehle für Maus-Input gelöscht.
Delphi-Quellcode:
procedure EmptyMouseQueue;
var
  Msg: TMsg;
begin
  while PeekMessage(Msg, 0, WM_MOUSEFIRST, WM_MOUSELAST,
    PM_REMOVE or PM_NOYIELD) do;
end;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

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
(Gast)

n/a Beiträge
 
#7

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
EWeiss
(Gast)

n/a Beiträge
 
#8

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
Antwort Antwort

 
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 14:16 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