Unit1.pas是一个类unit Unit1;
interface
uses Dialogs;
type
  TCompany=class(TObject)
  private
    CompanyName: string;
    CompanyManager: string;
  public
    procedure showCompanyName();
    procedure setCompanyName(newCompanyName: string);
    property proCompanyName: string read CompanyName write setCompanyName;
    constructor ConCompany;
    destructor  DesCompany;
  end;
var
  Company:TCompany;
implementation
constructor TCompany.ConCompany();
begin
  CompanyName:='sdf';
  showmessage('TCompnay has been constructed');
end;
destructor TCompany.DesCompany;
begin
  showmessage('TCompany has been destoried');
end;
procedure TCompany.showCompanyName();
begin
  showmessage(CompanyName);
end;
procedure TCompany.setCompanyName(newCompanyName: string);
begin
  CompanyName:=newCompanyName;
end;
end.Unit2.pas中我调用该类
...
implementation
uses Unit1;
procedure TForm1.Button2Click(Sender: TObject);
var
  a: TCompany;
begin
  a.Create;
  a.showCompanyName;
  a.Free;
end;为什么这里显示出来的COMPANYNAME会是???E???这样的乱码呢?谢谢!

解决方案 »

  1.   

    你要用自己的构造函数:
    var
      a: TCompany;
    begin
      a.ConCompany;
      a.showCompanyName;
      a.DesCompany;
    end;
      

  2.   

    procedure TForm1.Button2Click(Sender: TObject);
    var
      a: TCompany;
    begin
      a.Create;
      a.Constructor;//这句加上就好了,但是有地址错好像,不知又是什么?
      a.showCompanyName;
      a.Free;
    end;我估计可能a.Create();时COMPANYNAME并没有赋值,所以错的,但是我已经有个购造函数了,为什么这个函数在a.Create();时不会执行呢?但如上,加了一句就能显示了。请高手指点谢谢!
      

  3.   

    请问blazingfire(烈焰),a.create();与构造函数有何区别?CREATE不是可以建立该类吗?但它不会自动执行构造函数吗?那构造函数与一般的函数有何区别呢?
      

  4.   

    不能a.create,要用a := TCompany.Create;
    要先实列化一下,就不会出现地址错误了
      

  5.   

    请问 arrong(真的汉子) ,
    var
      a: TCompany;与您说的a := TCompany.Create;有何区别?谢谢!
    是不是
    var
      a: TCompany;
    只是申明,没在内存中创建?
      

  6.   

    yun,这么多人不知道。var
      a: TCompany;
    begin
      a.Create;
      a.showCompanyName;
      a.Free;
    /////////////////////////
    你这种写法我在delphi第一次见a = TCompany.Create();
    a.showCompanyName();
    a.Free();
      

  7.   

    Unit1.pas是一个类unit Unit1;
    interface
    uses Dialogs;
    type
      TCompany=class(TObject)
      private
        CompanyName: string;
        CompanyManager: string;
      public
        procedure showCompanyName();
        procedure setCompanyName(newCompanyName: string);
        property proCompanyName: string read CompanyName write setCompanyName;
        constructor Create(aowner:Tcomponent);override;
        destructor  Destroy;override;
      end;
    var
      Company:TCompany;
    implementation
    constructor TCompany.Create(aowner:Tcomponent)
    begin
      inherited Create(aowner);
      CompanyName:='sdf';
      showmessage('TCompnay has been constructed');
    end;
    destructor TCompany.Desstroy;
    begin
      inherited destroy;
      showmessage('TCompany has been destoried');
    end;
    procedure TCompany.showCompanyName();
    begin
      showmessage(CompanyName);
    end;
    procedure TCompany.setCompanyName(newCompanyName: string);
    begin
      CompanyName:=newCompanyName;
    end;
    end.Unit2.pas中我调用该类
    ...
    implementation
    uses Unit1;
    procedure TForm1.Button2Click(Sender: TObject);
    var
      a: TCompany;
    begin
      a.Create;
      a.showCompanyName;
      a.Free;
    end;
    再看看有问题吗?
    你虽然自己可以做构造过程,但要在原来的基础上重载,不然系统可就不会用你的构造过程了!
      

  8.   

    同意 sundytu(晶晶) :inherited
      

  9.   

    sundytu(晶晶),我那个TCOMPANY类是一个基类,怎么能用OVERRIDE?你的方法在编译时有错在基类中找不到CONCOMPANY。
      

  10.   

    Unit1.pas是一个类unit Unit1;
    interface
    uses Dialogs;
    type
      TCompany=class(TObject)
      private
        CompanyName: string;
        CompanyManager: string;
      public
        procedure showCompanyName();
        procedure setCompanyName(newCompanyName: string);
        property proCompanyName: string read CompanyName write setCompanyName;
        constructor Create(aowner:Tcomponent);override;
        destructor  Destroy;override;
      end;
    var
      Company:TCompany;
    implementation
    constructor TCompany.Create(aowner:Tcomponent)
    begin
      inherited Create(aowner);
      CompanyName:='sdf';
      showmessage('TCompnay has been constructed');
    end;
    destructor TCompany.Desstroy;
    begin
      inherited destroy;
      showmessage('TCompany has been destoried');
    end;
    procedure TCompany.showCompanyName();
    begin
      showmessage(CompanyName);
    end;
    procedure TCompany.setCompanyName(newCompanyName: string);
    begin
      CompanyName:=newCompanyName;
    end;
    end.Unit2.pas中我调用该类
    ...
    implementation
    uses Unit1;
    procedure TForm1.Button2Click(Sender: TObject);
    var
      a: TCompany;
    begin
      a := TCompany.Create;
      a.showCompanyName;
      a.Free;
    end;
      

  11.   

    constructor TCompany.Create(aowner:Tcomponent)  //构造函数一般用CREATE
    begin
      inherited Create(aowner);
      CompanyName:='sdf';
      showmessage('TCompnay has been constructed');
    end;
    destructor TCompany.Destroy;  //析构函数一般用Destroy
    begin
      inherited destroy;
      showmessage('TCompany has been destoried');
    end;
      

  12.   

    哦!居然没有认真看代码,对不起啊。呵呵
    下面这个你看看有用波?
    Unit1.pas是一个类unit Unit1;
    interface
    uses Dialogs;
    type
      TCompany=class(TObject)
      private
        CompanyName: string;
        CompanyManager: string;
      public
        procedure showCompanyName();
        procedure setCompanyName(newCompanyName: string);
        property proCompanyName: string read CompanyName write setCompanyName;
        constructor ConCompany;
        destructor  DesCompany;
      end;
    var
      Company:TCompany;
    implementation
    constructor TCompany.ConCompany;
    begin
      CompanyName:='sdf';
      showmessage('TCompnay has been constructed');
    end;
    destructor TCompany.DesCompany;
    begin
      showmessage('TCompany has been destoried');
    end;
    procedure TCompany.showCompanyName();
    begin
      showmessage(CompanyName);
    end;
    procedure TCompany.setCompanyName(newCompanyName: string);
    begin
      CompanyName:=newCompanyName;
    end;
    end.Unit2.pas中我调用该类
    ...
    implementation
    uses Unit1;
    procedure TForm1.Button2Click(Sender: TObject);
    var
      a: TCompany;
    begin
      a:=TCompany.ConCompany;
      a.showCompanyName;
      a.Free;
    end;你自己的构造过程你自己并没有调用,你调用的是Create,所以就没有用(它只负责分配内存等等,没有完成你要的初始化),你在这里显式调用你自己的构造过程ConCompany进行初始化!
    顺便问问,做这个干什么用??
    是用来理解OOP思想吗?
      

  13.   

    哈哈,还有人不看清代码就在发表意见。人家的类直接继承至TObject类哟,那么底层,哪里有aowner:Tcomponent这个参数存在,它那时还不知道Tcomponent是什么呢???
    TObject类的Create方法不是虚拟方法,不可以Override,只可以重载,由不同参数(如Create(s:pointer))或是自己来重新建立自己的构造程序,然后你可以将它设为Virtual以后的子类或是孙类就可以Override了!