Fórum Posso criar em evento onClick em tempo de execução para um TLabel #517596

23/04/2015

0

Posso criar em evento onClick em tempo de execução, para um TLabel também criado em tempo de execução? meu programa criar uma serie de TLabels em tempo de execução, posso referencia-los todos a um mesmo OnClick, sem precisar fazer o mesmo para cada um deles?
Novice Php

Novice Php

Responder

Post mais votado

24/04/2015

Pode.

// Procedure:
procedure SeuForm.Label1Click(Sender: TObject);
begin
  ShowMessage(TLabel(Sender).Caption);
end;

// Atribuição
  Label1.OnClick := SeuForm.Label1Click;

Renato Rubinho

Renato Rubinho
Responder

Gostei + 2

Mais Posts

24/04/2015

Rodrigo Martins

Explique melhor , mas acredito que possa sim
Responder

Gostei + 0

25/04/2015

Novice Php

Estou tentando adicionar ao evento onClick de alguns TLabel's criados em execução num TPanel, um procedure SomatorioClick!
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?
Responder

Gostei + 0

27/04/2015

Novice Php

também adicionei um onMouseMove, apresenta o mesmo erro..
Responder

Gostei + 0

28/04/2015

Renato Rubinho

Não entendo porque ocorre o erro.
Tenta apontar a procedure indicando o Form.

(pnlTriangulo.Components[ind] as TLabel).onClick := frm01.SomatorioClick;
Responder

Gostei + 0

28/04/2015

Novice Php

Já tentei indicando o Form, ocorre o mesmo erro! Também tentei adicionar junto com a criação dos TLabels, também ocorreu o mesmo erro!
Responder

Gostei + 0

28/04/2015

Renato Rubinho

Posta sua procedure completa de criação do Label.
Pode estar criando como outra classe porque seu processo está correto.
Responder

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;
Responder

Gostei + 0

28/04/2015

Novice Php

TLabels criados em um TPanel (pnlTriangulo)
Responder

Gostei + 0

28/04/2015

Renato Rubinho

Cara,

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.
Responder

Gostei + 0

28/04/2015

Novice Php

cf eh uma função que retornava uma combinação dos elementos (x,y), entao so pode ser do meu Lazarus então ou do Windows, fiz o seu teste, e apresentou o mesmo erro do meu programa


[img]http://arquivo.devmedia.com.br/forum/imagem/424404-20150428-153130.jpg[/img]
Responder

Gostei + 0

28/04/2015

Renato Rubinho

Tá com cara de bug mesmo.
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;
Responder

Gostei + 0

28/04/2015

Novice Php

Infelizmente a mesma coisa, apresentou o mesmo erro
Responder

Gostei + 0

28/04/2015

Renato Rubinho

Uma luz no fim do tunel. Não programo no lazarus.
Pesquisei na internet o erro e acho que é isso

Tenta com @:

 onClick:=@SomarClick;
Responder

Gostei + 0

28/04/2015

Novice Php

Eh porque estou começando agora, e a faculdade ensina e pede que as atividades sejam feitas no Lazarus.

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!
Responder

Gostei + 0

29/04/2015

Renato Rubinho

Acho que seria o Timer mesmo para você fazer o que precisa.

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
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar