![]() |
FormCloseQuery FormShowing abfrage
Also immo sieht mein Code so aus
der soll quasi abfragen ob noch eine Form offen ist und wenn nicht schliessen ansonsten fehlermeldung. Soweit so gut nun hab ich das Problem das ständig neue Forms dazu kommen da dachte ich mir muss das ganze etwas vereinfachen und hab eine version geschrieben wo ich nur nen integer wert ändern muss. nun funzt das aber nicht so wirklich. Alte Version:
Delphi-Quellcode:
Neue Version:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin CanClose := False; if (not Form2.Showing) then if (not Form3.Showing) then if (not Form4.Showing) then if (not Form5.Showing) then if (not Form6.Showing) then if (not Form7.Showing) then CanClose := True; if (not CanClose) then MessageDlg('Bitte erst alle Fenster schließen bevor das Hauptfenster geschlossen wird!', mtError, [mbOK], 0); end;
Delphi-Quellcode:
im OnCreate wird noch die aktuelle Anzahl der Forms gesetzt steht immo bei 8.
var maxfom: integer;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); var i,L: integer; begin CanClose := False; L := 1; for i := 2 to maxform do // fängt mit 2 an weil Form1 ja nicht abgefragt werden soll. begin if (not TForm('Form'+inttostr(i)).Showing) then L := L + 1 end; if (L = maxform) then Canclose := True; if (not CanClose) then MessageDlg('Bitte erst alle Fenster schließen bevor das Hauptfenster geschlossen wird!', mtError, [mbOK], 0); end; Das Problem ist das der nun auch das fenster schliesst wenn noch ne form offen ist, was ja damit normalerweile verhindert werden soll. Sieht jemand nen Fehler da drin den ich seh irgendwie keinen is ja im endeffekt nix anderes als die obere version An anderer Stelle hab ich folgenden Code:
Delphi-Quellcode:
nur bekomm ich da ne Zugriffsverletzung :/
for i := 1 to maxform do
TForm('Form'+inttostr(i)).Font := FontDialog1.Font; "Zugriffsverletzung bei Adresse 004B2316 in Modul 'Project1.exe'. Lesen von Adresse 00000000" |
AW: FormCloseQuery FormShowing abfrage
Schließt Dein Programm nur wenn noch 1 Form offen ist (außer dem Hauptform) oder auch wenn noch mehr Forms geöffnet sind?
Du schreibst maxforms = 8, prüfst aber nur die Forms 2-7 (=6). Ich würde auch die Abfrage nicht undbedingt hardcoded gestalten, da Du Dir dadurch nur zusätzliche Arbeit bei späteren Erweiterungen machst. |
AW: FormCloseQuery FormShowing abfrage
Es soll quasi nur dann schliessen wenn Form1 die einzige angezeigte form ist.
Zitat:
Delphi-Quellcode:
der fängt mit Form2 an und hört mit Form8 auf hab da ja kein maxform-1 stehen
for i := 2 to maxform do
form 1 is ja klar das die noch angezeigt wird weils das hauptfenster ist, aber alle anderen sollen geschlossen werden.
Delphi-Quellcode:
und das was ich bei der for schleife mit 2 anfange hab ich vorher ja schon festgelegt bei L
L := 1;
|
AW: FormCloseQuery FormShowing abfrage
Moin Capa,
hier mal ein anderer Ansatz:
Delphi-Quellcode:
Alle Unterformulare bekommen, entweder manuell im Objektinspektor, oder per Programm im OnCreate die Eigenschaft Tag auf 1 gesetzt (Tag ist ein beliebig verwendbarer Integerwert).
var
i : Integer; begin for i := 0 to Application.ComponentCount-1 do begin if Application.Components[i] is TForm then begin if (Application.Components[i] as TForm).Visible and ((Application.Components[i] as TForm).Tag = 1) then begin CanClose := False; break; end;; end; end; if not CanClose then MessageBox(self.Handle,'Erst alle anderen Formulare schliessen','Fehler',MB_ICONERROR); end; Sobald eines sichbar ist, und Tag=1 ist darf das Hauptformular nicht geschlossen werden. |
AW: FormCloseQuery FormShowing abfrage
funzt super :) danke
dann weiß ich jetzt auch wie ich meine anderen Probleme lösen kann ;) Mfg Capa |
AW: FormCloseQuery FormShowing abfrage
Wofür denn das Tag setzen? Nur um herauszufinden, ob die Form nicht die MainForm ist?
Delphi-Quellcode:
Das geht immer und man kann dabei nichts vergessen (z.B. das Tag setzen)
If MyForm <> Application.MainForm then
|
AW: FormCloseQuery FormShowing abfrage
Wenns mir um die Mainform gehen würde könnte ich auch name='Form1'; abfragen
aber so kann ich zum bsp auch das Programm schliessen lassen, wenn noch ne Form angezeigt wird wo keine speicherrelevanten daten drin sind sondern nur anzeigen. |
AW: FormCloseQuery FormShowing abfrage
Könnte man nicht einfach Screen.FormCount abfragen?
|
AW: FormCloseQuery FormShowing abfrage
Diese MainForm prüft alle (mit Application als Owner) Formulare, ob diese sich schließen können.
Mit der Property CloseForce kann man das Schliessen erzwingen (was beim Abmelden/Herunterfahren -> WM_ENDSESSION auch gemacht wird).
Delphi-Quellcode:
unit frmMain;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class( TForm ) procedure FormCloseQuery( Sender : TObject; var CanClose : Boolean ); procedure FormCreate( Sender : TObject ); private FCloseForce : Boolean; protected procedure WMEndSession( var message : TWMEndSession ); message WM_ENDSESSION; public property CloseForce : Boolean read FCloseForce write FCloseForce; end; var Form1 : TForm1; implementation uses frmData; {$R *.dfm} procedure TForm1.FormCloseQuery( Sender : TObject; var CanClose : Boolean ); var idx : Integer; begin if not CloseForce then for idx := 0 to Application.ComponentCount - 1 do if ( Application.Components[idx] <> Self ) and ( Application.Components[idx] is TForm ) then CanClose := CanClose and TForm( Application.Components[idx] ).CloseQuery; end; procedure TForm1.FormCreate( Sender : TObject ); begin CloseForce := False; end; procedure TForm1.WMEndSession( var message : TWMEndSession ); begin inherited; CloseForce := True; end; end. |
AW: FormCloseQuery FormShowing abfrage
oO wieso sollte ich das den erzwingen wollen der user soll doch das programm solange nicht schliessen können
bis alle forms geschlossen sind, wenn ich das nun erzwinge is doch das ganze was ich damit versuche zu erreichen zwecklos oder seh ich das falsch ? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:31 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