Array
(
)

Form Ativo da Aplicação

Edvilson.chaves
   - 25 jan 2006

Bom Dia!!!

Gostaria de saber se existe alguma forma de encontrar pela classe ´Application´ qual é o último form ou o form ativo da minha aplicação? E que estou criando um componente de mensagens mas não quero passar como parâmetro o objeto pai a criar gostaria apenas de mandar a mensagem e algumas opções. Hoje ele cria mas quando estou clicando em um outro ponto da tela ou troco de aplicação (ALT+TAB) o meu form perde o foco, gostaria que sempre que a aplicação estivesse ativa ou qdo fosse selecionada o form sempre seria o primeiro e sempre seria apresentado. A chamada da minha função seria algo assim:

mensagem(´Minha Mensagem´, ´Meu Título´, [btSim, btNao])

P.S.: Já vi que existe no Application algo como ´Components´ poderia verificar por aí testando com ´is TForm´ e usando ´as TForm´ para pegar a propriedade ´Visible´ e ´Enabled´?

Muito Obrigado clube!!


Michael
   - 25 jan 2006

Olá!

Use as propriedades ActiveForm e/ou ActiveCustomForm, do objeto TScreen para saber qual formulário tem foco na sua aplicação.

Lembre-se que o Delphi inicializa automaticamente uma variável global chamada Screen do tipo TScreen. Vc portanto não precisa criá-la.

#Código

Screen.ActiveForm


Não existe no objeto Application uma propriedade chamada Components. Vc deve estar confundindo com a classe TForm, que, por descender de TComponent, disponibiliza este campo. Para simular o que vc mencionou, novamente através de Screen, use as propriedades Forms e FormCount, que dão acesso, respectivamente, à lista de forms abertos na aplicação e à quantidade destes forms.

[]´s


Edvilson.chaves
   - 25 jan 2006

Olá!!!

Sou eu novamente fiz como você me pediu utilizando Screen.ActiveForm só que acho que pelo fato de eu estar usando CLX não deve estar funcionando! Ocorre o mesmo erro esse é o código simples de algo que estou aplicando mas não está funcionando vê o que c me diz.

Valeu. T+.

unit Unit1;
...
...
...
procedure MENSAGEM(const pMensagem: String);

implementation

uses Unit2;

{$R *.xfm}

procedure MENSAGEM(const pMensagem: String);
var
lForm2: TForm2;
begin
lForm2 := TForm2.Create(Screen.ActiveForm);
try
lForm2.Label1.Caption := pMensagem;
lForm2.ShowModal;
finally
FreeAndNil(lForm2);
end;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
MENSAGEM(´OLA MUNDO´);
end;

end.

O Resultado é que quando fico alternando entre aplicações ALT+TAB o Form2 desaparece e só reaparece quando clico sobre o Form1.


Michael
   - 25 jan 2006

Colega,

Vc está fazendo uma pequena confusão. O parâmetro Owner, informado no construtor Create, indica qual componente será responsável por liberar a instância sendo criada da memória quando ele for destruído. Então, não vai funcionar como vc espera.

Outro problema, quando se informa um Owner diferente de nil, não se deve liberar o objeto explicitamente, deixando essa tarefa para o seu proprietário. Código como este introduz desnecessariamente riscos na aplicação de memory leaks, quedas de performance e bugs difíceis de serem encontrados.

Explique melhor o que vc gostaria de fazer para que os outros colegas do fórum e eu possamos ajudá-lo melhor.

[]´s