2017-04-13 8 views
5

기본값을 설정하고자하는 Variant 속성을 가진 구성 요소를 작성했습니다.Variant 속성은 기본값을 가질 수 있습니까?

E2026 상수 표현은 어떤을 유발하지 않는 Boolean 속성과 같은 일을하고

예상 :

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

컴파일에, 나는 VariantValue 속성 줄에 다음과 같은 오류가 종류의 오류.

나는 약간의 documentation을 읽었지 만, Variant 속성 기본값에 대해서는 아무것도 찾지 못했습니다.

답변

9

여기에주의하십시오. default 지시문은 속성 자체의 값을 설정하는 데 아무 것도하지 않습니다. 값이 .dfm 파일에 명시 적으로 저장되는지 여부에만 영향을줍니다. 속성에 default 값을 지정하면 생성자가 해당 값으로 백업 필드를 초기화하도록해야합니다.

Properties : Storage Specifiers 구성 요소의 상태를 저장

는 구성 요소의 게시 속성에 대한 저장소 지정자를 확인한다. 속성의 현재 값이 기본 값과 다른 경우와 저장 지정하고 속성 값이 저장되고, 진정한 없습니다 (또는 기본 값이있는 경우). 그렇지 않으면 속성 값이 저장되지 않습니다.

참고 : 속성 값은 기본값으로 자동 초기화되지 않습니다. 즉, 기본 지시문은 속성 값이 양식 파일에 저장되지만 새로 작성된 인스턴스에 대한 속성의 초기 값은 저장하지 않을 때만 제어합니다. 계약의 당신의 부분은 당신이 실제로 그 값으로 백업 필드를 초기화하도록하는 것입니다 -

이는 .dfm에 명시 적으로 값을 저장 할 필요가 없습니다 구성 요소 스트리밍 시스템에 다만 힌트입니다.

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

, False는 부울,하지 변형, 그래서 그것은 Variant 유형의 상수 표현식으로 사용할 수 없습니다 : 초기화 이런 종류의 작업을 수행 할 수있는 적절한 장소는 구성 요소의 생성자입니다. 변형은 복잡한 유형이므로 단일 상수로 표현 될 수 없으므로 default 속성을 가질 수 없습니다.

당 레미, 당신은 백업 변형이 False 때 변형이 .dfm 파일에 저장되지 않도록하려는 경우 변형이 False 부울로 평가 때 False를 반환하는 매개 변수가 메소드로 stored 지시어를 사용할 수 있습니다 .예를 들면 :

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 스트리밍의 목적으로 Variant에 False 값이 포함되어있을 때 속성을 DFM에 저장하지 않으려면'default' 지정자 대신'stored' 지정자를 사용할 수 있습니다. 여기서'stored'는 참조합니다 Variant에 False 값이 포함되어 있으면 False를 반환하고 그렇지 않으면 True를 반환하는 매개 변수없는 메서드에 전달합니다. –

+0

@RemyLebeau 매우 영리합니다. OP가 실제로 원하는 것이 확실하지 않지만,이 예제로 업데이트했습니다. –

4

변형 속성은 기본값을 가질 수 없습니다.

+3

당신의 대답은 enogh되지 수없는 설정 할 수있는 가장 좋은 것은 기본값을 가지고 계신다면 그 이유를 설명해주십시오. – Sami

+2

디자이너가 이러한 결정을 내 렸기 때문입니다. 나는 왜 그런지 말할 수 없다. 그들은 할 수 있습니다. –

1

당신이 말한 때, 생성자

FVariantValue := false; 

또는 procedure AfterConstruction; override;