Nie mogę dynamicznie przypisać zdarzenia

0

Mam procedurę:

procedure InfoLabelClicked(Sender: TObject);

Tworzę sobie teraz labela:

  Info:=TLabel.Create(Application);
  Info.Parent:=mainForm.box;

I próbuję mu przypisać zdarzenie na kliknięcie:

  Info.OnClick:=InfoLabelClicked;  

I wyskakuje komunikat, że: "Incompatible types: 'method pointer and regular procedure'"

O co mu chodzi?

0

Zdarzenie nie może być zwykłą procedurą, musi być metotą jakiejkolwiek klasy.
Czyli np. zadeklaruj tą procedurę jako metodę klasy Twojej głównej formy.

0
Juhas napisał(a)

Mam procedurę:

procedure InfoLabelClicked(Sender: TObject);

Tworzę sobie teraz labela:

  Info:=TLabel.Create(Application);
  Info.Parent:=mainForm.box;

I próbuję mu przypisać zdarzenie na kliknięcie:

  Info.OnClick:=InfoLabelClicked;  

I wyskakuje komunikat, że: "Incompatible types: 'method pointer and regular procedure'"

O co mu chodzi?

Na pierwszy rzut oka zamieniłbym

Info.OnClick:=InfoLabelClicked;

na:

Info.OnClick:=Info.InfoLabelClicked;
0
Odysseus napisał(a)
Juhas napisał(a)

Mam procedurę:

procedure InfoLabelClicked(Sender: TObject);

Tworzę sobie teraz labela:

  Info:=TLabel.Create(Application);
  Info.Parent:=mainForm.box;

I próbuję mu przypisać zdarzenie na kliknięcie:

  Info.OnClick:=InfoLabelClicked;  

I wyskakuje komunikat, że: "Incompatible types: 'method pointer and regular procedure'"

O co mu chodzi?

Na pierwszy rzut oka zamieniłbym

Info.OnClick:=InfoLabelClicked;

na:

Info.OnClick:=Info.InfoLabelClicked;

Nie kombinuj. Koleja wyżej miał rację.
A poza tym, jeśli znajdziesz mi w klasie TLabel procedurę o nazwie: InfoLabelClicked, to zgłoszę Cię do nagrody Nobla ;)

0
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

var
  Etykieta:TEtykieta;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Etykieta:=TEtykieta.Create(Form1);
  Etykieta.Left:=250;
  Etykieta.Top:=250;
  Etykieta.OnClick:=Etykieta.KlikniecieEtykiety;
  Form1.InsertControl(Etykieta);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Etykieta.Free;
end;

end.
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TEtykieta=class(TLabel)
  public
    procedure KlikniecieEtykiety(Sender:TObject);
    constructor Create(AOwner:TComponent);override;
    destructor Destroy;override;
  end;

implementation

constructor TEtykieta.Create(AOwner:TComponent);
begin
  inherited Create(AOwner);
  Caption:='Kliknij tu';
end;

destructor TEtykieta.Destroy;
begin
  inherited Destroy;
end;

procedure TEtykieta.KlikniecieEtykiety(Sender:TObject);
begin
  Caption:='Kliknięcie obslużone';
end;

end.

I wszystko śmiga. Nazwa nie ma tu nic do rzeczy.

0

I wszystko śmiga. Nazwa nie ma tu nic do rzeczy.

Nazwa nie, ale klasa tak.
To nie jest TLabel, ale klasa dziedzicząca po TLabel.
A ja potrzebowałem po prostu zwykły TLabel.

0
Juhas napisał(a)

I wszystko śmiga. Nazwa nie ma tu nic do rzeczy.

Nazwa nie, ale klasa tak.
To nie jest TLabel, ale klasa dziedzicząca po TLabel.
A ja potrzebowałem po prostu zwykły TLabel.

Z tym też nie ma problemu.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure JakastamProcedura(Sender:TObject);
  end;

var
  Form1: TForm1;
  Etykieta:TLabel;

implementation

{$R *.dfm}

procedure TForm1.JakastamProcedura(Sender:TObject);
begin
  Etykieta.Caption:='Kliknąles Etykiete';
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Etykieta.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Etykieta:=TLabel.Create(Form1);
  Etykieta.Left:=100;
  Etykieta.Top:=100;
  Etykieta.Caption:='Kliknij tu';
  Etykieta.OnClick:=Form1.JakastamProcedura;
  Form1.InsertControl(Etykieta);
end;

end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1