Criar e destruir botao em tempo de execução
04/11/2005
0
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
Post mais votado
04/11/2005
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 Nascimento
Mais Posts
04/11/2005
Vitor Rubio
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 ^^
04/11/2005
Vitor Rubio
Flw!
04/11/2005
Vitor Rubio
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!
07/11/2005
Mmoreira
Emerson
Muito obrigado pela atencao, com as dicas passadas conseguir resolver meu problema ... funcionou blzinha!!!!
valewsss
Clique aqui para fazer login e interagir na Comunidade :)