我们有两个重要的课程: uSitz,uGUI。
unit uSitz;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, stdctrls;
type txyTogglebox=class(TTogglebox)
private
x:integer;
y:integer;
public
constructor create(xi,yi:integer;TheOwner:tobject);
end;
implementation
constructor txytogglebox.create(xi,yi:integer;TheOwner:tobject);
begin
x:=xi;
y:=yi;
end;
end.
它继承了TToggleBox类!
那么我们就有了uGUI:
unit uGUI;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, usaal, usitz, stdctrls;
type
{ TForm1 }
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
i,j:integer;
saal:tsaal;
xytoggles: array of array of txytogglebox;
implementation
{$R *.lfm}
{ TForm1 }
procedure toggleboxclick(Sender:TObject);
begin
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
setlength(xytoggles, 10, 10);
saal.create(10,10);
for i:=0 to 10 do
begin
for j:=0 to 10 do
begin
xytoggles[i,j].create(i,j,form1);
xytoggles[i,j].parent:=form1;
xytoggles[i,j].Visible:=true;
xytoggles[i,j].top:=i*10;
xytoggles[i,j].left:=j*10;
xytoggles[i,j].width:=10;
xytoggles[i,j].height:=10;
xytoggles[i,j].onclick:=@toggleboxclick;
end;
end;
end;
end.
所以编译器说我们有一个错误@:ugui.pas(64,29) Error: Incompatible types: got "<address of procedure(TObject);Register>" expected "<procedure variable type of procedure(TObject) of object;Register>
“。
如果我将“toggleboxclick”程序更改为TForm1.toggleboxclick,我将收到一个新错误:nullpointer-exception(sigserv或类似的东西)@“xytoggles [i,j] .parent:= form1;”。我怎么能解决这个问题。
最后:Sry为我的英语;)
答案 0 :(得分:0)
如果我改变了程序&#34; toggleboxclick&#34;到TForm1.toggleboxclick
这是正确的方法
我将收到一个新错误:nullpointer-exception(sigserv或类似的东西)@&#34; xytoggles [i,j] .parent:= form1;&#34;。我怎么能解决这个问题。
您不能使用object.create。您需要使用object:= TClass.create。即:在你的情况下:
saal := tsaal.create(10, 10);
xytoggles[i,j] := txyTogglebox.create(i,j,form1);
拥有像i,j,saal,xytoggles这样的全局变量也是一种糟糕的风格。更好地制作i,j局部变量;和saal,xytoggles类字段