Como fechar todos os forms abertos no aplicativo
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 :?:
Obrigado
Marcos :?:
Pr.mas
Curtidas 0
Respostas
Ltres
14/02/2004
Cara ai tem uma rotina q no button1 fecha os forms abertos menos o principal e no button2 abre o form2 e form3.
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.
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.
GOSTEI 0
Pr.mas
14/02/2004
Valeu LTres!!!
Obrigado pela dica.
Marcos
Obrigado pela dica.
Marcos
GOSTEI 0
Fknyght
14/02/2004
Ai, esta função de fechar todos os forms não funciona se o form for criado desta maneira
ela so funciona se o form for criado da seguinte forma
Tem alguma maneira outra maneira de fechar os forms abertos sem ser esta.
Grato
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
GOSTEI 0
Fknyght
14/02/2004
Ai, tava fazendo umas modificações no código e resolvir testar para ambos os metodos de criação de forms:
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 :)
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 :)
GOSTEI 0
Paulo_amorim
14/02/2004
Olá
Se os forms forem abertos em ShowModal, pode-se tentar fazer (continuando o codigo do LTres)
Espero que ajude
Até+
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é+
GOSTEI 0
Ltres
14/02/2004
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
pelo q testei funcionou blz.. se tiver duvidas manda ai
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
GOSTEI 0
Ltres
14/02/2004
a digitei errado,,, ali na funcao CriaForm altere o seguinte
e tb
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);
GOSTEI 0