Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Modales Fenster per Klick auf aufrufende Form schließen lassen (https://www.delphipraxis.net/198199-modales-fenster-per-klick-auf-aufrufende-form-schliessen-lassen.html)

Hobbycoder 12. Okt 2018 08:10

Modales Fenster per Klick auf aufrufende Form schließen lassen
 
Hi,

ich möchte folgendes erreichen: Eine Methode ruft eine modale Form auf. Diese wird dann mittig über der aufrufenden Form dargestellt. Innerhalb dieser modalen Form hab ich ja genug Möglichkeiten diese zu schließen. Sie soll aber auch geschlossen werden, wenn der Benutzer auf die im Hintergrund liegende Form klickt (Nicht wenn er auf eine andere Anwendung oder den Desktop klickt, sondern nur die aufrufende Form).

Wäre das möglich? Wenn ja wie?

mkinzler 12. Okt 2018 08:13

AW: Modales Fenster per Klick auf aufrufende Form schließen lassen
 
Dann wäre es ja keine modale Form ...

FBrust 12. Okt 2018 08:30

AW: Modales Fenster per Klick auf aufrufende Form schließen lassen
 
Auch wenn das, wie Markus schon sagt, dem Prinzip der modalen Form etwas zuwiderläuft, könntest Du die X- und Y-Werte des Mausklicks erfassen und feststellen ob sie

a) außerhalb der modalen Form
b) aber innerhalb der X- und Y-Werte Deiner Hauptform liegen.

Aber persönlich halte ich es für besser, eine modale Form durch eine Aktion innerhalb dieser Form zu schließen.


Gruß
Frank

Sherlock 12. Okt 2018 08:37

AW: Modales Fenster per Klick auf aufrufende Form schließen lassen
 
Vorschlag: Keine eigene Form verwenden, sondern ein Panel auf einem durchsichtigem Panel in Applikationsgröße plazieren. Klicks auf dieses Panel können problemlos erkannt und ausgewertet werden. Einzig das verschieben des "Fenstres" ist dann nicht mehr so ganz einfach....aber machbar.

Sherlock

Frickler 12. Okt 2018 11:02

AW: Modales Fenster per Klick auf aufrufende Form schließen lassen
 
Zitat:

Zitat von Sherlock (Beitrag 1415582)
Vorschlag: Keine eigene Form verwenden, sondern ein Panel auf einem durchsichtigem Panel in Applikationsgröße plazieren.

Gibts ne einfache Methode, ein Panel durchsichtig zu machen, oder braucht man dazu extra (Kauf-)Komponenten?

DieDolly 12. Okt 2018 11:22

AW: Modales Fenster per Klick auf aufrufende Form schließen lassen
 
Die Idee mit dem Panel-Gefrickel erinnert mich an dubiose Software ala Registry-Cleaner und Konsorten im pseudo-professionellen Stil.

ich würde einfach ein nicht-modales Fenster anzeigen lassen, was aber OnTop ist.

Sherlock 12. Okt 2018 11:55

AW: Modales Fenster per Klick auf aufrufende Form schließen lassen
 
Gerade die Delphi VCL hatte damit über die Jahre (mindestens ab Delphi 2007) immer wieder Probleme. Die Fenster kamen nicht in den Vordergrund. Wenn die auch noch modal waren, war die Applikation für den unerfahrenen Anwender nicht mehr bedienbar. Auf Panel umzusteigen, bedeutet auch die maximale Kontrolle darüber zu haben, wann und wo dieses "Fenster" anzuzeigen ist. Das hat mit Gefrickel oder Pseudo-Professionell nichts zu tun.
Freilich habe ich die letzten Jahre nur noch FMX entwickelt, ich weiss also nichts über den aktuellen VCL-Stand.

@Frickler: Wie gesagt, nutze ich FMX, da reicht es ein TRectangle mit Fill.Color = Null zu nehmen.

