Fechamento de Forms
23/05/2003
0
: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]
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]
Zicosh3
Curtir tópico
+ 0
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
Clique aqui para fazer login e interagir na Comunidade :)