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;
아마 마법의 나이는 아직
"해결 된"경우 어떻게 될 것으로 예상됩니까? 정수는 문자열이 아니므로 문자열 형식의 속성에 정수를 저장하려고하면 어떤 일이 발생해야합니까? "상황이 날아간다"는 나에게 꽤 합리적이라고 들린다. –
그는 Andreas가 대답 한 것처럼 '1000'값이 포함될 것으로 예상합니다. –
내가 무엇을하려고하는지에 대한 정보를 추가했습니다. 내가 많이 기대하고있는 것 같아. – Vegar