Criar e destruir botao em tempo de execução

04/11/2005

Salve pessoal,

Estou com dificuldade em implementar uma rotina ao meu sistema, seguinte tenho uma aplicação que esta usando forms do tipo MDI, no botton do form principal eu coloquei uma toolbar ... o que eu tenho que fazer é o seguinte, quado os forms filhos forem abertos em tempo de execuçao eu tenho que criar na toolbar um botao referente a este form de maneira que quando eu clicar no botao o form correspondente viria a frente dos outros forms. Quando o form for fechado o botao referente a ele tem que ser destruido na toolbar.

1 - Como criar em tempo de execução botoes na tollbar?

2 - Como atribuir ao botao criado um evendo click com a instrução que vai mandar o form correspondente para frente?

3 - Como destruir o botao assim que o form for fechado???

Espero que eu tenha conseguido passar minha duvida, se alguem puder me ajudar.

valews


Mmoreira

Melhor resposta

04/11/2005

Salve pessoal, Estou com dificuldade em implementar uma rotina ao meu sistema, seguinte tenho uma aplicação que esta usando forms do tipo MDI, no botton do form principal eu coloquei uma toolbar ... o que eu tenho que fazer é o seguinte, quado os forms filhos forem abertos em tempo de execuçao eu tenho que criar na toolbar um botao referente a este form de maneira que quando eu clicar no botao o form correspondente viria a frente dos outros forms. Quando o form for fechado o botao referente a ele tem que ser destruido na toolbar.


você precisa ter três rotinas prontas: a que cria o botão e atribui a ele o evento do OnClick e etc., uma outra para excluir o botão e a terceira, que colocará em foco o form correspondente ao botão clicado.

//cria o botão
procedure TForm1.CriaBotao(Formulario: TForm);
begin
  with TToolButton.Create(ToolBar1) do
  begin
    Caption := Formulario.Caption;
    Parent := ToolBar1;
    Name := ´btn´+Formulario.Name;
    OnClick := FormEmFoco; // rotina para "focar" o form
  end;
end;

//põe o form em foco em função do botão clicado
procedure TFormPrincipal.FormEmFoco(Sender: TObject);
var
  NomeForm: string;
begin
  NomeForm := TToolButton(Sender).Name;
  NomeForm := Trim(Copy(NomeForm,4,Length(NomeForm)));
  TForm(Application.FindComponent(NomeForm)).WindowState := wsNormal;
  TForm(Application.FindComponent(NomeForm)).SetFocus;
end;

//apaga o botão se o form correspondente a ele for fechado 
procedure TForm1.DestroiForm(Sender: TObject);
begin
  ToolBar1.FindComponent(´btn´+TForm(Sender).Name).Destroy;
end;


pronto.

feito isso, na criação dos forms, faça:
procedure TFormPrincipal.Form2Click(Sender: TObject);
begin
  Application.CreateForm(TForm2,Form2);
  Form2.OnDestroy := DestroiForm;
  CriaBotao(Form2);
end;

procedure TFormPrincipal.Form3Click(Sender: TObject);
begin
  Application.CreateForm(TForm3,Form3);
  Form3.OnDestroy := DestroiForm;
  CriaBotao(Form3);
end;

e assim por diante....



Emerson

Responder Citar

Outras Respostas

04/11/2005

Vitor^_^

Bem, considerando que você já escolheu o que fazer com as forms mdi child ao criá-las, mostra-las, fechá-las e destruí-las, vamos ao que interessa:

para criar os botoes na toolbar:

procedure TfrmPrincipal.Button1Click(Sender: TObject);
var bt: TToolButton;
begin
  bt := TToolButton.Create(self);
  bt.Parent := ToolBar1;
end;


a minha toolbar eu coloquei o showcaptions como true, já mostro porque.

a fim de todas as forms mdichild que eu usar ´aparecerem´ como botoes e desaparecerem quando a form for destruida, eu criei um modelo e herdei as outras forms dela.

crie uma form e coloque na seção private dela:

procedure MostreMe(sender: tobject);


aí, na implementation:

procedure TfrmModeloFilha.MostreMe(sender: tobject);
begin
  if self <> nil then
    self.show;
end;



no evento onclose:


procedure TfrmModeloFilha.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  action := cafree; //pode ser cahide, vc decide
  //release;
end;



no oncreate:


procedure TfrmModeloFilha.FormCreate(Sender: TObject);
var bt: TToolButton;
begin
  bt := TToolButton.Create(self);
  bt.Parent := frmPrincipal.ToolBar1;
  bt.Caption := self.Caption; //pode ser qualquer coisa
  bt.OnClick := mostreme;
end;



tudo vai depender se vc quiser a closeaction como cafree, pra liberar ou como cahide, pra esconder. Se for cafree, quando a form fechar, será destruida e o botão sumirá, então vc teria que criar as formas com outro botão ou menu, e não deixar criar na execução do programa. Se for cahide, que é o default, vc pode criar logo que o seu projeto abre, ou seja, deixe ela na abertura do seu projeto normalmente. Os botões serão destruidos quando vc fechar a application. se vc fecha uma form ela some, se vc clica no botãozinho que ela criou, ela reaparece. Fica legal assim, eu acho. Vc pode criar todas as suas forms mdichild herdadas desta.

espero ter ajudado ^^


Responder Citar

04/11/2005

Vitor^_^

daanh, cahide não é defult, e vc não pode dar um hide nima form mdichild... sempre esqueço desses negócios com mdi... bom.. o esquema é esse. Vc pode fazer outra coisa mais complicada... mostrar o botao quando fecha/destroi a form e fazer a form ser criada/mostrada quando o botão for clicado, aí vc some com o botão. Mas é bem mais complicado, tem que criar uma classe persistente, dizer que ela é do tipo da tua form, fazer typecasting, criar, destruir... tem bastante exemplos desse no forum.

Flw!


Responder Citar

04/11/2005

Vitor^_^

oia q legal, vc pode colocar tambem no onclose:

  action := canone;
  showwindow(self.Handle, sw_hide);


e no mostre-me

procedure TfrmModeloFilha.MostreMe(sender: tobject);
begin
  showwindow(self.Handle, SW_SHOW);
  self.Show;
end;


pode colocar os códicos para sumir os botoes no mostreme e para aparecer no close, aí é só controlar pra não criar mais instancias da sua form desnecessariamente ou assegurar que todas sejam destruidas da finalização do aplicativo. Se vc criou elas passando self como owner não tem problema. Só uma coisa, elas não podem ser modais. vc pode por um comando ou botão especial na propria form que dê um release nela (aí vc teria que recriar com outro botão ou menu, ou verificar se ela já está criada, se estiver mostrar, se não criar e mostrar). As possibilidades são infinitas!


Flw!


Responder Citar

07/11/2005

Mmoreira

Vitor
Emerson

Muito obrigado pela atencao, com as dicas passadas conseguir resolver meu problema ... funcionou blzinha!!!!

valewsss


Responder Citar