2011-12-18 5 views
5

Estoy trabajando con la creación dinámica de diferentes tipos de controles y su almacenamiento en una lista en segundo plano. Dos de tales controles son un TEdit y un TLabel. Estos controles son todos subcontroles de un control TPanel.De alguna manera, mezcla accidentalmente TEdit.Text y TLabel.Caption funciona sin excepción?

Bueno, accidentalmente mezclé el TEdit con TLabel cuando leía TPanel.Controls (los obtuve de los índices incorrectos) al escribir en las propiedades TEdit.Text y TLabel.Caption. De alguna manera, ni siquiera planteó ninguna excepción.

Se hace algo como TLabel(SomeEditControl).Caption:= 'This is a label control'; y TEdit(SomeLabelControl).Text:= 'This is an edit control'; Y pone los datos TEdit.Text en la propiedad TLabel.Caption, y los datos TLabel.Caption en la propiedad TEdit.Text. Me sorprende que esto no haya provocado una excepción ... Lo único que puedo adivinar es que las propiedades TEdit.Text y TLabel.Caption usan la misma dirección de memoria entre las clases de control.

¿Por qué esto no daría una infracción de acceso?

+0

Todos ellos descienden de 'TControl' que tiene una propiedad' WindowText'. ( Simplemente adivinando ...) –

+0

@AndreasRejbrand Esa es una buena posibilidad, TEdit.Text y TLabel.Caption Supongo que traducir al WindowText –

+0

True. Vea abajo. –

Respuesta

9

El TEdit.Text viene de TControl.Text, y el TLabel.Caption viene de TControl.Caption. Pero mira a la declaración de TControl:

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

un control que tiene algún texto asociado a él lo maneja a través de los métodos SetText y GetText. Dependiendo del tipo de control, estos se asocian con la propiedad Caption o Text. Desde el documentation,

Nota: controles que muestran el uso de texto o bien la propiedad Caption o la propiedad de texto para especificar el valor de texto. La propiedad que se usa depende del tipo de control. En general, Caption se utiliza para el texto que aparece como título o etiqueta de ventana, mientras que Text se utiliza para el texto que aparece como el contenido de un control.

+3

No hay 'FText', es' WM_GETTEXT', +1 –

+0

O 'WM_SETTEXT' como un setter para esas propiedades. + 1ed, fuiste más rápido;) – TLama

+0

@David: En realidad, * hay * un 'FText'. Eche un vistazo a 'SetText'. (Pero aún así, tienes razón. La parte principal parece estar basada en estos mensajes). –

1

Ambos están derivan de la clase de control y las dos propiedades de acceso a través del mismo valor se reunieron

Cuestiones relacionadas