Array
(
    [0] => stdClass Object
        (
            [Votos_Balanceados] => 1
            [id] => 301733
            [titulo] => Criar e destruir botao em tempo de execução
            [dataCadastro] => DateTime Object
                (
                    [date] => 2005-11-04 00:00:00
                    [timezone_type] => 3
                    [timezone] => America/Sao_Paulo
                )

            [isFirstPost] => -1
            [idUsuario] => 234045
            [status] => A
            [isExample] => 
            [NomeUsuario] => Emerson E Nascimento
            [Login] => emerson.en
            [Apelido] => Emerson
            [Foto] => 
            [Conteudo] => [quote:e15fd1bb81=´mMOREIRA´]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.[/quote:e15fd1bb81]

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.

[code:1:e15fd1bb81]//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;[/code:1:e15fd1bb81]

pronto.

feito isso, na criação dos forms, faça:
[code:1:e15fd1bb81]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....[/code:1:e15fd1bb81]


) )

Criar e destruir botao em tempo de execução

Mmoreira
   - 04 nov 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


Post mais votado

Emerson
   - 04 nov 2005


Citação:
:e15fd1bb81=´mMOREIRA´]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.
:e15fd1bb81]

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.

#Código

:1:e15fd1bb81]//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;
:1:e15fd1bb81]

pronto.

feito isso, na criação dos forms, faça:
#Código
:1:e15fd1bb81]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....
:1:e15fd1bb81]


Vitor^_^
   - 04 nov 2005

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:

#Código

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:

#Código
procedure MostreMe(sender: tobject);


aí, na implementation:

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



no evento onclose:


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



no oncreate:


#Código
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 ^^


Vitor^_^
   - 04 nov 2005

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!


Vitor^_^
   - 04 nov 2005

oia q legal, vc pode colocar tambem no onclose:

#Código

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


e no mostre-me

#Código
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!


Mmoreira
   - 07 nov 2005

Vitor
Emerson

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

valewsss