AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi alle Formulare bis auf Form1 schließen, aber wie?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Mazel · begonnen am 19. Jan 2006 · letzter Beitrag vom 20. Jan 2006
Antwort Antwort
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#1

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

  Alt 19. Jan 2006, 18:14
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
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Benutzerbild von sniper_w
sniper_w

Registriert seit: 12. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#2

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

  Alt 19. Jan 2006, 18:18
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;
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#3

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

  Alt 19. Jan 2006, 18:19
Hallo

Zitat von Mazel:
Da kommt dann eine Fehlermeldung.
Welche kommt denn?
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#4

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

  Alt 19. Jan 2006, 18:42
@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.
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#5

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

  Alt 19. Jan 2006, 19:33
Ich habe nun eine Lösung gefunden. Ich habe es immer mit
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
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

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

  Alt 19. Jan 2006, 19:45
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
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#7

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

  Alt 19. Jan 2006, 22:35
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

Gruß
Mazel
Marcel Jänicke
www.mj-software.net
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

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

  Alt 20. Jan 2006, 07:59
mit Screen.FormCount und Screen.Forms[] kannst du auch alle Forms durchlaufen
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Mazel
Mazel

Registriert seit: 11. Nov 2005
Ort: Leipzig
831 Beiträge
 
#9

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

  Alt 20. Jan 2006, 08:38
Screen.FormCount und Screen.Forms[] funktioniert aber beim schließen bleibt immer ein Fenster offen
wenn ich folgendes asuprobiere:

 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
Marcel Jänicke
www.mj-software.net
  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 18:20 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