delphi中Create参数区别

本文详细解析了Delphi中控件创建时不同参数的意义及应用场景,介绍了如何使用这些参数来创建控件,并解释了Sender参数的作用及用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

delphi中我们创建一个VCL控件时,有多种参数:

From.create(参数)

参数有以下几种:

Application:你的控件的父级是主程序,所以他的级别最高.
Self:你的控件的父级是当前窗口,他关闭你也关闭.
Sender:你的控件的父级是当前对象.
Handle:你的控件的父级是此句柄.
Nil:无定义.生成的独立窗体需代码释放。

     一般说来,Delphi类的构造方法在TComponent前是不用重载的,而
TComponent后如果在构造时需要初始化字段就必须重载构造方法(当然参
数也不能变,固定的是AOwner:TComponent)。这是因为每一个TComponent
类中都有一个子部件表,用来当该部件有所变化时通知子部件,包括以上
各位大虾所述的与释放有关的操作。这样很多的子部件构成一棵部件树,
牵一发可动全身。
      TComponent有两级祖先,TPersistent和TObject,TPersistent与字段的
存贮有关,构造方法也基本上不用重载(TPersistent的后代例外),而
TObject根本就没有构造方法,无从重载,所以可以自己定义参数或者根本
没有参用数。这便是Create的参数可以千奇百怪的原因。
      举几个例子:
