Mi a hiba? Delphiben futásidőben létrehozott gombhalmaz Onclick eseményére a következő hibát adja: [Error] szinkip. Pas (723) : Incompatible types: method pointer and regular procedure
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
ButtonArray : array[1..10] of TButton;
public
procedure ButtonClick(Sender: TObject);
end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ButtonClick(Sender: TObject);
begin
ShowMessage('Rendben !');
end;
procedure TForm1.FormCreate(Sender: TObject);
var i : Integer;
begin
for i := 1 to 10 do
begin
ButtonArray[i] := TButton.Create(self);
with ButtonArray[i] do
begin
Left := 10;
Top := i * 25;
Height := 22;
Caption := 'Gomb ' + IntTostr(i);
Parent := Form1;
onClick := ButtonClick;
end;
end;
end;
end.
Ez a létrehozás:
for a:=1 to 9 do
begin {9 törlő gomb generálása}
torlogomb[a]:=TBitbtn.Create(self);
with torlogomb[a] do
begin {közös tulajdonságok}
Parent:=Form1;
width:=26;Height:=28;
Left:=250;Top:=a*30-25;
Font.Color:=ClRed;
Font.Style:=[];
caption:='X';
ShowHint:=True;
Hint:=IntToStr(a)+'. cél törlése';
SendToBack;
tag:=a;
onclick:=celtorles;
end;
end;
A procedure még üres:
procedure celtorles(Sender: TObject);
begin
end;
Mindig így csinálom, rengeteg más programom van, abban is ugyanígy van, ott műxik, itt nem. Felrobbantom.
Az onClick az TNotifyEvent ami:
type TNotifyEvent = procedure(Sender: TObject) of object;
tehát nem lehet 'mezei' eljárás. Ezért kell berakni a TForm1 osztályba, mint ahogy én is tettem a példában.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
public
torlogomb : array[1..9] of TBitBtn;
procedure celtorles(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.celtorles(Sender: TObject);
begin
ShowMessage('Rendben');
end;
procedure TForm1.FormCreate(Sender: TObject);
var a : Integer;
begin
for a := 1 to 9 do
begin {9 törlő gomb generálása}
torlogomb[a] := TBitbtn.Create(self);
with torlogomb[a] do
begin {közös tulajdonságok}
Parent := Form1;
Width := 26;
Height := 28;
Left := 250;
Top := a * 30 - 25;
Font.Color := clRed;
Font.Style := [];
Caption := 'X';
ShowHint := True;
Hint := IntToStr(a) + '. cél törlése';
SendToBack;
Tag := a;
onClick := celtorles;
end;
end;
end;
end.
Betettem. Erre ezt adja:
[Error] szinkip.pas(92): Unsatisfied forward or external declaration: 'TForm1.celtorles'
A hiba borzalmasan egyszerű volt. Ha egy osztályon belül deklarálunk egy eljárást elég az eljárás nevét, paramétereit megadni, de a megvalósításkor már a teljes elérhetőségét.
private
...
procedure celtorles(Sender: TObject);
...
implementation
...
procedure TForm1.celtorles(Sender: TObject);
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!