سؤال
أنا أكتب دلفي الخبراء.أنا بحاجة إلى أن تكون قادرة على كتابة قيمة العقار على العقار مما هو كائن.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?