Lazarus / Pascal:动态Toggleboxes的问题

时间:2014-03-26 20:49:10

标签: casting pascal lazarus

我们有两个重要的课程: 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为我的英语;)

1 个答案:

答案 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类字段