Nie mogę dynamicznie przypisać zdarzenia

Nie mogę dynamicznie przypisać zdarzenia
JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5046
0

Mam procedurę:

Kopiuj
procedure InfoLabelClicked(Sender: TObject);

Tworzę sobie teraz labela:

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

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

Kopiuj
  Info.OnClick:=InfoLabelClicked;  

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

O co mu chodzi?

Pawel200x.5
  • Rejestracja: dni
  • Ostatnio: dni
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.

Odysseus
  • Rejestracja: dni
  • Ostatnio: dni
0
Juhas napisał(a)

Mam procedurę:

Kopiuj
procedure InfoLabelClicked(Sender: TObject);

Tworzę sobie teraz labela:

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

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

Kopiuj
  Info.OnClick:=InfoLabelClicked;  

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

O co mu chodzi?

Na pierwszy rzut oka zamieniłbym

Kopiuj
Info.OnClick:=InfoLabelClicked;

na:

Kopiuj
Info.OnClick:=Info.InfoLabelClicked;
JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5046
0
Odysseus napisał(a)
Juhas napisał(a)

Mam procedurę:

Kopiuj
procedure InfoLabelClicked(Sender: TObject);

Tworzę sobie teraz labela:

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

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

Kopiuj
  Info.OnClick:=InfoLabelClicked;  

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

O co mu chodzi?

Na pierwszy rzut oka zamieniłbym

Kopiuj
Info.OnClick:=InfoLabelClicked;

na:

Kopiuj
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 ;)

Odysseus
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
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.
Kopiuj
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.

JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5046
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.

Odysseus
  • Rejestracja: dni
  • Ostatnio: dni
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.

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.