2011-08-04 5 views
8

Tengo una clase de componente sencillo con propiedad booleana:clase de conjunto booleano true da falsa en tiempo de ejecución

TmyClass = class(TComponent) 
    private 
     fSomeProperty: boolean; 
    published 
     property SomeProperty: boolean 
        read fSomeProperty 
        write fSomeProperty 
        default true; 

    end; 

lo puse en mi forma, ponemos a true (SomeProperty se establece en falso, ¿por qué?), Pero cuando intento acceder SomeProperty desde el tiempo de ejecución, me da falso. ¿Por qué es así?

Respuesta

15

Eso es porque el especificador default en realidad no asigna el valor a la propiedad, simplemente le dice al sistema de transmisión qué valor es el predeterminado (y por lo tanto no es necesario guardarlo). Aún debe inicializar el prop/campo en el constructor al valor predeterminado deseado. Esto está documentado en el help por cierto, lea la sección "Storage Specifiers"

+0

+1; No he encontrado nada útil en el especificador 'predeterminado' excepto que en el Inspector de Objetos cuando cambias el valor de alguna propiedad del' predeterminado', se resalta con la fuente en negrita; si lo cambia de nuevo a 'default' se elimina el estilo en negrita. –

+2

Como dijo @ain, lea la sección Especificadores de almacenamiento de la ayuda o DocWiki. Esto dice: 'Nota: Los valores de propiedad no se inicializan automáticamente al valor predeterminado. Es decir, la directiva predeterminada controla solo cuando los valores de propiedad se guardan en el archivo de formulario, pero no el valor inicial de la propiedad en una instancia recién creada. –

+2

Para solucionarlo, agregue el código de constructor 'FSomeProperty: = true' –

5

También debe establecer la propiedad en true en el constructor - de lo contrario es un error:

constructor TMyClass.Create(AOwner: TComponent); 
begin 
    inherited; 
    FSomeProperty:= True; 
    ... 
end; 

Los valores por defecto determinar cuáles serán almacenados en el archivo * .DFM. Si configura FSomeProperty a True en el momento del diseño, y el valor predeterminado para FSomeProperty es True, entonces FSomeProperty no se almacenará en * .DFM.

Si no inicializar FSomeProperty a True en el constructor obtiene un error que describes - FSomeProperty aparece False en tiempo de ejecución, a pesar de que se estableció True en tiempo de diseño.

Cuestiones relacionadas