Delphi OTA和RTTI的错误

3
我正在编写一个Delphi专家。我需要能够将值写入对象属性上的属性。例如,我在表单上有一个GroupBox并且我想编辑Margins.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;
2个回答

3

你是否尝试使用 GetOrdProp、SetOrdProp 代替 GetInt64Prop、SetInt64Prop?


3
Margins.xyzzy是所有整数属性,而不是Int64属性,因此您需要使用GetOrdProp/SetOrdProp来读取和修改它们。
SetInt64Prop假定它是一个64位属性,并尝试调用具有64位参数的属性设置器函数。由于属性设置器期望32位参数,它无法正确清理堆栈,从而在返回时导致AV错误。
您可以根据PropIsType调用哪些函数。
- tkInt64:Get/SetInt64Prop - tkInteger:Get/SetOrdProp Get/SetOrdProp函数也可用于Char和WideChar属性,这也是名称不完全明显的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接