Delphi OTA和RTTI错误

Delphi OTA和RTTI错误,delphi,plugins,rtti,Delphi,Plugins,Rtti,我正在写一篇德尔菲专家论文。我需要能够将值写入作为对象的属性上的属性。例如,我在表单上有一个GroupBox,我想编辑边距。Left属性。我使用下面的程序来做这件事,但如果在标记线上给出AV 该过程从(属性编辑器)中获取一个组件、属性名称(例如“Margins.Left”)和新值,解析出属性名称,获取对象,读取当前值,并尝试更改它(如果不同)。然后它调用一个方法来记录任何更改 procedure EditIntegerSubProperty(Component: IOTAComponent;co

我正在写一篇德尔菲专家论文。我需要能够将值写入作为对象的属性上的属性。例如,我在表单上有一个GroupBox,我想编辑边距。Left属性。我使用下面的程序来做这件事,但如果在标记线上给出AV

该过程从(属性编辑器)中获取一个组件、属性名称(例如“Margins.Left”)和新值,解析出属性名称,获取对象,读取当前值,并尝试更改它(如果不同)。然后它调用一个方法来记录任何更改

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;
procedure-EditIntegerSubProperty(组件:IOTAComponent;常量PropName:String;NewValue:Integer);
变量对象:TObject;
TK:TTypeKind;
At:整数;
AClassName,APropName:字符串;
PropInfo:PPropInfo;
OldValue:整数;
开始
At:=位置('.',名称);
如果At<1,则
引发异常。创建('无效的子属性名称:'+PropName');
AClassName:=副本(PropName,1,At-1);
APropName:=副本(PropName,At+1,长度(PropName));
TK:=Component.GetPropTypeByName(AClassName);
如果TK tkClass那么
出口
AnObject:=GetObjectProp((组件为INTAComponent)。GetComponent,AClassName);
如果是PropIsType(一个对象,一个名称,tkInteger),那么
开始
OldValue:=GetInt64Prop(对象,APropName);
如果OldValue NewValue,则
开始

SetInt64Prop(一个对象,一个名称,一个新值) 您是否尝试使用GetOrdProp、SetOrdProp而不是GetInt64Prop、SetInt64Prop?

Margins.xyzy都是整数属性,而不是Int64属性,因此您需要使用GetOrdProp/SetOrdProp来读取和修改它们

SetInt64Prop假定它是64位属性,并尝试使用64位参数调用属性setter函数。由于属性设置程序需要32位参数,因此无法正确清理堆栈,从而导致AV返回

您可以根据PropIsType调用来判断要调用哪些函数

  • tkInt64:Get/SetInt64Prop
  • tkInteger:Get/SetOrdProp
Get/SetOrdProp函数也可以用于Char和WideChar属性,我想这就是为什么名称不是100%明显的原因