Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi alle Formulare bis auf Form1 schließen, aber wie? (https://www.delphipraxis.net/61298-alle-formulare-bis-auf-form1-schliessen-aber-wie.html)

Mazel 19. Jan 2006 17:14


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:
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;
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.

Delphi-Quellcode:
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;
Da kommt dann eine Fehlermeldung. Hoffe mir kann jemand helfen.

Gruß
Mazel

sniper_w 19. Jan 2006 17:18

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;

Matze 19. Jan 2006 17:19

Re: alle Formulare bis auf Form1 schließen, aber wie?
 
Hallo

Zitat:

Zitat von Mazel
Da kommt dann eine Fehlermeldung.

Welche kommt denn?

Mazel 19. Jan 2006 17:42

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.

Mazel 19. Jan 2006 18:33

Re: alle Formulare bis auf Form1 schließen, aber wie?
 
Ich habe nun eine Lösung gefunden. Ich habe es immer mit
Delphi-Quellcode:
SendMessage(hwnd, SC_CLOSE, 0, 0)
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.

Gruß
Mazel

marabu 19. Jan 2006 18:45

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:
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;
Grüße vom marabu

Mazel 19. Jan 2006 21:35

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

SirThornberry 20. Jan 2006 06:59

Re: alle Formulare bis auf Form1 schließen, aber wie?
 
mit Screen.FormCount und Screen.Forms[] kannst du auch alle Forms durchlaufen

Mazel 20. Jan 2006 07:38

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:
 for j:=0 to Screen.FormCount - 1 do If Screen.Forms[j] <> Application.MainForm then Screen.Forms[j].Close;
oder es kommt eine Fehlermeldung, "Listenindex überschreitet das Maximum (125)", wenn ich
Delphi-Quellcode:
 
 for j:=1 to Screen.FormCount do ...
benutze.

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 16:32 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