0
votes

We have two classes which are important: 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. 

It inherits the class TToggleBox!

So then we have the 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.

So the compiler says that we have an error @: ugui.pas(64,29) Error: Incompatible types: got "<address of procedure(TObject);Register>" expected "<procedure variable type of procedure(TObject) of object;Register> ".

If i change the procedure "toggleboxclick" to TForm1.toggleboxclick i will get a new error: nullpointer-exception (sigserv or something like this) @ "xytoggles[i,j].parent:=form1;". How i can solve this problem.

At last: Sry for my english ;)

1

1 Answers

0
votes

If i change the procedure "toggleboxclick" to TForm1.toggleboxclick

That is the correct way to do it

i will get a new error: nullpointer-exception (sigserv or something like this) @ "xytoggles[i,j].parent:=form1;". How i can solve this problem.

You cannot use object.create. You need to use object := TClass.create. I.e.: In your case:

saal := tsaal.create(10, 10);
xytoggles[i,j] := txyTogglebox.create(i,j,form1);

It is also bad style to have global variables like i,j,saal, xytoggles. Better make i,j local variables; and saal, xytoggles class fields