2011-12-18 3 views
5

Sto lavorando con la creazione dinamica di diversi tipi di controlli e la memorizzazione in un elenco in background. Due di questi controlli sono un TEdit e un TLabel. Questi controlli sono tutti sottocontrolli di un controllo TPanel.In qualche modo mescolando accidentalmente TEdit.Text e TLabel.Caption funziona senza eccezioni?

Bene Ho mescolato accidentalmente TEdit con TLabel durante la lettura da TPanel.Controls (ottenuto dagli indici errati) durante la scrittura nelle proprietà TEdit.Text e TLabel.Caption. In qualche modo, non ha nemmeno sollevato alcuna eccezione.

Fa qualcosa come TLabel(SomeEditControl).Caption:= 'This is a label control'; e TEdit(SomeLabelControl).Text:= 'This is an edit control'; E inserisce i dati TEdit.Text nella proprietà TLabel.Caption e i dati TLabel.Caption nella proprietà TEdit.Text. Sono confuso dal fatto che ciò non abbia sollevato un'eccezione ... L'unica cosa che posso immaginare è che le proprietà TEdit.Text e TLabel.Caption si limitino a utilizzare lo stesso indirizzo di memoria tra le classi di controllo.

Perché non fornire una violazione di accesso?

+0

Tutti discendono da 'TControl' che ha una proprietà' WindowText'. ( Solo supposizioni ...) –

+0

@AndreasRejbrand Questa è una buona possibilità, TEdit.Text e TLabel.Caption Suppongo di tradurre il valore di WindowText –

+0

True. Vedi sotto. –

risposta

9

Il TEdit.Text proviene da TControl.Text e TLabel.Caption viene da TControl.Caption. Ma guardare la dichiarazione di TControl:

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

Un controllo che ha un testo associato con esso lo gestisce tramite i metodi SetText e GetText. A seconda del tipo di controllo, questi sono associati alla proprietà Caption o Text. Dal documentation,

Nota: controlli che visualizzano l'uso del testo o la proprietà Caption o la proprietà Text per specificare il valore di testo. La proprietà che viene utilizzata dipende dal tipo di controllo. In generale, Didascalia viene utilizzata per il testo visualizzato come titolo o etichetta della finestra, mentre Testo viene utilizzato per il testo visualizzato come contenuto di un controllo.

+3

Non c'è 'FText', è' WM_GETTEXT', +1 –

+0

Oppure 'WM_SETTEXT' come setter per queste proprietà. + 1ed, eri più veloce;) – TLama

+0

@David: In realtà, ci * è * un 'FText'. Dai un'occhiata a 'SetText'. (Ma comunque, hai ragione. La parte principale sembra essere basata su questi messaggi.) –

1

Sono entrambi derivati ​​dalla classe di controllo ed entrambe le proprietà di accesso di valore attraverso lo stesso incontrato