2017-04-13 24 views
5

Bir varsayılan değer ayarlamak istediğim Variant özelliğine sahip bir bileşen yazdım.Bir Varyant özelliğinin varsayılan değeri olabilir mi?

E2026 sabit deyim herhangi neden olmaz bir Boolean özelliği ile aynı şeyi yapmak

beklenen:

TMyComponent = class(TComponent) 
private 
    FVariantValue : Variant; 
published 
    property VariantValue : Variant read FVariantValue write FVariantValue default False; 
end; 

derleme, ben VariantValue mülkiyet hattı üzerinde aşağıdaki hatayı alıyorum bir çeşit hata.

Birazcık documentation okudum, ancak Varyant özellikleri varsayılan değerleri hakkında bir şey bulamadım.

cevap

9

Burada dikkatli olun. default yönergesi, özelliğin değerini ayarlamak için hiçbir şey yapmaz. Yalnızca, değerin .dfm dosyasında açıkça kaydedilip kaydedilmediğini etkiler. Bir özellik için bir default değeri belirtirseniz, kurucunun destek alanını bu değere başlattığından emin olmanız gerekir.

Properties : Storage Specifiers bir bileşenin durumunu kaydetme

, bileşenin yayınlanan özelliklerinin depolama belirticilere kontrol edilir. Bir tesisin o andaki değerinin varsayılan değerden farklı ise ve saklanan belirteci sonra tesisin değeri kaydedilir, Gerçek (veya hiçbir varsayılan değer yoksa). Aksi takdirde, mülkün değeri kaydedilmez.

Not: Özellik değerleri otomatik olarak varsayılan değere başlatılmaz. Yani, varsayılan yönerge yalnızca özellik değerleri form dosyasına kaydedildiğinde denetler, ancak yeni oluşturulan örnekte özelliğin ilk değeri değil. sözleşmenin sizin parçası aslında bu değere destek alanını başlatmak sağlamaktır -

Bu .dfm açıkça bu değeri saklamak gerekmez bileşen akış sisteminde sadece bir ipucu.

bahsedilen
constructor TMyComponent.Create(AOwner: TComponent); 
begin 
    inherited Create(AOwner); 
    FVariantValue := False; 
end; 

, False bir boolean, bir varyant, bu nedenle Variant tip sabit bir ifade olarak kullanılamaz: başlatma bu tip yapmak için uygun bir yer bileşenin kurucu bulunmaktadır. Bir varyant karmaşık bir tür olduğundan, tek bir sabit olarak ifade edilemez ve bu nedenle, bir default özelliğine sahip olamaz.

Başına Remy, sen destek varyant False olduğunda varyant .dfm dosyasına kaydedilir emin olmak istiyorsanız varyant False bir boolean olarak değerlendirilirse zaman, sen False döndüren bir parametresiz yöntemi ile stored direktifini kullanabilirsiniz .Örneğin:

property VariantValue : Variant read FVariantValue write FVariantValue stored IsVariantValueStored; 

function TMyComponent.IsVariantValueStored : Boolean; 
begin 
    Result := not VarIsType(FVariantValue, varBoolean); 
    if not Result then 
    Result := FVariantValue; 
end; 
+4

DFM akışı amacıyla, Varyant bir Yanlış değer içerdiğinde, özelliğin DFM'de saklanmasını istemiyorsanız, 'saklı' ifadesinin bulunduğu 'varsayılan' belirteci yerine 'saklanan 'belirtecini kullanabilirsiniz. Varyant bir Yanlış değer içeriyorsa ve aksi halde True döndürürse False değerini döndüren parametresiz bir yönteme. –

+0

@RemyLebeau Çok zekice - OP'nin gerçekten istediği şeyden emin değilim, ancak bu örnekle güncelledim. –

4

Varyant özellikleri varsayılan değerlere sahip olamaz.

+3

Yanıtınız enogh değildir olamaz ayarlanır yapılacak en iyi şey varsayılan değerlere sahip olunuz lütfen nedenini açıklamaya çalışınız, bu mantıklı olacaktır. – Sami

+2

Çünkü tasarımcılar bu kararı aldı. Neden olduğunu söyleyemem. Sadece yapabilirler. –

1

söylediğin zaman, yapıcı içinde

FVariantValue := false; 

veya procedure AfterConstruction; override;

İlgili konular