新手一个关于delphi面向对象的问题,请高手解答一下,急(100分)

  • 主题发起人 主题发起人 hardblue
  • 开始时间 开始时间
H

hardblue

Unregistered / Unconfirmed
GUEST, unregistred user!
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
end;
end.

上面是一个单元文件的程序代码
问题如下:
TForm1 = class(TForm) 这一句中,TForm1应该从TForm继承过来的一个类,
var
Form1: TForm1; 这两行声明的一个对象变量
也就是说可以通过对象变量Form1引用对象
但是在窗体的事件处理过程中,也就是下面这句
procedure TForm1.FormCreate(Sender: TObject);
为什么是Form1.FormCreate 而不是Form1.FormCreate呢?
是因为formcreate是静态方法吗?




 
为什么是Form1.FormCreate 而不是Form1.FormCreate呢?
——————————————————————————
有区别吗?
 
你是问:为什么是procedure TForm1.FormCreate(Sender: TObject);
而不是procedure Form1.FormCreate(Sender: TObject);
的吧?

我可以这样告诉你:我们在面向对象编程时,本质上我们是在构造类(Class)。直到程序真正运行时才产生对象,即类的实例。在这个例子中,TForm1就是从TForm继承来的一个“类”,我们编写procedure TForm1.FormCreate(Sender: TObject);就是在定义类TForm1的特性。而对象Form1是TForm1的一个实例,他具有了类TForm1的特性。

其实如果你从逻辑顺序看看,
var
Form1: TForm1;
的“执行”是在最后的。也就是说,我们构造类TForm1的特性时,对象Form1还并不存在,所以无法用
procedure Form1.FormCreate(Sender: TObject);

-------------------------
我说的也很不专业,OO真的是博大精深,我们还是多看点书吧!
 
ETimeFly回答的很明白了。
TForm1是从TForm继承来的一个“类”,过程是‘类的过程’。而对象Form1只是TForm1的一个实例。
 
还望高手关注!指正!
 
delphi和c++不一样。delphi认为对象在没创建出来时候是不能创建得,呵呵,这符合日常生活得习惯。form1是对象,Tform是类,类得create创建对象,对象得create说不通。。。呵呵,好像D5开发指南是这么讲得。。。。
 
实际我们所写的代码是在TForm1中,即描述一个TForm1对象
form1只是一个实例而已
可以:
var from1:TForm1;
其实也可以
var from2:TForm1;
不知这样说对不对。
 
可不可以说form1是一个指针,而TForm是地址空间,创建Tform就是分配地址;所以分配了地址空间之后就可以有无数个指针指向这个地址空间。
及:form1->TForm/form2->TFrom.....都是成立的。
 
>> procedure TForm1.FormCreate(Sender: TObject);
>> 为什么是 TForm1.FormCreate 而不是Form1.FormCreate呢?
我觉得这个问题有点复杂。
TForm1.FormCreate 说明 TForm1 类拥有 FormCreate 方法,这个方法实际上就是一个过程,只不过是 TForm1 类所拥有的。
TForm1.FormCreate 函数是被赋值给 Form1.OnCreate 属性的。
OnCreate 的定义是:TNotifyEvent = procedure(Sender: TObject) of object; 它是过程指针和对象指针的组合。
当 Form1 实例创建时,Delphi 的流机制会把 TForm1.FormCreate 的地址和 Form1 的指针(一共两个指针)存放在 From1.OnCreate 属性值里。(这条是我猜想的)
 
我也不很清楚,随便说一下。。
看看DFM 文件里。TFORM1的类实例在程序运行时才创建。
那么是不是可以猜到。设计期的FORM1实际上是一个FORM,但是不是真正你的FORM1。IDE背后做了一些事情(为了方便我们做可视化编程)。这个真正的FORM1在APPLICATION 初始化完成也就是F9以后。才真正的出现。如果是这个样子的话。那么。我们实际上是在写TFORM1
而不是在设计期操纵FORM1;也就是说。我们的FORM1在设计期根本不存在。我们在操作的FORM是IDE提供的一个。和我们的程序没什么关系。不知道对不对。请大家继续说。
 
这是还没有分清楚类和对象的定义。
对象是类的实例。可以这样比喻:
人是一个类,有各种属性,
其中public公共属性(如身高体重等),用于描述自身的特点,可以透露给外界知道。
private属性是私有属性,就自己知道(如脉搏次数、体温)
人还能做各种事情,就是所谓的方法。用于描述这个类的作用。
以上我们定义了一个类,仅只是描述了一个人应该怎么怎么样,会做什么什么而已,实际上是个概念(应该叫一组数据结构和相应的算法),并没有产生一个真正的人,就像我们在生理卫生书上写的那样。
而类声明了一个对象之后,这个对象就是符合这个类所有定义的一个活生生的人了。
所以在变量声明时候声明了
Form1: TForm1;
这个意思就是说现在产生了一个TForm1描述的那样的Form啦。
所以,要让Form做什么,只有在描述它的那个类里面定义才有用。
这个就是为什么是 TForm1.FormCreate 而不是Form1.FormCreate了
初次写文章,希望对大家有帮助
 
可以这样想:TForm1是类,就好象是一种数据类型(只不过它有方法和属性),而Form1是一个此类型的变量,想想看当定义一种数据类型时它在内存中是不存在的,只有定义一个此类型的变量时才实际开辟一块内存区域来保存它。
 
每个人的都有自己的理解!顶一下。希望能继续讨论
 
收益颇多啊!道理越辩越明!
 
后退
顶部