Denes
Denes

Reputation: 47

Creating a Delphi Object in a Form

I have a Delphi Form with no component in it. Then, I create a unit with several classes. I've been trying to Instantiate the class and create an object in the form, but it's complaining that the class is undeclared. here is the error message: 'E2003 Undeclared Identifier:TUser'.

Here is the project:

program Testing;

uses
  Forms,
  Home in 'Home.pas' {Form1},
  uUser in 'uUser.pas';

{$R *.res}

begin
  ReportMemoryLeaksOnShutdown := DebugHook <> 0;
  Application.Initialize;
  Application.Run;
end.

Here is my Empty Form:

unit Home;

interface

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

type
  TForm1 = class(TForm)
  private
    { Private declarations }
protected

  public
    { Public declarations }
   u : TUser; //It's complaining about TUser. I can right click on 
   TUser, and it will take me to the class declaration. 

  end;
var
  Form1: TForm1;

implementation
{$R *.dfm}

end.

Here is the Class that I created:

unit uUser;

interface

uses
  classes,SysUtils,Dialogs;

implementation

type
TAddress = class
private
 FStreetAddress : string;
 FCity          : string ;
 FState         : string;
 FZipCode       : string;

 procedure setStreetAddress(const Value : string);
 procedure setCity(const Value : string);
 procedure setState(const Value : string);
 procedure setZipCode(const Value : string);

 protected

 public
 property StreetAddress : string read FStreetAddress write setStreetAddress;
 property City : string read FCity write setCity;
 property State : string read FState write setState;
 property ZipCode : string read FZipCode write setZipCode;


end;

type
  TPermanentAdddress = class (TAddress)
  private
  FStartDate     : string;
  FEndDate       : string;

  procedure setStartDate(const Value : string);
  procedure setEndDate(const Value : string);

  protected

  public

  property StartDate : string read FStartDate write setStartDate;
  property EndDate   : string read FEndDate write setEndDate ;
  end;


type
TUser = class(TComponent)
  private
  FFirstName : string;
  FAddress : TPermanentAdddress;
  procedure setFirstName(const Value : string);
  procedure setAddress(const Value : TPermanentAdddress);

  protected

  public
  constructor Create(); reintroduce; overload;
  destructor Destroy();  override;
   property FirstName : string read FFirstName write setFirstName;
   property Address : TPermanentAdddress read FAddress write setAddress;

end;

procedure TAddress.setStreetAddress(const Value : string);
begin
  FStreetAddress := value;
end;

 procedure TAddress.setCity(const Value : string);
 begin
   FCity := Value;
 end;
 procedure TAddress.setState(const Value : string);
 begin
   FState := Value;
 end;
 procedure TAddress.setZipCode(const Value : string);
 begin
   FZipCode := Value;
 end;

 //Permanent Address
  procedure TPermanentAdddress.setStartDate(const Value : string);
  begin
    FStartDate := value;
  end;
  procedure TPermanentAdddress.setEndDate(const Value : string);
  begin
    FEndDate := Value;
  end;

  //tvxpatient
  procedure TUser.setFirstName(const Value : string);
  begin
    FFirstName := Value;
  end;
  procedure TUser.setAddress(const Value : TPermanentAdddress);
  begin
    FAddress := Value;
  end;

  constructor TUser.Create();
  begin
   FAddress := TPermanentAdddress.Create;
  end;

  destructor TUser.Destroy();
  begin
  //FAddress.Free;
  end;

end.

Upvotes: 3

Views: 2471

Answers (1)

Ken White
Ken White

Reputation: 125757

All of your classes are in the implementation section, meaning they're not visible outside the unit itself. Move them to the interface section.

unit uUser;

interface

uses
  classes,SysUtils,Dialogs;

interface

type
  TAddress = class
  private
    FStreetAddress : string;
    FCity          : string ;
    FState         : string;
    FZipCode       : string;

    procedure setStreetAddress(const Value : string);
    procedure setCity(const Value : string);
    procedure setState(const Value : string);
    procedure setZipCode(const Value : string);
  protected
  public
    property StreetAddress : string read FStreetAddress write setStreetAddress;
    property City : string read FCity write setCity;
    property State : string read FState write setState;
    property ZipCode : string read FZipCode write setZipCode;
  end;

type
  TPermanentAdddress = class (TAddress)
  private
    FStartDate     : string;
    FEndDate       : string;
    procedure setStartDate(const Value : string);
    procedure setEndDate(const Value : string);
  protected
  public
    property StartDate : string read FStartDate write setStartDate;
    property EndDate   : string read FEndDate write setEndDate ;
  end;

type
  TUser = class(TComponent)
  private
    FFirstName : string;
    FAddress : TPermanentAdddress;
    procedure setFirstName(const Value : string);
    procedure setAddress(const Value : TPermanentAdddress);
  protected
  public
    constructor Create(); reintroduce; overload;
    destructor Destroy();  override;
    property FirstName : string read FFirstName write setFirstName;
    property Address : TPermanentAdddress read FAddress write setAddress;
end;

implementation

procedure TAddress.setStreetAddress(const Value : string);
begin
  FStreetAddress := value;
end;

 procedure TAddress.setCity(const Value : string);
 begin
   FCity := Value;
 end;
 procedure TAddress.setState(const Value : string);
 begin
   FState := Value;
 end;
 procedure TAddress.setZipCode(const Value : string);
 begin
   FZipCode := Value;
 end;

 //Permanent Address
  procedure TPermanentAdddress.setStartDate(const Value : string);
  begin
    FStartDate := value;
  end;
  procedure TPermanentAdddress.setEndDate(const Value : string);
  begin
    FEndDate := Value;
  end;

  //tvxpatient
  procedure TUser.setFirstName(const Value : string);
  begin
    FFirstName := Value;
  end;
  procedure TUser.setAddress(const Value : TPermanentAdddress);
  begin
    FAddress := Value;
  end;

  constructor TUser.Create();
  begin
   FAddress := TPermanentAdddress.Create;
  end;

  destructor TUser.Destroy();
  begin
  //FAddress.Free;
  end;

end.

Also, as a note: the only reason to descend from TComponent is to create components that will appear on the Component Palette (which means they need a Register procedure). If you're not designing components that will be dropped on a form at design-time, they don't need the overhead of TComponent as a ancestor - they can simply descend from TObject instead, which would appear to be the case for your TUser class.

Upvotes: 10

Related Questions