Ir para conteúdo
Fórum Script Brasil
  • 0

Controle Dos Mdi Abertos...


McBlade

Pergunta

Não sei se o assunto ficou bem definido mas funciona o seguinte...

Tenho uma aplicação que cria 'n' forms MDIChild dentro do Principal, e pra cada Child criada, eu crio um BitBtn num Panel alinhado ao Topo para fazer controlar semelhante ao menu Janela do Word com N documentos abertos sabem?

Problema: Quando associo o evento onClick do BitBtn, qualquer um que eu clicar faz um efeito tipo "Next" nos Forms Childs... Como fazer para que ao clicar no Botao, apenas o form correspondente a ele venha a frente? Obs.: Todos eles são criados com WindowState = wsMaximized... Segue código:

...
  private
    I: Integer; // controla os MDI
    Form: TForm2;
  ...

procedure TForm1.Create(Sender: TObject);
begin
  I := 0;
end;

procedure TForm1.BotaoCriar(Sender: TObject);
begin
  Form  := TForm2.Create(Form1);
  Form.Caption := 'Form'+IntToStr(I+1);
  BitBtn := TBitBtn.Create(Form2); // faz o botao pertencer ao form2
  BitBtn.Parent := Panel1;
  BitBtn.Align  := alLeft;
  BitBtn.Tag    := I;
  Inc(I);
  BitBtn.OnClick := Clique;
end;

procedure TForm1.Clique(Sender: TObject);
begin
  MDIChildren[(Sender as TBitBtn).Tag].Show;
end;

end.

O botao tem como Owner o Form2 por que ao clicar em fechar no Form2, o botao automaticamente se "freea" :lol: .

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0
...
  private
    I: Integer; // controla os MDI
    Form: TForm2;
  ...

procedure TForm1.Create(Sender: TObject);
begin
  I := 0;
end;

procedure TForm1.BotaoCriar(Sender: TObject);
begin
  Form  := TForm2.Create(Form1);
  Form.Caption := 'Form'+IntToStr(I+1);
  BitBtn := TBitBtn.Create(Form2); // faz o botao pertencer ao form2
  BitBtn.Parent := Panel1;
  BitBtn.Align  := alLeft;
  BitBtn.Tag    := I;
  Inc(I);
  BitBtn.OnClick := Clique;
end;
...
O botao tem como Owner o Form2 por que ao clicar em fechar no Form2, o botao automaticamente se "freea" :lol:.
não quero estragar sua alegria não, mas você tem que utilizar o conteúdo da variável para o qual você criou (alocou) a instância da classe TForm2, neste caso Form, não a variável Form2 declarada globalmente na unit aonde o form está. ;)
...

procedure TForm1.Clique(Sender: TObject);
begin
  MDIChildren[(Sender as TBitBtn).Tag].Show;
end;

end.
nesta parte, você provavelmente terá problemas. Veja o que o help diz sobre property MDIChildren[i: Integer]: TForm; The order of MDI children changes as different MDI forms are activated. Initially, forms are listed in creation order, with new forms being added to the end of the array. Whenever an MDI child is activated, however, it moves to the front of the list. Thus, use I to index over all forms in the array, but not to refer to a specific form. Aliás, talvez resida justamente aí o seu problema. Verifique um dos efeitos: Crie umas 5 janelas, depois feche o 1º e 2º form's criados; clique nos botões que sobraram, e ... Ao clicar num botão com a tag = 3 ou 4 você não vai conseguir posicionar com MDIChildren[(Sender as TBitBtn).Tag].Show sem que obtenha erro, porque você estourará o índice! (só existem 3 forms: 0, 1, 2); De forma similar, você pode estar clicando num botão com tag = 2 mas como a ordem na lista MDIChildren muda conforme as janelas recebem o foco, depois de algumas mudanças de janelas, não há qualquer garantia de que MDIChildren[2] refere-se realmente ao 3º fom criado. A solução é verificar na lista de janelas disponíveis (abertas), qual é exatamente aquela associada ao botão, certo?! Uma coisa é fato: tem que percorrer a lista de janelas filhas! Então, percorrendo esta lista, temos algumas opções para verificar quem-é-quem: 1) na criação do form, você utiliza a propriedade Tag do mesmo para guardar o valor atribuído à tag do botão e, então, testa ambas as Tag's;
if MDIChildren[I].Tag = (Sender as TBitBtn).Tag then
2) na criação do form, você anexa ao nome do mesmo o valor atribuído à tag do botão - tipo FormChild1, FormChild2,... - e testa pelo nome no formato utilizado na criação;
if MDIChildren[I].Name = 'FormChild'+IntToStr((Sender as TBitBtn).Tag+1) then
3) como na criação do botão, você atribui a ele o Form como Owner, então, você testa por esta condição;
if MDIChildren[I] = (Sender as TBitBtn).Owner then
a procedure completa para o caso 3:
procedure TForm1.Clique(Sender: TObject);
var
  I :Integer;
begin
  for I := 0 to Self.MDIChildCount -1 do
    if MDIChildren[I] = (Sender as TBitBtn).Owner then
      MDIChildren[I].Show;
end;

Confira o que eu postei aqui (vai que estou falando abobrinha...) e teste.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,2k
×
×
  • Criar Novo...