文字列でプロパティを操作する方法

ども、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でした。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする