AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Komisches Modal Problem

Ein Thema von Assertor · begonnen am 4. Jun 2008 · letzter Beitrag vom 5. Jun 2008
Antwort Antwort
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#1

Komisches Modal Problem

  Alt 4. Jun 2008, 21:01
Hi,

mal eine komische Beobachtung, vielleicht ein VCL Bug?

Wenn ich per Code in einer Action ein Modales Form schließe und direkt danach ein neues öffne, wir das Schließen nicht ausgeführt

Ich habe in einer ActionList ein Execute Event:
Delphi-Quellcode:
  if (Sender = acTestButton) then
  begin
    if Assigned(frmAboutBox) then
      frmAboutBox.Close;

    AppAutoUpdate.CheckNow;
    Exit;
  end;
So, und in AppAutoUpdate läuft ein einfaches Form-Erzeugen eines anderen Modal Forms. Wird auch per ShowModal angezeigt.

Ersetzte ich ShowModal per Show geht es

Also kommt es wohl bei der Forms.pas innerhalb von ShowModal zu einem "Feature" welches mir nicht aus OH und täglicher Praxis bekannt ist.

Weiß da jemand bescheid?

Gruß Assertor

P.S.: Nein, Application.ProcessMessages hilft nicht - und ja, es geht auch nicht mit ModalResult. Höchtens mit dem HolzHammer (.Release)
Frederik
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Komisches Modal Problem

  Alt 4. Jun 2008, 21:27
Moin Assertor,

wenn es zu Deinem sonstigen Programmablauf passt, probier' mal, ob Du das Close durch Hide ersetzen kannst.
In D7 wird dann frmAboutBox geschlossen.
Allerdings hat das bei mir dann noch den unschönen Nebeneffekt, dass nach dem Schliessen des AppAutoUpdate-Formulares das Hauptformular nicht mehr aktiv wird.
Vielleicht sieht's bei D2006 anders aus.
Evtl. findest Du ja den Fehler, wenn Du mal mit Debug-DCUs kompilierst und dann mal durchgehst, wo's in der VCL hakt.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#3

Re: Komisches Modal Problem

  Alt 4. Jun 2008, 21:38
Hi Christian!

Die Idee ist gut, führt schon in die richtige Richtung. Das Modale frmAboutBox wird geschlossen, aber Du hast recht - das MainForm verliert den Focus...

Debug-DCUs & Co sind an - geht das auch ohne - Sowas gibt es doch nur bei diesen seltenen Events namens "Release".

Hmm, innerhalb von ShowModal von Forms.pas wird der Focusstate aller Fenster in einer SaveFocusedList gespeichert. Ich vermute nun mal das die Message vom Close(Modal) noch nicht abgearbeitet ist, bevor hier das Save stattfindet.

Die frmAboutBox wird nach Verlassen von dem anderen Modal dann aber nachträglich geschlossen... Wie gesagt, komisch.

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Komisches Modal Problem

  Alt 5. Jun 2008, 10:05
Moin Assertor,

mach' mal nach dem Hide auch noch ein Close.
Dann funktioniert's.

Das das Hide alleine nicht tut, ist ja eigentlich auch logisch:
Es ist schliesslich kein Close, und kehrt somit nicht zur aufrufenden Stelle zurück.
Das Programm wartet schlicht an der ShowModal-Zeile, weil es ja nicht weiss, dass das aufgerufene Formular nicht mehr zu sehen ist.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#5

Re: Komisches Modal Problem

  Alt 5. Jun 2008, 10:13
Morgen Christian,

Zitat von Christian Seehase:
mach' mal nach dem Hide auch noch ein Close.
Dann funktioniert's.
Es funktioniert, natürlich! Ein dickes Danke an Dich!

Mann, da hätt ich drauf kommen müssen, einfach zuviel zu tun hier

Trotzdem ein werkwürdiges Verhalten - denn wenn ein Modal wirklich die Messageabarbeitung eines anderen Fensters stoppen würde, dürfte ja das TrayPopup des nicht-modalen Forms nicht die Actions zur Ausführung bringen - etwas inkonsequent. Besonders da es mit .Hide & .Close geht, mit ModalResult und .Close aber nicht

Ich werde mal im QC stöbern, da ich die genaue Logik dahinter etwas wackelig finde...

Gruß Assertor


Edit: Mal was ganz brutales für einen Updater:
Delphi-Quellcode:
  // close all open modal forms
  for i := 0 to Screen.FormCount - 1 do
  begin
    if (fsModal in Screen.Forms[i].FormState) then
    begin
      Screen.Forms[i].Hide;
      Screen.Forms[i].Close;
    end;
  end;
Da freuen sich die User
Frederik
  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 17:46 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