AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Fenster schließt sich nicht

Ein Thema von TurboMagic · begonnen am 16. Apr 2023 · letzter Beitrag vom 18. Apr 2023
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.400 Beiträge
 
Delphi 12 Athens
 
#1

AW: Fenster schließt sich nicht

  Alt 17. Apr 2023, 00:26
OK, hab nur nach Close geguckt.


Seh ich es richtig, oder verändert dieses Mistteil von CloseModal bösartig das ModalResult?
Von mrCancel zu mrNone, worauf dann wirklich die Form nicht mehr geschlossen wird.

Wer denkt sich soeinen Scheißdreck aus?


https://quality.embarcadero.com/brow...2CloseModal%22


Delphi-Quellcode:
procedure TCustomForm.Close;
var
  CloseAction: TCloseAction;
begin
  if fsModal in FFormState then
    ModalResult := mrCancel <<<<<<<<<<<
  else
    if CloseQuery then
    begin
      if FormStyle = fsMDIChild then
        if biMinimize in BorderIcons then
          CloseAction := caMinimize else
          CloseAction := caNone
      else
        CloseAction := caHide;
      DoClose(CloseAction);
      if CloseAction <> caNone then
        if Application.MainForm = Self then Application.Terminate
        else if CloseAction = caHide then Hide
        else if CloseAction = caMinimize then WindowState := wsMinimized
        else Release;
    end;
end;
Delphi-Quellcode:
function TCustomForm.ShowModal: Integer;
begin
  ...
        ModalResult := 0;
        repeat
          ...
          Application.HandleMessage;
          if Application.Terminated then ModalResult := mrCancel else
            if ModalResult <> 0 then CloseModal;
        until ModalResult <> 0;
Echt mal, warum kann man nicht an der Stelle einen Kommentar rein tun?
Also dass Teile aus dem Else "hier" oben auch gemacht werden, nur nicht hier, sondern erst später in ShowModal->CloseModal, vorm Ende der Schleife. (außer wenn Terminated)



Das protected CloseModal (mich wundert echt, dass es nicht private ist) wird/sollte man sowieso nicht selber aufrufen. Es bleibt beim Close.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (17. Apr 2023 um 11:44 Uhr)
  Mit Zitat antworten Zitat
BerndS
Online

Registriert seit: 8. Mär 2006
Ort: Jüterbog
497 Beiträge
 
Delphi 12 Athens
 
#2

AW: Fenster schließt sich nicht

  Alt 17. Apr 2023, 07:19
Das Setzen von Modalresult im OnShow oder OnActivate Event ist leider zu früh, da im Showmodal erst danach die Schleife beginnt, diedie Abbruchbedingung enthält.
Hier nur ein Auszug:
Delphi-Quellcode:
    try
      Show;
      try
        SendMessage(Handle, CM_ACTIVATE, 0, 0);
        ModalResult := 0;
        repeat
          ...
          ...
        until ModalResult <> 0;
Wenn man die Form im OnShow oder OnAvtivate schließen möchte, dann per

 PostMessage(FormHandle, WM_CLOSE, 0, 0);
Vielleicht wäre es besser im OnShow einen Thread zu starten, der die Methode ausführt und über Synchronice die Anzeige zu aktualisieren und im OnTerminate das Form zu schließen.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.688 Beiträge
 
Delphi 12 Athens
 
#3

AW: Fenster schließt sich nicht

  Alt 17. Apr 2023, 07:50
Seh ich es richtig, oder verändert dieses Mistteil von CloseModal bösartig das ModalResult?
Von mrCancel zu mrNone, worauf dann wirklich die Form nicht mehr geschlossen wird.
Welche Stelle genau meinst du?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.400 Beiträge
 
Delphi 12 Athens
 
#4

AW: Fenster schließt sich nicht

  Alt 17. Apr 2023, 11:43
uppps, falsch geguckt .... war caNone, nicht mrNone ... und davor den Variablennamen nicht nochmal gelesen

Delphi-Quellcode:
procedure TCustomForm.Close;
var
  CloseAction: TCloseAction;
begin
  if fsModal in FFormState then
    ModalResult := mrCancel
  else



function TCustomForm.ShowModal: Integer;
begin
  ...
        ModalResult := 0;
        repeat
          ...
          Application.HandleMessage; <<<<<<<<<<<<<<< hier würde das .Close ausgeführt oder ein ModalResult gesetzt
          if Application.Terminated then ModalResult := mrCancel else
            if ModalResult <> 0 then CloseModal;
        until ModalResult <> 0;



