Search code examples
delphicircular-dependencydelphi-units

Access main form from child unit in Delphi


I want to access a main form variable from a class that is called from the main from. Something like this:

Unit1:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,Unit2, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
  public
  end;
var
  Form1: TForm1;
  Chiled:TChiled;
const
 Variable = 'dsadas';
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Chiled.ShowMainFormVariable;
end;

end.

Unit2:

unit Unit2;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

  type
  TChiled = class
  private
  public
    procedure ShowMainFormVariable;
  end;
var
  Form1: TForm1;
implementation

procedure TChiled.ShowMainFormVariable;
begin
  ShowMessage(Form1.Variable);
end;
end.

if in Unit2 i add to uses Unit1 an circular errors pops up.

How to make the Unit1 to be GLOBAL?


Solution

  • As other answers tell, you should use one of the units in implementation section.

    Suppose you chose in 'unit2' you'd use 'unit1' in implementation. then you need to devise a mechanism to tell the 'TChiled' how to access 'Form1'. That's because since you haven't used 'unit1' in interface section of 'unit2', you cannot declare the 'Form1:TForm1' variable in interface section. Below is just one possible solution:

    unit2
    
    type
      TChiled = class
      private
        FForm1: TForm;
      public
        procedure ShowMainFormVariable;
        property Form1: TForm write FForm1;
      end;
    
    implementation
    
    uses
      unit1;
    
    procedure TChild.ShowMainFormVariable;
    begin
      ShowMessage((FForm1 as TForm1).Variable);
    end;
    

    then in unit1 you can set the Form1 property of TChiled before calling TChiled's method:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Chiled.Form1 := Self;
      Chiled.ShowMainFormVariable;
    end;