zoukankan      html  css  js  c++  java
  • FindChildControl与FindComponent

    http://blog.csdn.net/tht2009/article/details/6954880?reload

    前两天编码遇到了要使用FindChildControl方法获取指定名称的TSpeedButton按钮,结果折腾了半天就是没得结果(基础不扎实,呵呵),于是赶紧搜索了下,补习关于这两个方法的用法。

           TWinControl类的FindChildControl方法在FWinControls中查找返回指定名称的可视且有窗体的组件(继承自TWinControl类)。该方法可以确定当前控件是否含有(contain)指定名称的继承自TWinControl类的子控件,其结果与指定要查找的控件的Parent属性有关。如果未找到返回nil(NULL),该方法只查找当前控件的直接子控件,不会迭代查找子控件的子控件。

           TComponent类的FindComponent方法在FComponents中查找返回指定名称的组件。该方法可以确定当前组件是否拥有(Own)指定名称的组件,其结果与指定查找的组件在创建时指定的Owner属性有关。窗体设计器上的创建的组件其拥有者为窗体,所以一般使用Self.FindComponent调用这个方法。该方法参数不区分大小写。

           Parent属性是指定控件的父容器,控件只能在父容器范围内显示和移动。Owner属性是指定组件的所有者,它负责组件的创建和释放。在窗体编辑器中添加组件,则默认地将Owner属性设置为所属的窗体,所以用窗体的FindComponent肯定可以找到。如果动态创建组件,那么必须指定其Owner和Parent,才可以调用相应方法找得到。而且,如果你放上去的是TWinControl的继承类,那么用FindChildControl就可以找到,否则就找不到。

           FindComponent非常简单,下面重点说说FindChildControl这令人纠结的方法【注1】      

           这里先要了解下面几个基类:

           1、TComponent  所有组件基类

           2、TControl         运行时可视组件(TWinControl和TGraphicControl的基类)

           3、TWinControl  可视且有窗体的组件的基类

           TWincontrol就是Windows控件库的基类,从TWinControl继承下来的控件,都是具备有控件句柄的,也就是在Windows内部具备有唯一标记,能动态索引找到的。

           Delphi使用两个列表来维护控件的子控件:FWinControls和FControls。前者保存有句柄的控件,即继承自TWinControl的控件;后者保存无句柄的控件,一般继承自TGraphicControl的控件。所以控件的ControlCount属性值为FWinControls.Count与FControls.Count之和。

    很多时候会将一个Panel1放在Form1上,然后再将一个Button1放在Panel1上,这样的话,这个Button1的Owner就是Form1而Parent则是Panel1。

       所有的Delphi的Component都有Owner 属性,Owner属性表示这个Component的所有者是谁,比如上面的例子,Button1的所有者(Owner )就是Form1,当Form1析构时,会先将Button1释放掉。也就是说,Owner会自动地控制Component的生命周期,它负责构件的创建和释放。如在上例中,系统默认Form上所有Component的所有者是Form1。顺便指出,Create方法应带有表示Component的Owner的参数.,如果Owner设置的为Nil值,那这个Component必须创建者编码析构它,Owner属性是只读的,并且在运行期是无法修改它的值。

       类似,但不同于Owner属性,Parent 属性则表示Component从属于另一个Component,简单的说自身是其他Component的Child Component,例如 TForm,TGroupBox ,TPanel等。Parent是用来控制 在它的客户区范围内的Child Component,Parent决定如何展示包含的Child Component,例如:Left,Top等属性都是相对于Parent的位置。

       Parent属性可以在运行期被修改。并非所有的Component都有Parent,Parent属性可以为Nil值,可以用HasParent 方法返回的Boolean值来判断Component是否拥有Parent。 我们可以设置Parent属性来做一些控制,例如:我们可以在Form1上置Panel1和Panel2,然后再放一个Button1在Panel1上,在Button1的OnClick事件中写上:Button1.Parent := Panel2; 运行这段代码你会发现,开始Button1是在Panel1上,然后按下Button1触发OnClick事件后,Button1‘跳’到了Panel2上。我们要在运行期间创建一个Button的话,就一定要注意指定它的Parent属性,否则Button不会显示出来,因为它必须拥有一个Parent的容器来显示自己。如果你在设计这个Button时察看下属性编辑器,你会看到ParentFont和ParentShowHint等属性,类似于这样的属性设置为True的话,就会使Button的Font以及ShowHint属性按Parent的Font和ShowHint的值来设置,保持一致的风格。比如Parent的Font是红色,那么Button的字体也将是红色。

       ControlCount和ComponentCount的区别也就取决于Parent与Owner的区别,还是拿上面的例子解释下Panel1的ControlCount为1而ComponentCount却为0,是因为Button1的Parent属性指向的是Panel1而Owner属性则还是Form1,所以Form1的ComponentCount值才是1。我们可以利用Controls属性与Components属性去遍历Parent所包含的Child Component和Owner所管理的Child Component。

       这是一个初学者比较容易混淆的概念,希望此文能帮助刚刚接触Delphi和BCB的朋友了解些基本的知识。

  • 相关阅读:
    ios中strong和weak的解释理解
    leetcode: Remove Duplicates from Sorted Array II [基本功]
    leetcode : Sort Colors
    leetcode : Search a 2D Matrix
    leetcode : Set Matrix Zeroes [技巧 follow up 逐步优化]
    leetcode : edit distance[hard][经典动态规划]
    leetcode : Climbing Stairs
    leetcode : Add Bianry 基本功 字符转整数
    leetcode : Plus One 基本功
    leetcode : Minimum Path Sum
  • 原文地址:https://www.cnblogs.com/Values/p/3152965.html
Copyright © 2011-2022 走看看