不知何故意外混合TEdit.Text和TLabel.Caption毫无例外地工作?

Jer*_*dge 5 delphi delphi-7 access-violation

我正在动态创建多种不同类型的控件,并将它们存储在后台列表中.其中两个控件是TEdit和TLabel.这些控件都是TPanel控件的子控件.

当我写入TEdit.Text和TLabel.Caption属性时,从TPanel.Controls(从错误的索引中获取它们)读取时,我意外地将TEdit与TLabel混淆了.不知何故,它甚至没有引起任何例外.

它确实像TLabel(SomeEditControl).Caption:= 'This is a label control';TEdit(SomeLabelControl).Text:= 'This is an edit control';它会将TEdit.Text数据在TLabel.Caption财产,并在TEdit.Text属性TLabel.Caption数据.我很困惑,这没有引发异常...我唯一可以猜到的是,TEdit.Text和TLabel.Caption属性恰好恰好在控件类之间使用相同的内存地址.

为什么这不会导致访问冲突?

And*_*and 9

TEdit.Text来自TControl.TextTLabel.Caption来自TControl.Caption.但请看下面的声明TControl:

...
property Caption: TCaption read GetText write SetText stored IsCaptionStored;
...
property Text: TCaption read GetText write SetText;
...
Run Code Online (Sandbox Code Playgroud)

具有与之关联的文本的控件通过SetTextGetText方法来管理它.根据控件的类型,这些与控件CaptionText属性相关联.从文档中,

注意:显示文本的控件使用Caption属性或Text属性来指定文本值.使用的属性取决于控件的类型.通常,Caption用于显示为窗口标题或标签的文本,而Text用于显示为控件内容的文本.

  • 没有'FText`,它是'WM_GETTEXT`,+ 1 (3认同)