Manipular componentes criados em tempo de execução

Delphi

27/07/2004

:? Tenho um programa que gera 10 componentes do tipo TLabel em tempo de execução. Eu gostaria de executar rotinas ao clicar em alguns deles. Por exemplo: Se clicar no 3º label exibirá uma mensagem ao usuário. Não sei como fazer porque os Labels são criados em tempo de execução e não de projeto.
Se fosse em tempo de projeto era só dar dois clicks sobre cada componente, em tempo de projeto, e digitar as linhas de código. Mas se eles não aparecem em tempo de projeto, o que faço?

Sonec2004@itelefonica.com.br


Sonec2004

Sonec2004

Curtidas 0

Respostas

Marcelo Saviski

Marcelo Saviski

27/07/2004

crie a procedure(que tenha os mesmos parametros do evento) que vai executar algo quando foi clicado, por exemplo:

procedure LabelClick(Sender: TObject);
begin
 //faz algo aqui
end;


e quando criar o componente:

LabelCriado.OnClick := LabelClick;



ok?


GOSTEI 0
Sonec2004

Sonec2004

27/07/2004

Marcelo,
Obrigado pela ajuda, mas ainda tenho uma dúvida. Meu código é assim:
Procedure CriaLabel;
Var
CriaLabel : Array[1..10] of TLabel;
i: Integer;
Begin  
  Y:=30;
  For i:=1 to 10 do
  Begin
    CriaLabel[i].Create(Self);
    CriaLabel[i].Caption:=´Rotina nº ´+IntTostr(i);
    CriaLabel.top:=y;
    y:=y+20;
  End;
End;


São criados 10 componentes. Como diferenciar um do outro?

sonec2004@itelefonica.com.br


GOSTEI 0
Emiliano

Emiliano

27/07/2004

Marcelo, Obrigado pela ajuda, mas ainda tenho uma dúvida. Meu código é assim:
Procedure CriaLabel;
Var
CriaLabel : Array[1..10] of TLabel;
i: Integer;
Begin  
  Y:=30;
  For i:=1 to 10 do
  Begin
    CriaLabel[i].Create(Self);
    CriaLabel[i].Caption:=´Rotina nº ´+IntTostr(i);
    CriaLabel.top:=y;
    y:=y+20;
  End;
End;
São criados 10 componentes. Como diferenciar um do outro? sonec2004@itelefonica.com.br



Execute o programa abaixo que vc terá uma ideia de como identificar os Labels, já que é um vetor de labels vc deve identificálos pelo indice do vetor.

procedure TForm1.Button1Click(Sender: TObject);
var
CriaLabel : Array[1..10] of TLabel;
i,Y: Integer;
Begin
Y:=30;
For i:=1 to 10 do
Begin
CriaLabel[i] := TLabel.Create(Self);
CriaLabel[i].Parent := Self;
CriaLabel[i].OnClick := ClicaLabel;
CriaLabel[i].Caption:=´Rotina nº ´+IntTostr(i);
CriaLabel[i].top:=y;
y:=y+20;
End;

CriaLabel[1].Caption := CriaLabel[1].Caption + ´ -> Este é o label de indice 1´;
CriaLabel[10].Caption := CriaLabel[10].Caption + ´ -> Este é o label de indice 10´;


end;

procedure TForm1.ClicaLabel(Sender: TObject);
begin
ShowMessage(´Cliquei no Label com a ´ + (Sender as TLabel).Caption );
end;

Coloque este código em um formulário com um Button e crie a procedure ClicaLabel.

Espero ter esclarecido.

[]´


GOSTEI 0
Rodc

Rodc

27/07/2004

É simples, basta colocar um nome diferente para cada label. Ex.: Labe01, Labe02, etc...
Ou usar o tag do componente.

For i:=1 to 10 do
Begin
CriaLabel[i].Create(Self);
CriaLabel[i].Caption:=´Rotina nº ´+IntTostr(i);
CriaLabel.top:=y;
CriaLabel.Name := ´Label´ + IntToStr(i);
CriaLabel.Tag := i;
y:=y+20;
End


GOSTEI 0
Paulo_amorim

Paulo_amorim

27/07/2004

Olá

Para diferenciar componentes existe a propriedade Name... :wink:

Mas mesmo assim dependendo do código do seu LabelClick não seria necessário...

Até+


GOSTEI 0
Eniorm

Eniorm

27/07/2004

Eu criei um form em tempo de execução e funcionou beleza,
mas não consegui associar o evento OnClose do form principal
ao form q foi criado em tempo. Usei:
with TForm.Create(Self) do begin
   OnClose := FormClose;
   ShowModal;
end;


Mas não deu certo....


GOSTEI 0
Sonec2004

Sonec2004

27/07/2004

:D Brigadão, colegas. Agora tá blz.
Usei o código do Emiliano e identifiquei os labels pelos tags.

sonec2004@itelefonica.com.br


GOSTEI 0
POSTAR