You cannot refer to unitX in the interface section of unitY AND at the same time refer to unitY in the interface section of unitX.

The compiler sees unitX needs unitY and so will try to compile unitY first. In unitY it sees unitX is needed and wants to compile unitX first and so on. Hence: circular reference.

If unitX needs unitY and vice versa, at least in one of them the reference to the other unit should be moved to the implementation section.

e.g:

unit unitX;
interface
uses unitY
implementation
var...
begin
end;

unit unitY
interface
...
implementation
uses unitX
var...
begin
end;

John


Kjow wrote:
2010/4/14 Michael Van Canneyt <[email protected]>:
Put unit2 in the implementation uses list of unit1. Then it should work.

Other question:

if I have a similar situation, it is possible to implement?

____________________

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics,
Dialogs, unit3;

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
    x,y: integer;
    tester1: TTest;
  end;

var
  Form1: TForm1;

implementation

uses
  unit2;

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  init(5, 2, Form1);
  ShowMessage('Result: '+IntToStr(tester1.test(x,y,Form1)));
end;

end.
____________________

unit Unit2;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, unit1, unit3;

procedure init(a,b: integer; MainForm: TForm1);

implementation

var
  tester2: TTest;

procedure init(a,b: integer; MainForm: TForm1);
begin
  MainForm.x:=tester2.test(a,b,MainForm);
  MainForm.y:=-tester2.test(-a,-b,MainForm);
end;

end.
____________________

unit Unit3;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, unit1;

Type
 TTest = class
  a: byte;
  b: byte;
  function test(c,d: integer; MainForm: TForm1): integer;
 end;

implementation

function TTest.test(c,d: integer; MainForm: TForm1): integer;
begin
 Result:=c+d+MainForm.x+MainForm.y;
end;

end.
____________________


I changed the 3rd unit, so now it returns:

unit3.pas(8,27) Fatal: Circular unit reference between Unit3 and Unit1

Thanks!
Kjow

--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus



--
John vd Waeter
www.jvdw.nl
www.gps-carpool.net
www.shotinthedark.nl
www.pdaforms.nl
www.dbapocket.nl

[email protected]

--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to