Anwendung nicht beenden bei geänderten Daten in Sub-Form

Rund um die LCL und andere Komponenten
Antworten
RuhrPotto
Beiträge: 39
Registriert: Mi 6. Mai 2015, 12:52

Anwendung nicht beenden bei geänderten Daten in Sub-Form

Beitrag von RuhrPotto »

Den Close eines Unterformulars kann ich bei Datenänderung über OnCloseQuery verhindern.

:arrow: Beim Schliessen/Beenden der Anwendung im MainForm und nicht gespeicherten Daten in einer oder mehrerer Subforms wird das OnCloseQuery des jeweilgen Formulars nicht ausgeführt!

:?:
Gibt es sowas wie ein übergeordnetes OnCloseQuery, muss ich Änderungen in den Forms selber verwalten oder gibt es eine einfache Lösung, die ich leider nicht gefunden habe?
Kann man alle geöffneten aber nicht zwingend sichtbaren Formulare einer Auflistung entnehmen?

Hoffe, ich habe es verständlich ausgedrückt

Danke
Jeder macht Fehler - viele Fehler brauchen EDV!

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Anwendung nicht beenden bei geänderten Daten in Sub-Form

Beitrag von Michl »

RuhrPotto hat geschrieben:Beim Schliessen/Beenden der Anwendung im MainForm und nicht gespeicherten Daten in einer oder mehrerer Subforms wird das OnCloseQuery des jeweilgen Formulars nicht ausgeführt!
K.A., ob das nicht sogar ein Bug ist?! Wie ist denn das Verhalten bei Delphi?
RuhrPotto hat geschrieben:Gibt es sowas wie ein übergeordnetes OnCloseQuery, muss ich Änderungen in den Forms selber verwalten oder gibt es eine einfache Lösung, die ich leider nicht gefunden habe?
Kann man alle geöffneten aber nicht zwingend sichtbaren Formulare einer Auflistung entnehmen?
Ich hatte eben das probiert (es wird damit OnClose bzw. OnCloseQuery des jeweiligen Formulars gefeuert):

Code: Alles auswählen

procedure TForm1.FormClose(Sender: TObject;
  var CloseAction: TCloseAction);
var
  i: Integer;
begin
  for i := Application.ComponentCount - 1 downto 0 do
    if Assigned(Application.Components[i]) and
        (Application.Components[i] is TForm) and
        (Application.Components[i] <> Self) and
        (TForm(Application.Components[i]).Visible) then
      TForm(Application.Components[i]).Close;
end;  

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: Anwendung nicht beenden bei geänderten Daten in Sub-Form

Beitrag von wp_xyz »

Michl hat geschrieben:Wie ist denn das Verhalten bei Delphi?
Genauso, hab's gerade mit Delphi XE2 ausprobiert. Erscheint mir aber trotzdem ein Bug zu sein.

RuhrPotto
Beiträge: 39
Registriert: Mi 6. Mai 2015, 12:52

Re: Anwendung nicht beenden bei geänderten Daten in Sub-Form

Beitrag von RuhrPotto »

@Michl Danke für die Codestrecke! Hat mich auf eine andere Möglichkeit gebracht. Bei deiner Lösung war das Problem, dass das Schliessen des MainForm nur nach dem zweiten Click funktionierte, sofern ein SubForm geöffnet war.
Ein kleineres bestand darin, dass das SubForm nicht angezeigt wird. Bei mir kam nur die Message aus dem OnCloseQuery des SubForm.

Ich hab das ganze jetzt so gelöst und bis jetzt funktioniert es:

Code: Alles auswählen

 
procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: boolean);
var
  i : Integer;
begin
  CanClose := true;                          //Vermeidet DoppelClick auf <Beenden> der Anwendung
  for i := 1 to Screen.FormCount -1 do
    if not Screen.Forms[i].CloseQuery then
       begin
         CanClose := false;                  //MainForm/Application kann nicht beenden
         Screen.Forms[i].BringToFront;       //Sub-Form mit nicht gespeicherten Daten anzeigen
         BREAK;                              //Abbruch nach dem ersten nicht gespeicherten Formular 
       end;
end;  
 
In meinem Fall wird nun erst die Message über nicht geänderte Daten der jeweiligen SubForm angezeigt und dann erhält diese den Focus.
Der BREAK in der Schleife vermeidet, dass bei mehreren nicht gespeicherten SubForms alle Messages hintereinander angezeigt werden, zugeclickt werden müssen und letztendlich aber das letzte Form den Focus erhält.
Die anderen SubForms sind dann aber nicht mehr sichtbar und der CloseQuery muss neu durchlaufen oder der Anwender hat sich die Forms gemeerkt *hüstel* und steuert alle gezielt an.

Ob das Verhalten ein Bug ist, kann ich nicht beurteilen - könnte aber durchaus sein.
Aber dazu fällt mir noch ein alter Witz ein - ging ungefähr so:
:mrgreen: Sitzen Entwickler mit Ihrem Chef zusammen und besprechen ein neues Release mit einigen Mängeln.
Am Ende sagt der Chef: OK - wir lassen alle Fehler im Programm, ändern die Dokumentation und nennen das Ganz dann Features der Version 10 ...

Passiert wohl bei vielen OS, Programmen so ...
Jeder macht Fehler - viele Fehler brauchen EDV!

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Anwendung nicht beenden bei geänderten Daten in Sub-Form

Beitrag von Michl »

Das freut mich, dass du eine Lösung hast.

Es scheint aber tatsächlich ein Bug zu sein und sollte gemeldet werden. Dazu gab es schon mal einen Eintrag: http://bugs.freepascal.org/view.php?id=9274
@RuhrPotto: Machst du das? Sonst mache ich heute abend den Eintrag.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

RuhrPotto
Beiträge: 39
Registriert: Mi 6. Mai 2015, 12:52

Re: Anwendung nicht beenden bei geänderten Daten in Sub-Form

Beitrag von RuhrPotto »

@Michl: Ich trag den Bug ein. Hab noch einen gefunden und noch nicht eingetragen. Geht dann in einem Abwasch
Jeder macht Fehler - viele Fehler brauchen EDV!

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Anwendung nicht beenden bei geänderten Daten in Sub-Form

Beitrag von Michl »

Habe es nun selbst gemeldet: http://bugs.freepascal.org/view.php?id=28685

[Edit] das Verhalten soll nicht geändert werden, da es Delphi genauso macht...

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten