2009-10-21 6 views
4

TRTTIProperty.SetValue()는 TValue 인스턴스를 사용하지만 제공된 TValue 인스턴스가 속성과 다른 유형을 기반으로하는 경우 속성이 파열됩니다.Delphi 2010 : 임의의 값으로 속성 값을 설정하는 새 RTTI

예.

TMyObject = class 
published 
    property StringValue: string read FStringValue write FStringValue; 
end; 

procedure SetProperty(obj: TMyObject); 
var 
    context: TRTTIContext; 
    rtti: TRTTIType; 
    prop: TRTTIProperty; 
    value: TValue; 
begin 
    context := TRTTIContext.Create; 
    rtti := context.GetType(TMyObject); 
    prop := rtti.GetProperty('StringValue'); 
    value := 1000; 
    prop.SetValue(obj, value); 
end; 

값을 문자열로 변환하려고하면 아무 것도 작동하지 않습니다.

prop.SetValue(obj, value.AsString); 
prop.SetValue(obj, value.Cast(prop.PropertyType.Handle)); 

어떻게 해결할 수 있습니까?

UPDATE :

내가 문자열로 정수를 지정하려는 이유 중 일부는 궁금해, 내가 설명하려고합니다. (실제로는 정수에 문자열을 할당 할 가능성이 높습니다.하지만 관련성이 없습니다 ...)

내가 달성하려고 시도하는 것은 일반 '중간 남자'를 만드는 것입니다. gui 및 모델. 어떻게 든 textedit 필드를 속성에 연결하려고합니다. 내가 가진 각 모델에 대해 그런 중간 남자를 만드는 대신, 나는 새로운 RTTI/TValue가 나에게 마법을 부릴 수 있기를 희망했다.

나는 제네릭을 처음 사용하기 때문에 generics가 어떻게 도움이되었는지 확신 할 수 없습니다. 동적으로 결정된 유형으로 런타임시 제네릭을 인스턴스화 할 수 있습니까? 아니면 컴파일시 알아야합니까?

예.

TMyGeneric<T> = class 
end; 

procedure DoSomething(); 
begin 
    prop := rtti.getProperty('StringValue'); 
    mygen := TMyGeneric<prop.PropertyType>.Create; 
    //or 
    mygen := TMyGeneric<someModel.Class>.Create; 
end; 

아마 마법의 나이는 아직

+0

"해결 된"경우 어떻게 될 것으로 예상됩니까? 정수는 문자열이 아니므로 문자열 형식의 속성에 정수를 저장하려고하면 어떤 일이 발생해야합니까? "상황이 날아간다"는 나에게 꽤 합리적이라고 들린다. –

+0

그는 Andreas가 대답 한 것처럼 '1000'값이 포함될 것으로 예상합니다. –

+0

내가 무엇을하려고하는지에 대한 정보를 추가했습니다. 내가 많이 기대하고있는 것 같아. – Vegar

답변

5

TValue는 변종이 아닙니다. "당신"이 넣은 데이터 유형 만 읽을 수 있습니다.

TValue.Cast는 암시 적 형식 캐스트와 동일한 의미를 갖고 있기 때문에 작동하지 않습니다. 문자열에 정수를 할당하거나 그 반대로 정수를 할당 할 수 없습니다. 그러나 float에 정수를 할당하거나 int64에 정수를 할당 할 수 있습니다.

0

지금 그것을 시도 할 수 없습니다 ... 나는 큰 경우 구조의 부부와 함께 관리 할 수있는 것 같아요 ... 올있다,하지만 난 것이다 서면 :

value := '1000'; 
    prop.SetValue(obj, value); 
0

prop.SetValue(obj, value.ToString)

을 시도하지만 나를 위해 그것은 프랑수아 경우와 같은 질문이다. 잘못된 데이터 유형의 값으로 속성을 설정하려는 이유는 무엇입니까?

관련 문제