AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Modales Fenster per Klick auf aufrufende Form schließen lassen
Thema durchsuchen
Ansicht
Themen-Optionen

Modales Fenster per Klick auf aufrufende Form schließen lassen

Ein Thema von Hobbycoder · begonnen am 12. Okt 2018 · letzter Beitrag vom 12. Okt 2018
Antwort Antwort
Hobbycoder

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

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

  Alt 12. Okt 2018, 11:56
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).

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.

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)

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.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#2

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

  Alt 12. Okt 2018, 11:59
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.
  Mit Zitat antworten Zitat
hoika

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

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

  Alt 12. Okt 2018, 12:03
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?
Heiko
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
1.017 Beiträge
 
#4

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

  Alt 12. Okt 2018, 12:14
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.
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
 
#5

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

  Alt 12. Okt 2018, 12:29
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
Heiko
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
1.017 Beiträge
 
#6

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

  Alt 12. Okt 2018, 12:52
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?
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
1.017 Beiträge
 
#7

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

  Alt 12. Okt 2018, 13:13
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.
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
 
#8

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

  Alt 12. Okt 2018, 15:38
CreateStateForm = TSemiForm.Create

Ich hatte es aus einem alten Projekt rauskopiert und das dort vergessen, u ersetzen
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:38 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