دلفي 2010: نيو RTTI، وتحديد قيمة العقار إلى قيمة التعسفية

StackOverflow https://stackoverflow.com/questions/1603427

  •  05-07-2019
  •  | 
  •  

سؤال

وTRTTIProperty.SetValue () يأخذ مثيل TValue، ولكن إذا كان قائما على سبيل المثال TValue تقدم على نوع مختلف ثم الممتلكات، وأشياء تنفجر.

ومنها مثلا.

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:

والبعض منكم يتساءل لماذا أريد أن تعيين عدد صحيح إلى سلسلة، وسأحاول أن أشرح. (في الواقع، فإنه على الأرجح أنني أريد أن تعيين سلسلة إلى عدد صحيح، ولكن هذا ليس ذي صلة ...)

ما أحاول تحقيقه، هو جعل "رجل الأوسط 'عام بين واجهة المستخدم الرسومية ونموذج. أريد أن ربط بطريقة أو بأخرى حقل برنامج TextEdit إلى خاصية. بدلا من اتخاذ مثل هذا رجل في منتصف لكل نموذج التي لدي، وكنت آمل أن الشيء الجديد RTTI / TValue ستعمل بعض السحر بالنسبة لي.

وأنا أيضا جديدة على الأدوية، لذلك أنا غير متأكد من كيفية الأدوية يمكن أن يساعد. هل من الممكن مثيل عام في وقت التشغيل مع نوع قرر حيوي، أو القيام على ضرورة ترجمة إلى تعلم؟

ومنها مثلا.

TMyGeneric<T> = class
end;

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

وربما سن السحر ديه لم يأت بعد ... واعتقد انني يمكن إدارة مع اثنين من الهياكل قضية كبيرة ...

هل كانت مفيدة؟

المحلول

وTValue ليس متغير. يمكنك أن تقرأ فقط نوع البيانات التي "أنت" وضعت فيه.

وTValue.Cast لا يعمل لأنه يحتوي على نفس الدلالات التي يلقي نوع الضمني لها. لا يمكنك تعيين عدد صحيح إلى سلسلة أو العكس بالعكس. ولكن يمكنك تعيين عدد صحيح إلى عدد عشري، أو يمكنك تعيين عدد صحيح إلى int64.

نصائح أخرى

لا يمكن تحاول ذلك الآن، ولكن أنا قد كتبت:

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

والمحاولة

وprop.SetValue(obj, value.ToString)

ولكن بالنسبة لي هو نفس السؤال بالنسبة لفرانسوا. لماذا تريد أن تعيين الخاصية بقيمة نوع البيانات الخطأ؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top