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???这样的乱码呢?谢谢!
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???这样的乱码呢?谢谢!
var
a: TCompany;
begin
a.ConCompany;
a.showCompanyName;
a.DesCompany;
end;
var
a: TCompany;
begin
a.Create;
a.Constructor;//这句加上就好了,但是有地址错好像,不知又是什么?
a.showCompanyName;
a.Free;
end;我估计可能a.Create();时COMPANYNAME并没有赋值,所以错的,但是我已经有个购造函数了,为什么这个函数在a.Create();时不会执行呢?但如上,加了一句就能显示了。请高手指点谢谢!
要先实列化一下,就不会出现地址错误了
var
a: TCompany;与您说的a := TCompany.Create;有何区别?谢谢!
是不是
var
a: TCompany;
只是申明,没在内存中创建?
a: TCompany;
begin
a.Create;
a.showCompanyName;
a.Free;
/////////////////////////
你这种写法我在delphi第一次见a = TCompany.Create();
a.showCompanyName();
a.Free();
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;
再看看有问题吗?
你虽然自己可以做构造过程,但要在原来的基础上重载,不然系统可就不会用你的构造过程了!
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;
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;
下面这个你看看有用波?
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思想吗?
TObject类的Create方法不是虚拟方法,不可以Override,只可以重载,由不同参数(如Create(s:pointer))或是自己来重新建立自己的构造程序,然后你可以将它设为Virtual以后的子类或是孙类就可以Override了!