Fórum Posso criar em evento onClick em tempo de execução para um TLabel #517596
23/04/2015
0
Novice Php
Curtir tópico
+ 0Post mais votado
24/04/2015
// Procedure: procedure SeuForm.Label1Click(Sender: TObject); begin ShowMessage(TLabel(Sender).Caption); end; // Atribuição Label1.OnClick := SeuForm.Label1Click;
Renato Rubinho
Gostei + 2
Mais Posts
24/04/2015
Rodrigo Martins
Gostei + 0
25/04/2015
Novice Php
Uses ........ Type ......... procedure Alterar(Sender: TObject); procedure SomatorioClick(Sender: TObject);
procedure Tfrm01.SomatorioClick(Sender: TObject); var aux,linha,coluna:integer; begin linha:=StrToInt(copy(TLabel(Sender).Name,4,1)); coluna:=StrToInt(copy(TLabel(Sender).Name,5,1)); aux:=StrToInt(TLabel(Sender).Caption);
procedure Tfrm01.Alterar(Sender: TObject);
var
ind:integer;
begin
for ind:=pnlTriangulo.ComponentCount-1 downto 0 do
begin
if (pnlTriangulo.Components[ind] is TLabel) then
(pnlTriangulo.Components[ind] as TLabel).onClick:=SomatorioClick;
end;
end;
da erro no: ... onClick:=SomatorioClick; "numero errado de parametros especificados", onde estou errando?
Gostei + 0
27/04/2015
Novice Php
Gostei + 0
28/04/2015
Renato Rubinho
Tenta apontar a procedure indicando o Form.
(pnlTriangulo.Components[ind] as TLabel).onClick := frm01.SomatorioClick;
Gostei + 0
28/04/2015
Novice Php
Gostei + 0
28/04/2015
Renato Rubinho
Pode estar criando como outra classe porque seu processo está correto.
Gostei + 0
28/04/2015
Novice Php
procedure Tfrm01.Resultado(nTopIn,nLeftIn,nInicial,nFinal:integer);
var
leftIn:integer;
topIn:integer;
esp_h:integer=20;
esp_v:integer=25;
inicial,final,x,y:integer;
nomelbl:string;
rotulo:TLabel;
begin
inicial:=nInicial;
final :=nFinal;
leftIn:=nLeftIn;
topIn:=nTopIn;
for x:=inicial to final do
begin
leftIn:=leftIn + (((final + 1) - x) * esp_h) ;
for y:=0 to x do
begin
nomelbl:='lbl'+Trim(IntToStr(x))+Trim(IntToStr(y));
rotulo:=TLabel.Create(Self);
With rotulo do
begin
Parent:=pnlTriangulo;
Left:=leftIn;
Top:=topIn;
Name:=nomelbl;
onClick:=SomarClick;
onMouseMove:=AlterarCorMouseMove;
Caption:=nomelbl;
leftIn:=leftIn + (2 * esp_h);
if (y = 0) or (y = x) then
begin
text:='1';
end
else
begin
text:=FloatToStr(Cf(x,y));
end;
end;
end;
leftIn:=nLeftIn;
topIn:=topIn + esp_v;
end;
end;
Gostei + 0
28/04/2015
Novice Php
Gostei + 0
28/04/2015
Renato Rubinho
Fiz um teste rápido e funcionou normalmente.
- Form1
- onShow chama a procedure Resultado()
- na procedure do label mostro o nome do componente clicado
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
pnlTriangulo: TPanel;
procedure SomarClick(Sender: TObject);
procedure Resultado(nTopIn,nLeftIn,nInicial,nFinal:integer);
procedure AlterarCorMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Resultado(nTopIn, nLeftIn, nInicial, nFinal: integer);
var
leftIn:integer;
topIn:integer;
esp_h:integer;
esp_v:integer;
inicial,final,x,y:integer;
nomelbl:string;
rotulo:TLabel;
begin
esp_h:=20;
esp_v:=25;
inicial:=nInicial;
final :=nFinal;
leftIn:=nLeftIn;
topIn:=nTopIn;
for x:=inicial to final do
begin
leftIn:=leftIn + (((final + 1) - x) * esp_h) ;
for y:=0 to x do
begin
nomelbl:='lbl'+Trim(IntToStr(x))+Trim(IntToStr(y));
rotulo:=TLabel.Create(Self);
With rotulo do
begin
Parent:=pnlTriangulo;
Left:=leftIn;
Top:=topIn;
Name:=nomelbl;
onClick:=SomarClick;
onMouseMove:=AlterarCorMouseMove;
Caption:=nomelbl;
leftIn:=leftIn + (2 * esp_h);
if (y = 0) or (y = x) then
begin
text:='1';
end
else
begin
text:='2'; // alterado, dava erro no "cf" text:=FloatToStr(Cf(x,y));
end;
end;
end;
leftIn:=nLeftIn;
topIn:=topIn + esp_v;
end;
end;
procedure TForm1.SomarClick(Sender: TObject);
begin
ShowMessage(TLabel(Sender).Caption);
end;
procedure TForm1.AlterarCorMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
// nao implementado
end;
procedure TForm1.FormShow(Sender: TObject);
begin
Resultado(1,1,1,1);
end;
end.
Gostei + 0
28/04/2015
Novice Php
[img]http://arquivo.devmedia.com.br/forum/imagem/424404-20150428-153130.jpg[/img]
Gostei + 0
28/04/2015
Renato Rubinho
Então, por desencargo, vamos tentar algo que não deveria dar problema, maaaas:
1. Declara a procedure SomarClick dentro de public
2. Na atribuição da procedure ao Label, faz sem o "with"
//1.
procedure Resultado(nTopIn,nLeftIn,nInicial,nFinal:integer);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure SomarClick(Sender: TObject);
procedure AlterarCorMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
end;
//2. rotulo.onClick:=SomarClick;
Gostei + 0
28/04/2015
Novice Php
Gostei + 0
28/04/2015
Renato Rubinho
Pesquisei na internet o erro e acho que é isso
Tenta com @:
onClick:=@SomarClick;
Gostei + 0
28/04/2015
Novice Php
Cara eh isso mesmo, muito obrigado, quebrou um galhão!
Não querendo aproveitar da sua boa vontade, mais agora tenho que fazer uma animação nesses TLabels, tipo esses Tlabels serem criados numa velocidade em que o usuario consiga acompanhar a formação deles, também mudar de cor e caption por um instante (2seg, por exemplo) e depois voltar ao original, eu consigo implementar isso nesse codigo, ou sera que preciso de uma procedure independente para fazer isso, e quais componentes eu poderia usar para fazer isso, o professor da como exemplo de uso o TTimer, mais nao consigo imaginar um jeito de utiliza-lo, desde já agradeço, e retorno a agradecer pela resposta anterior e pela atenção prestada!
Gostei + 0
29/04/2015
Renato Rubinho
No componente você estipula o intervalo em milisegundos que ele irá processar (1000 seria 1seg, por exemplo).
Quando atingir este tempo, ele executa o evento onTimer.
Exemplo:
Timer
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)