理解所有者(understanding owner)和delphi应用程序中的父级(parent in delphi applications)的区别

每次在窗体上放置面板和该面板上的按钮时,都会建立“不可见”连接。表单成为按钮的所有者,面板被设置为其父级。...

每次在窗体上放置面板和该面板上的按钮时,都会建立“不可见”连接。表单成为按钮的所有者,面板被设置为其父级。

每个Delphi组件都有一个所有者属性。所有者负责在释放所拥有的组件时将其释放。

类似但不同的是,父属性指示包含“子”组件的组件。

父母亲

父组件是指包含另一个组件的组件,例如TForm、TGroupBox或TPanel。如果一个控件(父控件)包含其他控件,则包含的控件是父控件的子控件。

父项确定组件的显示方式。例如,左侧和顶部特性都是相对于父级的。

可以在运行时期间分配和更改父属性。

并非所有组件都具有父级。许多表单没有父级。例如,直接出现在Windows桌面上的表单的父级设置为nil。组件的HasParent方法返回一个布尔值,该值指示是否已为组件分配了父级。

我们使用Parent属性来获取或设置控件的父级。例如,在窗体上放置两个面板(Panel1、Panel2),并在第一个面板(Panel1)上放置一个按钮(Button1)。这会将按钮的父属性设置为Panel1。

Button1.Parent := Panel2;

如果将上述代码放置在第二个面板的OnClick事件中,当您单击Panel2时,按钮将从Panel1“跳转”到Panel2:Panel1不再是按钮的父级。

当您想要在运行时创建一个TButton时,记住分配一个父控件(包含该按钮的控件)是很重要的。要使组件可见,它必须有一个父级才能在其中显示自己。

父母这个和那个

如果在设计时选择一个按钮并查看对象检查器,您将注意到几个“父级感知”属性。例如,ParentFont指示用于按钮标题的字体是否与用于按钮父项的字体相同(在上一个示例中:Panel1)。如果面板上所有按钮的ParentFont均为True,则将面板的Font属性更改为Bold将导致面板上所有按钮的标题都使用该(粗体)字体。

控制属性

共享同一父级的所有组件都可以作为该父级控件属性的一部分使用。例如,控件可用于迭代窗口控件的所有子级。

下一段代码可用于隐藏Panel1上包含的所有组件:

for ii := 0 to Panel1.ControlCount - 1 do Panel1.Controls[ii].Visible := false;

耍花招

窗口控件有三个基本特征:它们可以接收输入焦点,使用系统资源,并且可以是其他控件的父控件。

例如,按钮组件是一个窗口控件,不能是其他组件的父级-不能在其上放置其他组件。问题是Delphi对我们隐藏了这个特性。例如,TStatusBar上隐藏了一些组件,如TProgressBar。

所有权

首先,请注意,表单是驻留在其上的任何组件(在设计时定位在表单上)的总体所有者。这意味着当表单被销毁时,表单上的所有组件也将被销毁。例如,如果在调用表单对象的Free或Release方法时,应用程序具有多个表单,则不必担心显式释放该表单上的所有对象,因为表单是其所有组件的所有者。

我们在设计或运行时创建的每个组件都必须由另一个组件拥有。组件的所有者其所有者属性的值由创建组件时传递给创建构造函数的参数确定。重新分配所有者的唯一其他方法是在运行时使用InsertComponent/RemoveComponent方法。默认情况下,表单拥有其上的所有组件,反过来又由应用程序拥有。

当我们使用关键字Self作为Create方法的参数时,我们正在创建的对象属于该方法所包含的类,该类通常是Delphi表单。

另一方面,如果我们让另一个组件(不是表单)成为该组件的所有者,那么我们让该组件负责在对象被销毁时处理该对象。

与任何其他Delphi组件一样,可以在运行时创建、使用和销毁定制的TFindFile组件。要在运行时创建、使用和释放TFindFile组件,可以使用下一个代码段:

uses FindFile; ... var FFile : TFindFile; procedure TForm1.InitializeData; begin //form ("Self") is the Owner of the component //there is no Parent since this //is an unvisible component. FFile := TFindFile.Create(Self) ; ... end;

注意:由于FFile是使用所有者(Form1)创建的,所以我们不需要做任何事情来释放组件,当所有者被销毁时,它将被释放。

组件属性

共享同一所有者的所有组件都可以作为该所有者的components属性的一部分使用。以下步骤用于清除表单上的所有编辑组件:

procedure ClearEdits(AForm: TForm) ; var ii : Integer; begin for ii := 0 to AForm.ComponentCount-1 do if (AForm.Components[ii] is TEdit) then TEdit(AForm.Components[ii]).Text := ''; end;

“孤儿”

