Fechamento de Forms

23/05/2003

1

: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
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira