我正在写一Delphi专家。我需要能够编写一个值的财产上的财产,这是一个对象。E.g。我有一个组框在形式,我需要编辑的利润。离开酒店。我用以下程序做到这一点,但如果提供了一个AV上的标记线。

该过程需要一个部件从(酒店编辑)的酒店的名字(例如'利润。左')和新的价值,分析了财产的姓名,获取的对象,读目前的价值,并试图改变它,如果不同。然后,它呼吁的方法,以记录任何更改。

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:Get/SetInt64Prop
  • tkInteger:Get/SetOrdProp

Get/SetOrdProp的功能还可以用于炭和WideChar性,这是我的猜测是为什么名字是不是100%显而易见的。

其他提示

您是否尝试使用GetOrdProp,SetOrdProp而不是GetInt64Prop,SetInt64Prop?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top