MDICHILD SEMPRE VISÍVEL

24/07/2008

2

Olá a todos!!!

Bom, posto este tópico para achar a solução de um problema que venho tendo em uma aplicação...

Possuo um sistema baseado em um MDIForm e MDIChild´s...

Tenho que implementar a seguinte funcionalidade: Terei um novo botão na barra de títulos que servirá para tornar o form sempre visível [b:21a08cfd35]EM RELAÇÃO AO DEMAIS MDICHILD[/b:21a08cfd35].

Já tentei várioas maneiras: não posso usar fsOntayTop, pois isso o desvincula do MDIForm, já tentei utilizar a função setwindowpos, mas como isso deve ser feito no formulário já em execução não esta funcionando...

Bom, espero que tenha sido claro, quero torna um MDIChild sempre visível [b:21a08cfd35]EM RELAÇÃO A SEUS ´IRMÃOS´[/b:21a08cfd35].

Desde já, muito obrigado pela atenção!!


Responder

Posts

24/07/2008

Luiz Henrique

Bom dia Rhuan Pablo, tudo blz...

Visivel , vc quer dizer focado e em primeiro plano, aos demais ja instanciados ?


Responder

24/07/2008

Luiz Henrique

...ao clicar neste botao aí...


Responder

24/07/2008

Rhuan Pablo

Sim, ao clicar no botão ele fique sem em primeiro plano, não necessariamente com o foco, mas sem ´acima´ dos demais também instanciados.


Responder

24/07/2008

Rhuan Pablo

sem = sempre*


Responder

24/07/2008

Brunodsr

Essa é fácil.. hehhe

Coloca o formStyle dele como FsNormal e depois dá um show nele. Simples assim.

Agora complicando: hehehe

Se vc quiser que ele fique sempre na frente dos demais, simulando um comportamento modal, mas permitindo navegar entre as telas, implementa a função abaixo:

Procedure para deixar o form sempre na ativa
procedure ChildModal(hChildHandle: THandle);
begin
  while IsWindow(hChildHandle) do
  begin
    sleep(1);
    Application.ProcessMessages;
  end;
end;


Usando a procedure:

Var
  Hdl: THandle;
  Child: TForm;
Begin
  Child := TSeuFormChild.Create(self);
  Hdl := Child.Handle;
  ChildModal(Hdl);
end;


Falows


Responder

24/07/2008

Rhuan Pablo

Primeiramente muito obrigado brunodsr... Mas quem dera que fosse simples assim!

Primeiramente meu form tem que ser obrigatóriamente MDIChild...

Segundo: Eu não posso fazer isso no create do form, essa operação deve ser feita depois dele instanciado e em showing...

Terceiro: Esse método funcionaria, mas não seria uma solução muito ´correta´, digamos assim...

Bom, de qualquer maneira muito obrigado!

Att


Responder

24/07/2008

Brunodsr

Foi mal pelo simples, é que apanhei para uma situação parecida há algumas semanas. Não me leve a mal.

Mas vamos lá: Pq o teu for tem que ser obrigatoriamente child?? E a segunda solução é tranquila brother. ZERO efeito colateral.

Mas posta aí..


Responder

25/07/2008

Luiz Henrique

Bom dia Rhuan...

Uso uma funcao para abrir meus MDIChild nos projetos, é bem dinamica, se nao servir totalmente, penso que pode ser por ai:


//Ela busca para ver se o Form ja nao esta instanciado
//Cria ou coloca-o em primeiro plano...
//Retornando a instancia do mesmo...
Function TfmPrincipal.MyShowForm(FormClass: TFormClass): TForm;
var
I: Integer;
begin
Result := nil;
for I := 0 to Screen.FormCount - 1 do begin
if Screen.Forms[I] is FormClass then begin
Result := Screen.Forms[i];
end;
end;

if result = nil then begin
Application.CreateForm(FormClass,result);
end
else begin
if (result.WindowState = wsMinimized) then
result.WindowState := wsNormal;
result.Show;
end;
end;

//...na opcao de escolha(menu, button...metodo que for)...
//Ilustrando por uma action por exemplo:
procedure TfmPrincipal.actVendedorExecute(Sender: TObject);
begin
fmCadVendedor:= (MyShowForm(TfmCadVendedor) as TfmCadVendedor);
end;

Espero que te ajude
T+


Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira