题
我正在写一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?
不隶属于 StackOverflow