3


0

私はDelphiのエキスパートを書いています。 オブジェクトであるプロパティ上のプロパティに値を書き込むことができる必要があります。 例えば。 フォーム上にGroupBoxがあり、Margins.Leftプロパティを編集したいです。 私はそれを行うために次の手順を使用していますが、マークされた行にAVを表示する場合。

このプロシージャは、(プロパティエディタ)からプロパティ名( 'Margins.Left’など)と新しい値を取り出し、プロパティ名を解析してオブジェクトを取得し、現在の値を読み取り、異なる場合は変更しようとします。 その後、メソッドを呼び出して変更を記録します。

procedure EditIntegerSubProperty(Component:IOTAComponent; const PropName:String; NewValue:Integer); var AnObject:TObject; TK:TTypeKind。で:整数。 AClassName、APropName:文字列。 PropInfo:PPropInfo; OldValue:整数。 = Pos( '。'、PropName);で開始します。 At <1の場合、Exception.Create( 'Invalid SubProperty Name:' PropName)を発生させます。

AClassName:= Copy(PropName、1、At-1); APropName:= Copy(PropName、At 1、length(PropName));

TK:= Component.GetPropTypeByName(AClassName); TK <> tkClassの場合はEXIT。

AnObject:= GetObjectProp((Component as INTAComponent).GetComponent、AClassName); PropIsType(AnObject、APropName、tkInteger)の場合はOldValue:= GetInt64Prop(AnObject、APropName)を開始します。 OldValue <> NewValueの場合はSetInt64Prop(AnObject、APropName、NewValue)を開始します。 <---- AVここでChangeLogInteger(名前、PropName、OldValue、NewValue);終わり;終わり;終わり;

2 Answer


3


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


3


Margins.xyzzyはすべてInt64プロパティではなくIntegerプロパティなので、それらを読み取って変更するにはGetOrdProp / SetOrdPropを使用する必要があります。

SetInt64Propはそれが64ビットプロパティであると仮定し、64ビットパラメータでプロパティ設定関数を呼び出そうとします。 プロパティセッターは32ビットのパラメータを期待しているため、スタックを正しくクリーンアップできず、AVが返されます。

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

  • tkInt64:Get / SetInt64Prop

  • tkInteger:Get / SetOrdProp

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