procedure TCustomForm.CloseModal;
var
  CloseAction: TCloseAction;
begin
  try
    CloseAction := caNone; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    if CloseQuery then
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (17. Apr 2023 um 11:45 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
2.031 Beiträge
 
Delphi 12 Athens
 
#5

AW: Fenster schließt sich nicht

  Alt 17. Apr 2023, 12:41
Ich würde sagen du darfst dein "Ereignis" nicht in OnShow aufrufen.
Ich habe früher für sowas in der Regel einen TTimer verwendet der in OnShow aktiviert wird und dann,
wenn die MessageQueue bock hat aufgerufen wird und sich selbst direkt disabled und die Aktion die ich möchte "direkt nach dem Aufbau des fensters" ausführt.
"PostMessage" macht aber ansich das Gleiche und legt auch einfach eine Message auf die Queue die dann, wenn alle anderen Messages(paint, focus, MouseUp) durch sind abgearbeitet werden.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.400 Beiträge
 
Delphi 12 Athens
 
#6

AW: Fenster schließt sich nicht

  Alt 17. Apr 2023, 13:58
Statt PostMessage und Timer verwende ich hier gern das Thread.Queue

Delphi-Quellcode:
TThread.ForceQueue(nil, procedure // im OnShow oder OnCreate/Create
  begin
    ...
  end);
ACHTUNG: ForceQueue statt Queue, da Emba zu dämlich war Queue zu reparieren und den "Bugfix" anders nannte. (im VCL-Thread aufgerufen, führt TThread.Queue den Code sofort aus ... anstatt dieses falsche IF einfach zu löschen, wurde eine neue Funktion gebaut, die endlich das macht, was die Funkion "Queue" laut ihrem Namen beheuptet zu tun)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.990 Beiträge
 
Delphi 12 Athens
 
#7

AW: Fenster schließt sich nicht

  Alt 17. Apr 2023, 18:23
im VCL-Thread aufgerufen, führt TThread.Queue den Code sofort aus ... anstatt dieses falsche IF einfach zu löschen, wurde eine neue Funktion gebaut, die endlich das macht, was die Funkion "Queue" laut ihrem Namen beheuptet zu tun)
Ich verwende diese Funktionalität allerdings auch, um Zugriffe threadsicher zu machen. Ich kann so einfach Queue aufrufen, ohne zu prüfen, ob ich schon im Hauptthread bin. Deshalb hätte ich es schlecht gefunden, wenn das geändert worden wäre, auch wenn ich deine Argumentation natürlich verstehe.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.400 Beiträge
 
Delphi 12 Athens
 
#8

AW: Fenster schließt sich nicht

  Alt 17. Apr 2023, 19:01
Man könnte aber auch einfach immer und überall ForceQueue aufrufen, egal wo. (in Threads verhält es sich gleich, nur im Hauptthread macht es "auch" das, was man sich vom "Queue" denken würde)

TThread.Queue verhält sich im Hauptthread aufgerufen wie ein Synchronize.



Synchronisation: (egal ob Queue oder Synchronize)
* alles im Hauptthread, da ist es nutzlos (bzw. bringt nur unnötig Overhead)
* zwischen Thread geht es
* zwischen Thread(s) und Hauptthread ... im Hauptthread ist es unnötig, da Jener sowieso gerade "blockiert" ist (aber als Doku, bzw. damit es überall gleich ist, würde ich es im Hauptthread als "vertretbar" ansehen)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (17. Apr 2023 um 19:08 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.076 Beiträge
 
Delphi 12 Athens
 
#9

AW: Fenster schließt sich nicht

  Alt 17. Apr 2023, 20:16
Statt PostMessage und Timer verwende ich hier gern das Thread.Queue

Delphi-Quellcode:
TThread.ForceQueue(nil, procedure // im OnShow oder OnCreate/Create
  begin
    ...
  end);
ACHTUNG: ForceQueue statt Queue, da Emba zu dämlich war Queue zu reparieren und den "Bugfix" anders nannte. (im VCL-Thread aufgerufen, führt TThread.Queue den Code sofort aus ... anstatt dieses falsche IF einfach zu löschen, wurde eine neue Funktion gebaut, die endlich das macht, was die Funkion "Queue" laut ihrem Namen beheuptet zu tun)
Danke, ForceQueue funktioniert!
  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 18:26 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