2011-12-18 18 views
5

我正在動態創建多種不同類型的控件,並將它們存儲在背景中的列表中。其中兩個控件是TEdit和TLabel。這些控件都是TPanel控件的子控件。不知怎的,意外混合TEdit.Text和TLabel.Caption無一例外地工作?

嗯,當寫入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屬性中,並將TEabel.Caption數據放入TEdit.Text屬性中。我很困惑,這沒有引發異常......我唯一能猜到的是,TEdit.Text和TLabel.Caption屬性恰好在控件類之間使用相同的內存地址。

爲什麼這不會給訪問衝突?

+0

他們都下降。 ( 只是猜測...) –

+0

@AndreasRejbrand這是一個很好的可能性,TEdit.Text和TLabel.Caption我認爲確實轉化爲WindowText –

+0

真。見下文。 –

回答

9

TEdit.Text來自TControl.Text,並且TLabel.Caption來自TControl.Caption。但看看TControl聲明:

... 
property Caption: TCaption read GetText write SetText stored IsCaptionStored; 
... 
property Text: TCaption read GetText write SetText; 
... 

有關聯的一些文字與它通過SetTextGetText方法對其進行管理控制。根據控制類型的不同,這些屬性與CaptionText屬性相關聯。從documentation

注:控件顯示文本兼用Caption屬性或 Text屬性指定的文本值。使用 的屬性取決於控件的類型。通常,標題用於顯示爲窗口標題或標籤的文本 ,而文本用於顯示爲控件內容的文本 。

+3

沒有'FText',它是'WM_GETTEXT',+1 –

+0

或'WM_SETTEXT'作爲這些屬性的setter。 + 1ed,你更快;) – TLama

+0

@大衛:其實,*是* FText。看看'SetText'。 (但是,你是對的,主要部分似乎是基於這些消息的。) –

1

他們都來自控制類派生和這兩個屬性訪問值通過相同的`TControl`具有`WindowText`特性滿足