Sherlock

Hobbycoder 12. Okt 2018 11:56

AW: Modales Fenster per Klick auf aufrufende Form schließen lassen
 
Zitat:

Zitat von mkinzler (Beitrag 1415580)
Dann wäre es ja keine modale Form ...

Jain. Es soll sich in etwa so verhalten, wie z.B. das Zoomen von Bildern auf manchen Webseiten (Ein Klick neben dem Bilder verkleinert es wieder).
Aber es soll schon Modal sein, heißt der Benutzer soll während diese Form offen ist, nicht in der aufrufenden etwas ändern können.

Es geht hier rein um den Komfort nicht zwingen das X oben rechts treffen zu müssen ;-)
Ist auch nicht auf meinen Mist gewachsen, sondern ein Wunsch von einem Kunden, der das selbst einer seiner Anwendungen wohl so hat(Name ist mir nicht bekannt).

Zitat:

Zitat von Sherlock (Beitrag 1415582)
Vorschlag: Keine eigene Form verwenden, sondern ein Panel auf einem durchsichtigem Panel in Applikationsgröße plazieren. Klicks auf dieses Panel können problemlos erkannt und ausgewertet werden. Einzig das verschieben des "Fenstres" ist dann nicht mehr so ganz einfach....aber machbar.

Hm...klingt für mich etwas aufwendig. Müsste doch einfacher gehen.

Zitat:

Zitat von DieDolly (Beitrag 1415609)
Die Idee mit dem Panel-Gefrickel erinnert mich an dubiose Software ala Registry-Cleaner und Konsorten im pseudo-professionellen Stil.

ich würde einfach ein nicht-modales Fenster anzeigen lassen, was aber OnTop ist.

OnTop heißt dann aber, dass er doch Zugriff auf die Controls der aufrufenden Form hat. Das darf aber nicht sein (gut, ich könnte die alle irgendwie disablen, aber das ist nicht ganz was ich möchte)

Zitat:

Zitat von FBrust (Beitrag 1415581)
Auch wenn das, wie Markus schon sagt, dem Prinzip der modalen Form etwas zuwiderläuft, könntest Du die X- und Y-Werte des Mausklicks erfassen und feststellen ob sie

a) außerhalb der modalen Form
b) aber innerhalb der X- und Y-Werte Deiner Hauptform liegen.

Aber persönlich halte ich es für besser, eine modale Form durch eine Aktion innerhalb dieser Form zu schließen.

Das ist es, woran ich gerade rumprobiere. Letztlich brauch ich ja nur einen Event und schicke dann einfach eine Message an die modale Form. Dann kann sie sich ja "von innen" schließen.

Zur Zeit probiere ich gerade mit Application.OnMessage rum. Könnte auch funktionieren, allerdings wir die Message WM_LBUTTONDOWN nicht geschickt, wenn außerhalt der modalen Form (aber noch auf der Hintergrundform) geklickt wird.

DieDolly 12. Okt 2018 11:59

AW: Modales Fenster per Klick auf aufrufende Form schließen lassen
 
Zitat:

gut, ich könnte die alle irgendwie disablen, aber das ist nicht ganz was ich möchte
Und die ganze Form Enabled auf False setzen? Einen Klick darauf sollte man trotzdem noch registrieren können.

hoika 12. Okt 2018 12:03

AW: Modales Fenster per Klick auf aufrufende Form schließen lassen
 
Hallo,
du könntest die 2. Form auch semimodal aufrufen,
dann bleibt das 1. Form noch so bedienbar, wie du das willst.

Was passiert aber, wenn der Nutzer auf einen Button in dem 1. Form klickt,
soll dann der Button ausgelöst werden, oder das 2. Form geschlossen werden?

Hobbycoder 12. Okt 2018 12:14

AW: Modales Fenster per Klick auf aufrufende Form schließen lassen
 
Zitat:

