Fechamento de Forms

23/05/2003

2

:D

Olá pessoal,

Tenho alguns forms abertos ao mesmo tempo, mas quando vou abrir um determinado form não quero que um outro fique aberto.
Como posso saber se o outro está aberto e como fechá-lo automáticamente?

Obrigado desde já
Zico.[/b]


Responder

Posts

23/05/2003

Carnette

:D Olá pessoal, Tenho alguns forms abertos ao mesmo tempo, mas quando vou abrir um determinado form não quero que um outro fique aberto. Como posso saber se o outro está aberto e como fechá-lo automáticamente? Obrigado desde já Zico.[/b]


[b:9e796e25c6]Tirado do arquivo 800 dicas e truque em Delphi do LloydSoft[/b:9e796e25c6]

www.lloydsoft.hpg.ig.com.br

Descobrindo se um form já está criado
Bem saber se um form já esta ou não criado, melhor dizer instanciado, não é um problema muito crítico, abaixo pode-se ver uma unit padrão criada com um form vazio no Delphi, esta unit alem de declarar o nova classe TForm1 cria também uma variável Form1 do Isto é muito importante que seja observado, uma variável para um tipo ´FORM´ nada mais é que um ponteiro, ou seja ela apenas mostra em que local da memória está a instancia do seu form, enquanto o seu form não existir este ponteiro deve apontar para lugar

unit Unit1
interface
uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var Form1: TForm1;
implementation
{$R *.DFM}
end.
Partindo deste princípio podemos verificar se um form foi ou não instanciado verificando o valor guardado em FORM1, se este valor for diferente de ´NIL´ significa que o Form já foi instanciado...

Bem a coisa não é assim tão simples, imagine que um amigo mudou-se para São Paulo e lhe passou seu novo endereço, você recebe e anota em sua agenda,. depois de dois meses ele resolve que não quer mais morar em São Paulo e vai embora, ok o fato de seu amig

A forma mais limpa e automática para se contornar este problema nos obriga acodificar o seguinte no evento OnDestroy do Form :

procedure TForm1.FormDestroy(Sender: TObject);
begin
Form1 := nil;
end;
Assim, quando o ´FORM1´ for destruído ele apaga o seu endereço junto.

Assim quando for instanciar um form utilize a seguinte verificação:

if Form2 = nil then
Form2 := TForm2.Create(Self);
Form2.Show;...
Interessante que o Show quando um form já esta criado tem o efeito de umBringToFront.

Bem tudo isso resolve parte do problema, a outra parte tem de ser resolvida por você estruturando o seu programa de forma aos controles funcionem de acordo.

1 - Este controle não funciona para forms com múltiplas instancias, a não ser que você crie uma variável para cada instancia.

Pessoalmente eu nunca usei isso, se um form pode ter múltiplas instancias em MDI então controle por ActiveMDIChild e se for SDI então não sei porque ter mais de uma instancia.

2 - Quando for criar um novo form não crie variáveis desnecessariamente, utilize a variável que já esta sendo criada na unit do Form.

Ex: Dados FORM1 e FORM2

Apenas FORM1 está no AUTO-CREATE. Quando no uses de FORM1 for referenciada a unit UNIT2 a variável FORM2 estará acessível, use-a.

FORM2 := TFORM2.CREATE(SELF);
3 - Quando um Form é mostrado com ShowModal este tipo de controle não se aplica já que será impossível mostrar qualquer outro form.


Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar