سؤال

أنا أكتب دلفي الخبراء.أنا بحاجة إلى أن تكون قادرة على كتابة قيمة العقار على العقار مما هو كائن.E. g.لدي مربع المجموعة على شكل وأريد أن تحرير الهوامش.ترك الممتلكات.أنا باستخدام الإجراء التالي للقيام بذلك ولكن إذا كان يعطي مركبات على خط ملحوظ.

يأخذ الإجراء مكون من (الملكية محرر) اسم الخاصية (على سبيل المثال 'الهوامش.ترك') و القيمة الجديدة ، يوزع العقار اسم جلب كائن يقرأ القيمة الحالية ومحاولات تغيير إذا المختلفة.ثم يدعو طريقة تسجيل أية تغييرات.

procedure EditIntegerSubProperty(Component: IOTAComponent;const PropName: String;NewValue: Integer);
var AnObject: TObject;
  TK: TTypeKind;
  At: Integer;
  AClassName, APropName: String;
  PropInfo: PPropInfo;
  OldValue: Integer;
begin
  At := Pos('.', PropName);
  if At < 1 then
  raise Exception.Create('Invalid SubProperty Name: '+PropName);

  AClassName := Copy(PropName, 1, At-1);
  APropName := Copy(PropName, At+1, length(PropName));

  TK := Component.GetPropTypeByName(AClassName);
  if TK <> tkClass then
    EXIT;

  AnObject := GetObjectProp((Component as INTAComponent).GetComponent, AClassName);
  if PropIsType(AnObject, APropName, tkInteger) then
  begin
    OldValue := GetInt64Prop(AnObject, APropName);
    if OldValue <> NewValue then
    begin
      SetInt64Prop(AnObject, APropName, NewValue);  <----AV HERE
      ChangeLogInteger(Name, PropName, OldValue, NewValue);
    end;
  end;
end;
هل كانت مفيدة؟

المحلول

الهوامش.xyzzy كل عدد صحيح خصائص لا Int64 خصائص لذلك تحتاج إلى استخدام GetOrdProp/SetOrdProp لقراءة وتعديل عليها.

SetInt64Prop يفترض انها 64 بت الملكية ، ويحاول الاتصال بمكان الإقامة اضع تعمل مع 64 بت المعلمة.كما المنشأة اضع يتوقع 32 بت المعلمة أنه فشل في تنظيف المكدس بشكل صحيح وبالتالي يسبب AV على العودة.

يمكنك معرفة أي وظائف الاتصال وفقا PropIsType الاتصال.

  • tkInt64 :الحصول على/SetInt64Prop
  • tkInteger:الحصول على/SetOrdProp

الحصول على/SetOrdProp وظائف يمكن أن تستخدم أيضا للحصول على شار و WideChar الخصائص التي أعتقد هو السبب اسم ليس 100% واضح.

نصائح أخرى

هل حاولت استخدام GetOrdProp, SetOrdProp بدلا من GetInt64Prop, SetInt64Prop?

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