Manipular componentes criados em tempo de execução
:? 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
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
Curtidas 0
Respostas
Marcelo Saviski
27/07/2004
crie a procedure(que tenha os mesmos parametros do evento) que vai executar algo quando foi clicado, por exemplo:
e quando criar o componente:
ok?
procedure LabelClick(Sender: TObject); begin //faz algo aqui end;
e quando criar o componente:
LabelCriado.OnClick := LabelClick;
ok?
GOSTEI 0
Sonec2004
27/07/2004
Marcelo,
Obrigado pela ajuda, mas ainda tenho uma dúvida. Meu código é assim:
São criados 10 componentes. Como diferenciar um do outro?
sonec2004@itelefonica.com.br
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
27/07/2004
Marcelo,
Obrigado pela ajuda, mas ainda tenho uma dúvida. Meu código é assim:
São criados 10 componentes. Como diferenciar um do outro?
sonec2004@itelefonica.com.br
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;
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
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
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
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é+
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
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:
Mas não deu certo....
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
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
Usei o código do Emiliano e identifiquei os labels pelos tags.
sonec2004@itelefonica.com.br
GOSTEI 0