delphi自己做了一个类,然后constructor Create;怎么来调用这个函数

如题所述

第1个回答  2013-03-18
在自己类里面调用函数,就直接在想用的地方直接 写名字来用。
在其他类里面用,哪你就得先创建对象。然后通过这个对象调用,
如:
类1:
void main()
{
max();

};
int max()
{
};
这是直接用得;
类1:
void main()
{

};
int max()
{
};
类2:
类1 bb=new 类1();
bb.max();
这样就ok了追问

不明白你在说什么,我说的是delphi,你怎么扯到了c++上,而且这个貌似不是类吧。。。

第2个回答  2013-03-20
TestClass = class(TObiect)
publiic
Constructor Create ;
destructor Free;
procedure Add;
end;

调用的时候
创建一个对象去调用类方法。如:

var
AAA: TestClass;
begin
AAA := TestClass.Create;
Try
AAA.Add;
finally
AAA.Free;
end;追问

为什么AAA不能这样AAA.create

追答

因为在你调用构造函数的时候,这个对象还没有在堆中分配内存,你的AAA是不存在的,你只能通过他的构造函数去给他分配空间以及初始化,AAA才会存在,AAA不存在,你怎么用AAA.Create。在delphi中在,AAA没有构造之前,AAA是一个类指针,这里处理方式和C++不一致,delphi的构造函数得益于它的self指针,构造函数中内置的self参数是指向对象的,而在类方法中self是指向类的。同时,面向对象中,AAA构造的时候也可以不用TestClass的构造方法,可以去用TestClass的基类的构造方法。

追问

可是我前面已经做了定义了
AAA:TestClass;
这样不就会分配地址了吗
而且我如果是自己做的话

ITL=object
private
protected
str:string;
public
constructor Create(s:string);
procedure bracket;
procedure semantics;
end;

这样子应该已经是分配好了地址了吧。

最后谢谢你的回答

追答

你想一下,你只是写了一个类,为什么不能直接用这个类的方法呢。因为他是不存在的。你的类只是描述了一个类型,其实这个东西还没有存在,所以你要实例化,所以你需要用一个对象来调用它的方法.然后,构造函数是干嘛的呢?就是给你的实例化对象分配内存和初始化的。所以只有当你有一个实力,然后再通过函数构造出来的话,才会有分配内存,这个东西才是实实在在有的,这就是为什么要叫做对象实例化。
AAA:TestClass;这个只是你定义了这样一个类型,在编程中,你直接写上A: integer;这样可以,因为基本类型,都是在栈上分配内存的,所以规操作系统自行分配和是释放,delphi的对象只能在 堆上分配,对上的空间是归程序员自行处理的(C++的对象可以在栈上,但是delphi一定在堆上)。
建议你多看看一些编程基础的书,然后再加上练习,慢慢就会融会贯通。

追问

真的很谢谢你,但是怎么才能在堆上面分配呢?
比如?
我看c++的书上介绍构造函数都是说输出一个什么,然后就证明他运行过,可是事实上要如何分配呢?怎么操作?
还有为什么我有些控件直接安放在窗体上就可以了,不用构造函数?这是为什么?
再次谢谢
希望一次回答清楚,因为再追问就要分了。。。
省下来给你好了

追答

在堆栈上分配内存,是归操作系统管理的,各种语言自己只是提供一个内存分配管理器,做了一下优化和便捷。你可以用各个语言自己的管理器,也可以用API去分配内存。
你看一下,内存分配上面的东西,这个比较杂,给你找个delphi的连接你看看http://wenku.baidu.com/view/58235189680203d8ce2f24c1.html
可能看起来不全部懂,你知道大概的意思就行了。
你说的控件创建,他也是必须构造的,给你举个delphi的例子,你在form上面放一个button。你在application里面就可以看看到,他是调用了CreateForm去创建的,控件的Create构造函数是因为它们都继承自TComponent,参数是表示了控件的归属,父控件会将控件从原来的父控件中删除,加入到自己的子控件列表中,这样你的botton也会随着父控件一起构造。
学习思考总是好的,有的细节你必须搞清楚,有的你可以暂时带着疑问(暂时你可能理解不了,所以比较难搞清楚),等你代码写多了,遇到的问题多了,自然就明白了。
不要拘泥于编程语言,多看看操作系统,计算机组成原理,和各种语言处理机制方面不同的东西。只能通过多加练习才能提高。
Pascal作为入门语言挺好的,语法严谨,结构清晰,不过这语言现在冷门了。
感觉你基础还是掌握的不行,所以有时间一定学习下C语言。要知道“聪明的程序员用delphi,真正的程序员用C“。