TList.Create;    // inherited from TObject
TException.Create(const Msg: string);//inherited from TObject
TFont.Create;    // inherited from TPersistent
TTreeNode.Create(AOwner: TTreeNodes);//inherited from TPersistent;
TListItem.Create(AOwner: TListItems);//inherited from TPersistent;
TForm.Create(AOwner: TComponent);//inherited from TWinControl;

  1. {**********************************************************************************************************************}   
  2.   
  3. 建立窗体是经常要用到他们如:    
  4.   
  5. form1:=tform.create(application);    
  6.   
  7. form1:=tform.create(self);    
  8.   
  9. form1:=tform.create(nil);    
  10.   
  11.      
  12.   
  13. form1:=tform.create(application); 当应用程序关闭时form1会被释放    
  14.   
  15. form1:=tform.create(self); 当前窗体释放时form1会被释放    
  16.   
  17. form1:=tform.create(nil); 需要自己动手释放,没人会为你代劳    
  18.   
  19.      
  20.   
  21. Form1 := TForm.Create(Arg);    
  22.   
  23. 其中的Arg代表的是Form的Owner,也就是拥有者。    
  24.   
  25. 什么叫拥有者呢,意思就是说当这个拥有者释放的时候,Form1也会释放。    
  26.   
  27.      
  28.   
  29. {************************************************************************************************************************}   
  30.   
  31. 在事件处理程序参数表中,至少含有一个参数Sender,它代表触发事件处理程序的构件,如在上例中,Sender就指Button2,有了Sender参数,可以使多个构件共用相同的事件处理程序,如下例:     
  32.   
  33. Procedure Tform1.Buttonclick(Sender:Tobject);     
  34.   
  35. Begin    
  36.   
  37. If sender=button1 then    
  38.   
  39. Label1.caption:=′看庭前花开花落 '    
  40.   
  41. Else Label2.caption:=′望天上云卷云舒′     
  42.   
  43. End;     
  44.   
  45.      
  46.   
  47. 在此例中,Button1,Button2共用了Buttonclick事件处理程序。     
  48.   
  49.      
  50.   
  51. Self是指所编的程序范围是在哪一个类中,Delphi中大都在窗体范围内编程,因此,self即指窗体,如果在编写一个类或是一个组件,则 self指该类或组件。我们在函数或过程的声明中可看出self是代表哪个组件,即self代表‘.’号之前的组件,如在第一个例子中,self代表 Tform1。另外应注意,self只能用在类方法中,而不能用在过程或函数中,如下例用法是错的:     
  52.   
  53. Function a1(B:Integer):Integer;     
  54.   
  55. Begin    
  56.   
  57. ……     
  58.   
  59. Button:=tbutton.create(self);……     
  60.   
  61. End;       
  62.   
  63.      
  64.   
  65. 三、Clientheight和Height,Clientwidth和Width的区别:     
  66.   
  67.      
  68.   
  69. 对于一般的构件而言,Height就是Clientheight,Width就是Clientwidth,而对于窗体而言,Height是包括标题条 在内的高度,而Clientheight是指窗体工作区的高度。同理,Clientwidth是指定窗体工作区的宽度。     
  70.   
  71.      
  72.   
  73. 从上面陈述可知,理解Ower和Parent,Self和Sender,Clientheight和Height,Clientwidth和Width区别,对于Delphi中正确编程是重要的。     
  74.   
  75. 无意中上网在csdn论坛看到了一个很形象的解释:可以参考一下    
  76.   
  77.      
  78.   
  79. 方法,事件,sender,Tobject,self     
  80.   
  81.      
  82.   
  83. 你是一个人类(Tobject),你有你自己的性别,年龄,身高等(属性),你也会攀爬蹬走(方法),你也有你的情绪,思想,当别人说你好的时候你很高 兴,说你坏时你会很沮丧(事件),有一天你自己(self)听到别人(sender)说你的女朋友好漂亮传给你的思想(事件),这时你会非常不高兴(事件 处理外界的响应)    
  84.   
  85.      
  86.   
  87.      
  88.   
  89. {*************************************************************************************************************************}   
  90.   
  91.      
  92.   
  93.   在事件处理程序参数表中,至少含有一个参数Sender,它代表触发事件处理程序的构件,如在上例中,Sender就指Button2,有了Sender参数,可以使多个构件共用相同的事件处理程序,如下例:    
  94.   
  95. Procedure Tform1.Buttonclick(Sender:Tobject);    
  96.   
  97. Begin   
  98.   
  99. If sender=button1 then   
  100.   
  101. Label1.caption:=′看庭前花开花落'    
  102.   
  103. Else Label2.caption:=′望天上云卷云舒′    
  104.   
  105. End;    
  106.   
  107. 在此例中,Button1,Button2共用了Buttonclick事件处理程序。    
  108.   
  109. Self是指所编的程序范围是在哪一个类中,Delphi中大都在窗体范围内编程,因此,self即指窗体,如果在编写一个类或是一个组件,则self 指该类或组件。我们在函数或过程的声明中可看出self是代表哪个组件,即self代表‘.’号之前的组件,如在第一个例子中,self代表 Tform1。另外应注意,self只能用在类方法中,而不能用在过程或函数中,如下例用法是错的:    
  110.   
  111. Function a1(B:Integer):Integer;    
  112.   
  113. Begin   
  114.   
  115. ……    
  116.   
  117. Button:=tbutton.create(self);……    
  118.   
  119. End;    
  120.   
  121. Clientheight和Height,Clientwidth和Width的区别:    
  122.   
  123. 对于一般的构件而言,Height就是Clientheight,Width就是Clientwidth,而对于窗体而言,Height是包括标题条在内的高度,而Clientheight是指窗体工作区的高度。同理,Clientwidth是指定窗体工作区的宽度。    
  124.   
  125. 从上面陈述可知,理解Ower和Parent,Self和Sender,Clientheight和Height,Clientwidth和Width区别,对于Delphi中正确编程是重要的。   
  126.   
  127. view sourceprint?Delphi 中Sender对象的定义!     
  128.   
  129.      
  130.   
  131. 1.Sender的定义:     
  132.   
  133. 每一个事件处理里面至少都有一个Sender参数。比如:     
  134.   
  135. procedure TForm1.Button1Click(Sender:TObject);     
  136.   
  137. begin    
  138.   
  139. ...     
  140.   
  141. end;     
  142.   
  143.      
  144.   
  145. Sender的含义就是代表调用TForm1.Button1Click这个过程的控件. 由于Sender是TObject,所以任何object都可以赋给Sender.     
  146.   
  147. 当你点击BUTTON1时,会产生一个Button1Click事件,系统会把Button1传递给Button1Click过程坐为参数,也就是所说的Sender.     
  148.   
  149.      
  150.   
  151. 2.Sender的用法:     
  152.   
  153.      
  154.   
  155. <1>.由于Sender代表了调用所在过程的控件,那么你就可以直接把它拿来当那个控件用,不过如果要用属性的话,最好写成(Sender as 控件名).控件属性:=... 例如:     
  156.   
  157. procedure TForm1.Edit1Click(Sender: TObject);     
  158.   
  159. begin    
  160.   
  161. with Sender as TEdit do    
  162.   
  163. begin    
  164.   
  165. text:=’hello’;     
  166.   
  167. end;     
  168.   
  169. end;     
  170.   
  171.      
  172.   
  173. <2>.如果在两个事件中处理同样的事情,那么可以利用Sender来省去重写同样的过程。例如:    
  174.   
  175.      
  176.   
  177. var   
  178.   
  179. SearchOptions: TLocateOptions;    
  180.   
  181. searchword:String;    
  182.   
  183. begin   
  184.   
  185.    if sender = Editid    
  186.   
  187.        then   
  188.   
  189.           begin   
  190.   
  191.                searchword:='Empid' ;    
  192.   
  193.                 EditCardnum.text :='' ;    
  194.   
  195.           end   
  196.   
  197. else   
  198.   
  199.    if sender= EditCardnum    
  200.   
  201.         then   
  202.   
  203.              Begin   
  204.   
  205.               searchword:='Cardnum';    
  206.   
  207.               Editid.text:='';    
  208.   
  209.            end;    
  210.   
  211. SearchOptions := [loPartialKey];    
  212.   
  213. tabPV_Card.Locate(searchword, TEdit(sender).Text , SearchOptions);//Editid,EditCardnum两个TEdit事件处理同样的事, tabPV_Card為Ttable控件    
  214.   
  215. end;   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值