문제
저는 델파이 전문가를 쓰고 있습니다. 나는 대상인 속성에 속성에 값을 쓸 수 있어야합니다. 예를 들어 양식에 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;
해결책
margins.xyzzy는 int64 속성이 아닌 모든 정수 속성이므로 getordprop/setordprop을 사용하여 읽고 수정해야합니다.
SetInt64prop은 64 비트 속성이라고 가정하고 64 비트 매개 변수로 속성 세터 기능을 호출하려고합니다. 속성 세터가 32 비트 매개 변수를 기대함에 따라 스택을 올바르게 정리하지 못하므로 AV가 반환됩니다.
Propistype 호출에 따라 호출 할 기능을 알 수 있습니다.
- tkint64 : get/setint64prop
- tkinteger : get/setordprop
get/setordprop 함수는 Char 및 WideChar 속성에도 사용될 수 있습니다. 이는 이름이 100% 명백하지 않은 이유입니다.
다른 팁
getInt64prop, setInt64prop 대신 getordProp, setordProp을 사용해 보셨습니까?
제휴하지 않습니다 StackOverflow