ども、Norimakiです。
この前、
メソッド名(文字列)でメソッドを呼び出す方法
http://usefultoolers.com/archives/80.html
というものをご紹介しましたが、今回はプロパティを文字列で操作する。
という方法をご紹介します。
これまたなんの役に立つのか?
という気もするかもしれませんが、僕はアプリケーション起動の際に
前回起動した設定を復帰させるために使用しています。
コンポーネントとプロパティ名を指定してコンポーネントの
プロパティを取得し、それを元に設定値をファイルに書き込む。
みたいな。
AddProperty(Component,’PropertyName‘);
という感じで使用しています。
文字列でプロパティを設定するので、関数が一つで良いという事になります。
プロパティの型ごとに関数を用意するならばoverloadなんかでたくさん用意するとか
しなければいけないかもしれません。
もっといい方法があるかもしれませんが、僕の頭ではこれが精一杯。
これが良いことかそうでないかは分かりませんが、
運用していく上で面倒がない。ということで使用しています。
この他の使用法で言うと、メソッドの時にも書きましたが、
スクリプトから本体ツール内のコンポーネントの操作ができる。
という事がメリットだったりします。
ということでソースです。
かなり前に取得したもので、どこから取得したものかは覚えていなかったりします。
開発者の方ありがとうございます。
一部端折っていますので、必要に応じて書き換えてください。
このままでは動かないかと思います。
uses に TypInfo か何かが必要だったかと。
【プロパティ取得】
function NP_GetPropVal(OB:TObject;PropName:string;Param:string=''):string; var p:PPropInfo; Nm:string; begin Result:=''; p:=GetPropInfo(ob,PropName); if not Assigned(p) then exit; Nm:=p^.PropType^.Name; case p^.PropType^.Kind of tkInteger :Result:=IntToStr(GetOrdProp(ob,PropName)); tkEnumeration:Result:=GetEnumProp(ob,PropName); tkString, tkLString, tkUString :Result:=GetStrProp(ob,PropName); tkFloat :Result:=FloatToStr(GetFloatProp(ob,PropName)); tkClass :Result:=GetClassData(Nm,Param); //クラスの場合の個別処理 end; end;
string型で返ってきます。
【プロパティ設定】
procedure NP_SetPropVal(OB:TObject;PropName,PropParam,PropData:string); var p:PPropInfo; Nm:string; begin p:=GetPropInfo(ob,PropName); if not Assigned(p) then exit; Nm:=p^.PropType^.Name; case p^.PropType^.Kind of tkInteger :SetOrdProp(ob,PropName,StrToIntDef(PropData,0)); tkEnumeration:begin if PropData='' then PropData:='False'; try SetEnumProp (ob,PropName,PropData); except end; end; tkString, tkLString, tkUString :SetStrProp (ob,PropName,PropData); tkFloat :SetFloatProp(ob,PropName,StrToFloatDef(PropData,0)); tkClass :SetClassData(Nm,PropParam); //クラスの場合の個別処理 end; end;
tkEnumerationの部分で、何気にすべての例外をトラップしてますが(汗)。
とりあえず、こんな感じで動くかなと。設定データは文字列で与えます。
クラスについては、色々と処理しなければいけないものがあるので、
クラス名(Nm)で判断して、個々のクラス毎に処理関数を用意して対応すると。
上記のプロパティ設定では SetClassData という関数がありますが、
クラスの場合はそれを呼んで、その中でクラスに応じて分岐すると。
そういう感じで使います。
現時点ではそうしています。
とりあえずはそんな感じです。
ではでは。
Norimakiでした。