某些控件(如ActiveX控件)包含在非VCL窗口中,而不是父控件中。对于这些控件,Parent的值为nil,ParentWindow属性指定非VCL父窗口。设置ParentWindow会移动控件,使其包含在指定的窗口中。当使用CreateParented方法创建控件时,将自动设置ParentWindow。

事实是,在大多数情况下,您不需要关心家长和所有者,但是当涉及到OOP和组件开发时,或者当您希望将Delphi向前推进一步时,本文中的陈述将帮助您加快这一步。

  • 发表于 2021-09-06 15:06
  • 阅读 ( 79 )
  • 分类:IT

你可能感兴趣的文章

理解delphi项目和单元源文件

简而言之,Delphi项目只是组成由Delphi创建的应用程序的文件集合。DPR是用于Delphi项目文件格式的文件扩展名,用于存储与项目相关的所有文件。这包括其他Delphi文件类型,如表单文件(DFM)和单元源文件(.PASs)。 由于Delphi...

  • 发布于 2021-09-06 15:15
  • 阅读 ( 181 )

程序退出时delphi中的内存泄漏通知

...更丰富。 “新”内存管理器最出色的功能之一是允许应用程序注册(和注销)预期内存泄漏,并在程序关闭时报告意外内存泄漏。 使用Delphi创建WIN32应用程序时,必须确保释放动态创建的所有对象(内存)。 当程序无法释...

  • 发布于 2021-09-06 15:15
  • 阅读 ( 171 )

如何在运行时移动和调整控件大小(在delphi应用程序中)(move and resize controls at run time (in delphi applications))

下面介绍如何在应用程序运行时使用鼠标拖动和调整控件大小(在Delphi窗体上)。 运行时的表单编辑器 在窗体上放置控件(可视组件)后,可以调整其位置、大小和其他设计时特性。但是,在某些情况下,您必须允许应用...

  • 发布于 2021-09-10 20:45
  • 阅读 ( 198 )

如何delphidbgrid中的multiselect(multiselect in the delphi dbgrid)

Delphi的DBGrid是数据库相关应用程序中使用最广泛的DB感知组件之一。它的主要目的是使应用程序的用户能够在表格网格中操作数据集中的记录。 DBGrid组件的一个鲜为人知的特性是,可以将其设置为允许多行选择。这意味着用...

  • 发布于 2021-09-10 22:29
  • 阅读 ( 195 )

如何delphidbgrid中的记录排序(sort records in delphi dbgrid)

...hi DBGrid是一个功能强大的组件,如果您正在开发数据感知应用程序,那么您可能每天都在使用它。下面,我们将了解如何向您的数据库应用程序中添加更多用户肯定会喜欢的功能。 按照《Delphi数据库编程初学者指南》中描述...

  • 发布于 2021-09-10 22:31
  • 阅读 ( 239 )

如何构建没有gui的控制台应用程序(build console applications with no gui)

​控制台应用程序是纯32位Windows程序,在没有图形界面的情况下运行。启动控制台应用程序时,Windows会创建一个文本模式控制台窗口,用户可以通过该窗口与应用程序进行交互。这些应用程序通常不需要太多的用户输入。控制...

  • 发布于 2021-09-10 22:34
  • 阅读 ( 254 )

在系统托盘中放置delphi应用程序

...其他图标吗?这个地方叫做Windows系统托盘。您想将Delphi应用程序的图标放在那里吗?您希望该图标设置动画还是反映应用程序的状态? 这对于长时间运行而没有用户交互的程序(通常整天都在电脑上运行的后台任务)非常有...

  • 发布于 2021-09-11 00:20
  • 阅读 ( 182 )

优化delphi程序的内存使用

...,最终降低计算机的速度。 02 2006年 何时在delphi应用程序中创建表单 假设您要设计一个包含主窗体和两个附加(模态)窗体的程序。通常,根据您的Delphi版本,Delphi将把表单插入到项目单元(DPR文件)中,并包含一...

  • 发布于 2021-09-15 03:43
  • 阅读 ( 205 )

如何用delphi显示最顶层的系统模式消息框(display a topmost system modal message box with delphi)

对于桌面(Windows)应用程序,一个消息(对话框)用于提醒应用程序的用户需要采取某些操作、某些操作已完成,或者通常是为了引起用户的注意。 在Delphi中,有几种向用户显示消息的方法。您可以使用RTL中提供的任何现成...

  • 发布于 2021-09-15 03:45
  • 阅读 ( 232 )

理解delphi中的内存分配

...然存在:这个堆栈是什么?为什么会出现溢出? delphi应用程序中的内存 当您开始在Delphi中编程时,您可能会遇到类似上面的错误,您可以解决它并继续前进。这与内存分配有关。大多数情况下,只要释放所创建的内容,您就...

  • 发布于 2021-09-15 03:47
  • 阅读 ( 197 )
f9620524
f9620524

0 篇文章

相关推荐