Fórum Como fechar todos os forms abertos no aplicativo #214094

14/02/2004

0

Gostaria de saber se tem uma function ou procedure que feche todos os forms abertos no aplicativo, para logout. Alguém sabe de alguma rotina, função, procedure etc...

Obrigado


Marcos :?:


Pr.mas

Pr.mas

Responder

Posts

14/02/2004

Ltres

Cara ai tem uma rotina q no button1 fecha os forms abertos menos o principal e no button2 abre o form2 e form3.

procedure TForm1.Button1Click(Sender: TObject);
var
  n: integer;
begin
  for n:=0 to Application.ComponentCount-1 do
  if Application.Components[n] is TForm then
    if not(TForm(Application.Components[n]) = Application.MainForm) then
      if TForm(Application.Components[n]).Showing then TForm(Application.Components[n]).Close;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Form3.Show;
  Form2.Show;
end;


Lembrando q se quiser tirar eles da memoria vc tem q adicionar o comando TForm(Application.Components[n]).Free no button1, e para abrir Application.CreateForm(TForm2, Form2); depois dar o show.


Responder

Gostei + 0

14/02/2004

Pr.mas

Valeu LTres!!!

Obrigado pela dica.

Marcos


Responder

Gostei + 0

14/07/2004

Fknyght

Ai, esta função de fechar todos os forms não funciona se o form for criado desta maneira

Form2 := TForm2.Create( Self ); Form2.Show;



ela so funciona se o form for criado da seguinte forma

application.CreateForm(TForm2,form2); Form2.Show;


Tem alguma maneira outra maneira de fechar os forms abertos sem ser esta.


Grato


Responder

Gostei + 0

14/07/2004

Fknyght

Ai, tava fazendo umas modificações no código e resolvir testar para ambos os metodos de criação de forms:


Form2 := TForm2.Create( Self ); Form2.Show;


application.CreateForm(TForm2,form2); Form2.Show;


Form2 := TForm2.Create( Application ); Form2.Show;



procedure FecharForms; var n : integer; Form : TForm; begin // Fechas os forms criados na aplicação Sair := False; n := 0; While n <= ( Application.ComponentCount - 1 ) do Begin if ( Application.Components[ n ] is TForm ) then Begin Form := TForm(Application.Components[n]); If ( Form <> Application.MainForm ) then Begin N := -1; Form.Close; Form.Free; End; End; Inc( N ); End; // Fechas os forms criados no formulário principal n := 0; While n <= ( Application.MainForm.ComponentCount - 1 ) do Begin if ( Application.MainForm.Components[ n ] is TForm ) then Begin Form := TForm(Application.MainForm.Components[n]); If ( Form <> Application.MainForm ) then Begin N := -1; Form.Close; Form.Free; End; End; Inc( N ); End; End;



O código acima não esta dentro de um for porque qdo der o [b:580f86a6a4]FREE[/b:580f86a6a4] no formulário aberto, o mesmo sai da lista de componentes, causando um erro de aplicação.

Quando damos um FREE no form, temos que reeniciar a consulta deste a partir do zero. Esta função faz isso perfeitamente

Qualquer duvida tamos ai
Qualquer melhoração no código sera bem vinda :)


Responder

Gostei + 0

14/07/2004

Paulo_amorim

Olá

Se os forms forem abertos em ShowModal, pode-se tentar fazer (continuando o codigo do LTres)

TForm(Application.Components[n]).ModalResult := 1;


Espero que ajude
Até+


Responder

Gostei + 0

14/07/2004

Ltres

bom realmente se vc criar um form fora do TApplication ele naum vai fechar. Mas pra resolver o problema vc pode criar uma função geradora de forms, ai guardar o handle ou o proprio form para fecha-lo quando chamar outra função. Veja o codigo q fiz
var
  Form1: TForm1;
  OutForm: TForm;

  ListFormsOut: array of HWND;

implementation

{$R *.dfm}

procedure FechaFormsForaAPP;
var
  n: integer;
begin
  for n := 0 to Length(ListFormsOut)-1 do
  begin
    SendMessage(ListFormsOut[n], WM_CLOSE, 0, 0);
    SendMessage(ListFormsOut[n], WM_DESTROY, 0, 0);
  end;
end;

procedure CriaForm(vC: TClass; var vF: TForm);
var
  n: integer;
begin
  vF := TFormClass(vC).Create(nil);

  if vF <> nil then
  begin
    n := Length(ListFormsOut);
    SetLength(ListFormsOut, n+1);
    ListFormsOut[n] := vF.Handle;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  CriaForm(TForm, OutForm);
  OutForm.Show;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  FechaFormsForaAPP;
end;


pelo q testei funcionou blz.. se tiver duvidas manda ai


Responder

Gostei + 0

14/07/2004

Ltres

a digitei errado,,, ali na funcao CriaForm altere o seguinte
procedure CriaForm(vC: TClass; var vF: TForm);
//por
procedure CriaForm(vC: TFormClass; var vF: TForm);

e tb
vF := TFormClass(vC).Create(nil);
//por
vF := vC.Create(nil);



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar