प्रश्न में here SetValue के साथ उपयोग करने के लिए एक संगत टीवील्यू बनाने के लिए एक विधि दिखाया गया है। मैं एक आईएनआई फ़ाइल में कक्षा को स्टोर करने के लिए आरटीटीआई का उपयोग करने के लिए इसका एक सामान्य संस्करण बनाने की कोशिश कर रहा हूं। यह मेरा कटौती कोड है:मैं गणना किए गए आरटीटीआई फ़ील्ड के लिए जेनेरिक टीवील्यू कैसे बना सकता हूं?
procedure TMyClass.LoadRTTI(xObject: TObject);
var
LContext: TRttiContext;
LClass: TRttiInstanceType;
xField : TRttiField;
szNewValue : String;
xValue : TValue;
begin
LContext := TRttiContext.Create;
LClass := LContext.GetType(xObject.ClassType) as TRttiInstanceType;
for xField in LClass.GetDeclaredFields do
begin
szNewValue := IniFile.ReadString(szSection, xField.Name, '');
if szNewValue <> '' then // emumerated will be '0' (zero) as that is what GetValue.AsString returns
begin
case xField.FieldType.TypeKind of
tkEnumeration: xValue := StrToIntDef(szNewValue, xField.GetValue(xObject).AsOrdinal);
end;
xField.SetValue(xObject, xValue); // FAILS HERE with 'Invalid calss typecast
end;
end;
end;
जवाब संदर्भित में, समाधान TValue.From() पद्धति का उपयोग करके मूल्य मिल गया था, लेकिन वह उचित प्रकार का एक चर की आवश्यकता प्रतीत होता है। मेरे पास ऐसा कोई प्रकार नहीं है क्योंकि मेरे कोड को यह नहीं पता कि यह क्या है।
मैं आरटीटीआई से एक स्ट्रिंग में मूल्य प्राप्त करने के लिए एक सामान्य तरीके का उदाहरण ढूंढ रहा हूं, और इसे बाद में वापस रखूंगा। मुझे एक अच्छा ट्यूटोरियल नहीं मिला है जो अभी तक इसे कवर करता है।
procedure TMyClass.LoadRTTI(xObject: TObject);
var
LContext: TRttiContext;
LClass: TRttiInstanceType;
xField : TRttiField;
szNewValue : String;
xValue : TValue;
begin
LContext := TRttiContext.Create;
LClass := LContext.GetType(xObject.ClassType) as TRttiInstanceType;
for xField in LClass.GetDeclaredFields do
begin
szNewValue := IniFile.ReadString(szSection, xField.Name, '');
if szNewValue <> '' then // emumerated will be '0' (zero) as that is what GetValue.AsString returns
begin
case xField.FieldType.TypeKind of
tkEnumeration:
begin
//get the instance to the TValue to set
xValue:=xField.GetValue(xObject);
//convert the data to a valid TValue
xValue:=TValue.FromOrdinal(xValue.TypeInfo,GetEnumValue(xValue.TypeInfo,szNewValue));
end;
end;
//assign the new value from the TValue
xField.SetValue(xObject, xValue);
end;
end;
end;
ठीक है, यह मेरे काम कोड में चालाक होने के बाद ठीक से काम करता है। आईएनआई में सहेजने के लिए मूल्य प्राप्त करने के लिए, बस xField.GetValue (xObject) का उपयोग करें। ToString; – mj2008