Zitat von hoika (Beitrag 1415619)
Hallo,
du könntest die 2. Form auch semimodal aufrufen,
dann bleibt das 1. Form noch so bedienbar, wie du das willst.

Was passiert aber, wenn der Nutzer auf einen Button in dem 1. Form klickt,
soll dann der Button ausgelöst werden, oder das 2. Form geschlossen werden?

Was meinst du mit "Semimodal"?

Worauf der Benutzer klickt, soll im Grunde egal sein (allerdings soll der OnClick-Event der Controls, was er anklickt nicht ausgeführt werden). Sobald dieser Klick außer halb der Form ist, will ich irgendwas..ein Event, eine Message, damit ich darauf überhaupt reagieren kann.

hoika 12. Okt 2018 12:29

AW: Modales Fenster per Klick auf aufrufende Form schließen lassen
 
Hallo,
etwa so

Delphi-Quellcode:
var
  Form      : TFormSemi;
  WindowList : Pointer;

procedure ErzeugeForm
begin
  Form:= CreateStateForm(theCaption, theInfo);
  WindowList:= DisableTaskWindows(Form.Handle);
  Form.Show;
  Application.ProcessMessages;

  // hier geht es im 1. Form ganz normale weiter

end;


procedure GibFormFrei
  Form.FCanClose := True;
  EnableTaskWindows(WindowList);
  Form.Free;
Das ganze noch mit einer Boolean-Variable, die im OnKeyDown (KeyPreview=True) des 1. Forms prüft,
ob das semimodale 1. Form gerade läuft und dann in diesem Fall GibFormFrei aufruft

Hobbycoder 12. Okt 2018 12:52

AW: Modales Fenster per Klick auf aufrufende Form schließen lassen
 
Ich habe das mal so versucht:

Delphi-Quellcode:
procedure TModaleForm.WMCapturechanged(var Message: TMessage); //message WM_CAPTURECHANGED;
var
  mp: TPoint;
begin
  if GetCursorPos(mp) then
  begin
    if not (PtInRect(Self.BoundsRect, mp)) then self.Close;
  end;
  inherited;
end;
Funktioniert schon mal wie gewünscht....aber nur beim ersten Mouseklick. Wird dieser innerhalb der modalen Form gemacht, wird WM_CAPTURECHANGED nicht mehr gefeuert.!?
Gibt es eigentlich eine Gegenstückt zu WM_CAPTURECHANGED?

Hobbycoder 12. Okt 2018 13:13

AW: Modales Fenster per Klick auf aufrufende Form schließen lassen
 
Zitat:

Zitat von hoika (Beitrag 1415624)
Hallo,
etwa so

Delphi-Quellcode:
var
  Form      : TFormSemi;
  WindowList : Pointer;

procedure ErzeugeForm
begin
  Form:= CreateStateForm(theCaption, theInfo);
  WindowList:= DisableTaskWindows(Form.Handle);
  Form.Show;
  Application.ProcessMessages;

  // hier geht es im 1. Form ganz normale weiter

end;


procedure GibFormFrei
  Form.FCanClose := True;
  EnableTaskWindows(WindowList);
  Form.Free;
Das ganze noch mit einer Boolean-Variable, die im OnKeyDown (KeyPreview=True) des 1. Forms prüft,
ob das semimodale 1. Form gerade läuft und dann in diesem Fall GibFormFrei aufruft

Hm...muss ich mal probieren. Aber das würde nicht verhindern, dass ein Control der 1. Form angeklickt wird. Das könnte ich in OnMouseDown ja noch regeln.
Und was ist CreateStateForm? Ich kenn nur CreateForm.

hoika 12. Okt 2018 15:38

AW: Modales Fenster per Klick auf aufrufende Form schließen lassen
 
CreateStateForm = TSemiForm.Create

Ich hatte es aus einem alten Projekt rauskopiert und das dort vergessen, u ersetzen


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz