質問

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;
役に立ちましたか?

解決

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