2013-12-13 1 views
4

한 쌍의 구성 요소가 있는데 구성 요소 중 하나가 속성을 설정하여 다른 구성 요소에 "연결"됩니다. 예를 들어 ... 조건부로 DFM에 속성 저장 여부를 설정 하시겠습니까?

type 
    TMain = class(TComponent) 
    ... 
    published 
    property Default: Integer read FDefault write SetDefault; 
    end; 

    TSub = class(TComponent) 
    ... 
    published 
    property Value: Integer read GetValue write SetValue; 
    property Main: TMain read FMain write SetMain; 
    end; 

그래서 TSub에 대한 개체 관리자에서 사용자는 TMain이 그것과 관련이있는 것으로 선택할 것 것입니다.

하위 구성 요소에는 getter와 setter가 모두 포함 된 Value 속성이 있습니다. 부 성분의 값 0로 설정되는 경우, 상기 게터는 그것이 부착 년대 TMain에서 Default 속성 ... 취득 오브젝트 관리자 (따라서 속성 자체)를 만든다

function TSub.GetValue: Integer; 
begin 
    if FValue = 0 then begin 
    if Assigned(FMain) then begin 
     Result:= FMain.Default; 
    end else begin 
     Result:= 0; 
    end; 
    end else begin 
    Result:= FValue; 
    end; 
end; 

기본 0 값보다는 기본 값을 반환하십시오.

내가 무엇을하고 싶은지 TSub 구성 요소의 속성이 DFM에 저장되면 0 인 경우이 속성을 저장하지 않는다는 점에 유의해야합니다. 따라서 기본 설정 대신 기본 설정을 사용하십시오. 현재 DFM을 저장 한 후 기본 값에서 나온 값이 하위 값에 저장됩니다. 이는 원하는 값이 아닙니다.

당연히 속성은 으로 표시됩니다. 예를 들어 속성 ​​값이 0으로 설정된 경우 해당 속성은 DFM에 저장되지 않습니다. 그러나 기본값이 달라질 수 있으므로이 속성에 대한 기본값을 플래그 할 수있는 방법이 없습니다 (기본값이 정의되기를 기대하기 때문에).

어떻게이 프로퍼티 게터의 주에서 기본값을 사용하는 대신 0로 설정되어있어 경우 DFM이 속성을 저장 하지TSub 구성 요소를 구성 할 수 있습니까?

function TSub.IsValueStored: Boolean; 
begin 
    Result := (FValue <> 0) or (FMain = nil); 
end; 

내가 바로 그것을 얻을 경우

+0

http://docwiki.embarcadero.com/RADStudio/en/Properties#Storage_Specifiers –

답변

7
property Value: Integer read GetValue write SetValue stored IsValueStored; 

.

+0

매우 멋지고 멋진 와우는 시도해 보겠습니다 .-) –

+0

@Jerry - Thanks. [documentation] (http://docwiki.embarcadero.com/RADStudio/XE5/en/Properties#Storage_Specifiers)를 반드시 확인하십시오. –

+0

정확히 내가 필요로하는 것처럼 작동합니다. 다시 한 번 감사드립니다. Sertac –