![]() |
alle Formulare bis auf Form1 schließen, aber wie?
Hallo, ich habe ien kleines Programm geschrieben bei dem nach der Eingabe einer Zahl genau so viele Fenster geöffnet werden. Nun wollte ich wissen wie ich alle Fenster bis auf das Hauptformular schließen kann?
mein Code:
Delphi-Quellcode:
Wie ich einige Fenster erzeugen kann ist klar, aber alle wieder schließen ohne die Anwendung zu beenden hab ich nicht hinbekommen. Habe es mit FindWindow und FindWindowEx probiert aber es geht nicht so wie ich will.
Randomize;
for i:=1 to StrToInt(Field.Text) do begin Form2:=TForm2.Create(Self); Form2.Caption:='Fenster ' + IntToStr(i); Form2.Label1.Caption:='Nur noch ' + IntToStr(i) + ' Fenster zu schließen'; Form2.Left:=Random(Screen.Width - Form2.Width); Form2.Top:=Random(Screen.Height - Form2.Height); Form2.Show; end;
Delphi-Quellcode:
Da kommt dann eine Fehlermeldung. Hoffe mir kann jemand helfen.
for j:=1 to i do
begin hWnd:=FindWindow(nil, PChar('Fenster ' + IntToStr(j))); If hWnd <> 0 then begin hBtn:=FindWindowEx(hWnd, 0, nil, 'alle schließen'); If hBtn <> 0 then CloseHandle(hWnd); end; end; Gruß Mazel |
Re: alle Formulare bis auf Form1 schließen, aber wie?
So in etwa...
Delphi-Quellcode:
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] <> Application.MainForm then begin TForm(Application.Components[i]).Close(); end; end; end; end; |
Re: alle Formulare bis auf Form1 schließen, aber wie?
Hallo
Zitat:
|
Re: alle Formulare bis auf Form1 schließen, aber wie?
@Matthias
Die Fehlermedlung lautet. "Externe Exception C0000008" @sniper_w Der Code funz nicht. Ich habe in den einzelnen Fenstern einen Button und von dort aus soll man alle Fenster schließen können. Der Button führt zu einer Prozedur die in der Unit1 liegt und von dort aus sollen alle Fenster außer der MainForm geschlossen werden, es geht aber leider nicht. Hinweis: Form2 wird nicht automatisch bei Programmstart erzeugt sonder liegt als verfügbar vor. |
Re: alle Formulare bis auf Form1 schließen, aber wie?
Ich habe nun eine Lösung gefunden. Ich habe es immer mit
Delphi-Quellcode:
versucht, da ich mich mit dem Senden von Botschaften nicht auskenne, ich brauchte aber bloß aus dem SC_CLOSE ein WM_CLOSE zu machen und schon läufts.
SendMessage(hwnd, SC_CLOSE, 0, 0)
Gruß Mazel |
Re: alle Formulare bis auf Form1 schließen, aber wie?
Das Problem war eigentlich, dass die MainForm der Owner der Forms war, die du löschen wolltest. So hätte es sicher funktioniert - und durch Release() anstelle Close() werden auch ausstehende Ereignisse noch bearbeitet. Ist bei deinem Test wohl nicht so wichtig, aber in echten Situationen schon:
Delphi-Quellcode:
Grüße vom marabu
procedure TMainForm.CloseAll;
var i: Integer; begin for i := Pred(ComponentCount) downto 0 do if Components[i] is TForm then TForm(Components[i]).Release(); end; procedure TMainForm.ShowButtonClick(Sender: TObject); var i: Integer; begin for i := 1 to 5 do with TDemoForm.Create(self) do Show; end; procedure TDemoForm.CloseButtonClick(Sender: TObject); begin MainForm.CloseAll; end; |
Re: alle Formulare bis auf Form1 schließen, aber wie?
Gut, bei meinem Programm handelt es sich lediglich um eine kleines Fun Programm bei dem viele fenster geöffnet werden und die will ich halt nur wieder schließen.
Ich werde mir aber den Code gut merken :thumb: Gruß Mazel |
Re: alle Formulare bis auf Form1 schließen, aber wie?
mit Screen.FormCount und Screen.Forms[] kannst du auch alle Forms durchlaufen
|
Re: alle Formulare bis auf Form1 schließen, aber wie?
Screen.FormCount und Screen.Forms[] funktioniert aber beim schließen bleibt immer ein Fenster offen
wenn ich folgendes asuprobiere:
Delphi-Quellcode:
oder es kommt eine Fehlermeldung, "Listenindex überschreitet das Maximum (125)", wenn ich
for j:=0 to Screen.FormCount - 1 do If Screen.Forms[j] <> Application.MainForm then Screen.Forms[j].Close;
Delphi-Quellcode:
benutze.for j:=1 to Screen.FormCount do ... Ich hatte erst gedacht Screen.FormCount zählt alle Fenster, dann habe ich aber mehrere Fenster wie Explorer geöffnet aber es blieb bei 125. Ich weiss nicht warum er 125 zählt, es gibt 1 HauptForm und 123 weitere Fenster, sind 124, warum dann FormCount = 125? Gruß Mazel |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:29 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 by Thomas Breitkreuz