3

私は 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;
4

2 に答える 2

3

Margins.xyzzy はすべて Integer プロパティであり、Int64 プロパティではないため、GetOrdProp/SetOrdProp を使用して読み取りと変更を行う必要があります。

SetInt64Prop は、それが 64 ビット プロパティであると想定し、64 ビット パラメーターを指定してプロパティ セッター関数を呼び出そうとします。プロパティ セッターは 32 ビット パラメーターを想定しているため、スタックを適切にクリーンアップできず、戻り時に AV が発生します。

PropIsType 呼び出しに従って、呼び出す関数を指定できます。

  • tkInt64 : Get/SetInt64Prop
  • tkInteger: Get/SetOrdProp

Get/SetOrdProp 関数は、Char および WideChar プロパティにも使用できます。これが、名前が 100% 明らかではない理由だと思います。

于 2008-09-27T19:37:32.997 に答える
3

GetInt64Prop、SetInt64Prop の代わりに GetOrdProp、SetOrdProp を使用してみましたか?

于 2008-09-27T17:10:39.120 に答える