문제

저는 델파이 전문가를 쓰고 있습니다. 나는 대상인 속성에 속성에 값을 쓸 수 있어야합니다. 예를 들어 양식에 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을 사용해 보셨습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top