本回答被提问者和网友采纳
第3个回答  2020-02-11
AAA := TestClass.Create; 改为 AAA := TestClass.Create(true);
或者在最后加下面这些
constructor TestClass .Create;
begin
inherited create(true);
end;
我也刚开始用,弄了半天
第4个回答  2013-03-18
var a:TAClass;

a:=TAClass.create;
最后记得a.free追问

那这个构造函数与一般函数有什么区别。c++里不是直接在定义数据类型的时候就调用了构造函数了吗

delphi自己做了一个类,然后constructor Create;怎么来调用这个函数
在自己类里面调用函数,就直接在想用的地方直接 写名字来用。在其他类里面用,哪你就得先创建对象。然后通过这个对象调用,如:类1:void main(){ max();};int max(){ };这是直接用得;类1:void main(){ };int max(){ };类2:类1 bb=new 类1();bb.max();这样就ok了 ...

delphi中create的用法一直不是很清楚 有没有系统全面的介绍
当你写一个类,它会默认继承祖先类的构造函数,不过你可以把祖先的盖掉,加上自己的参数,比如:TmyObj=Class(TObject)public constructor Create(const s:string);\/\/覆盖祖先的构造函数 destructor Destroy;override;end;\/\/...constructor TmyObj.Create(const s:string);begin inherited;\/\/调用祖先的...

delphi中constructor,destructor 都什么时候生效
constructor TMyLoginr.Create; 是你的TMyLoginr类的构造函数destructor TMyLogin.Destroy; 是你的TMyLoginr类的析构函数 构造函数在你的对象事例化的时候 如下var MyLogin: TMyLogin;begin MyLogin := TMyLogin.Create(); \/\/这里就会调用构造函数了end; 析构函数在对象销毁的时候调用...

delphi怎么添加构造和析构函数
在 delphi 语言里,类的构造和析构函数名称是特定的:构造函数名称为 Create,析构函数名称为 Destroy。在类中声明类的构造与析构函数,大致如下代码:\/\/类的声明 TScrollingWinControl = class(TWinControl) public constructor Create(AOwner: TComponent); override; destructor Destroy; override...

DELPHI基础教程:异常处理与程序调试(二)[2]
constructor Create;end;EInvalidInput = class(EInValidation)public constructor Create(ErrorNum: Integer)end;EInValidation增加了一个公有成员ErrorCode来保存错误代码 错误代码的增加提供了很大的编程灵活性 对于异常类 可以根据错误代码提供不同的错误信息 对于使用者可以通过截取错误代码 在try…except...

delphi能不断循环读取文件夹内生成的文件,又能中途关闭程序,代码如何...
constructor Create(Suspended: boolean); override;end;procedure TMyThread.Create(Suspended: boolean);begin FreeOnTerminated := true;end;procedure TMyThread.Execute();begin \/\/ 如果线程不终止,就不停的读,while not Terminated do begin \/\/ 在这个函数里读出来的数据你直接处理也行,发给主...

通过实例看VCL组件开发全过程(一)
constructor TClock Create(AOwner: TComponent); begin inherited Create(AOwner); \/\/设置默认值 fTimer:=TTimer Create(self); \/\/将它属于我们的组件 这样便不用编写析构函数 而可以自动在释放本组件时释放Timer Active:=false; AllowWake:=false; State:=StClock; BeginTime:= : : ; WakeTime:= : : ;...

DELPHI基础教程:开发Delphi对象式数据管理功能(二)[1]
这两个方法在实现上没有大的不同 顾名思义 第一个方法是通过资源名构造TResourceStream; 第二个方法通过资源ID构造TResourceStream 而且在实现过程中 它们都调用了Initialize方法 下面是它们的实现 constructor TResourceStream Create(Instance: THandle; const ResName: string;ResType: PChar)begin inherit...

Delphi 如何用多线程进行数据采集
--- ② 重载超类TThread的Execute方法。在这一方法中将具体地执行数据采集任务。--- ③ 如果希望一边采集一边显示,就在编写几个用于显示采集进度的过程,供Execute方法调用。--- TThread类中最常用的属性\/方法如下:Create方法:constructor Create (CreateSuspended: Boolean);--- 其中CreateSuspended...

求Delphi编译错误全部。。。
Procedure NEW needs constructor 过程NEW需要constructor方法PROCEDURE or FUNCTION expected 要求PROCEDURE或FUNCTION Procedure or function name expected 要求过程或函数名Program or unit ’<name>’ recursively uses itself 程序或单元递归Property ’<name>’ does not exist in base class 在基类中<NAME>属性不存在...

相似回答