OS:Windows8
開発ツール:Delphi XE4(トライアル版)
HTと申します。
TOSVersionのフィールドとメソッドをコードで列挙する方法
を教えていたけますでしょうか。
過去ログでは、レコードの中のフィールドの数を求める方法は
ありましが、今回の事例はありませんでした。
よろしくお願い致します。
コンパイルすれば失われる情報ですので
TOSVersionにかぎらず普通そういう方法はないかと思います。
参照元は
https://www.petitmonte.com/bbs/answers?question_id=7793
ですかね?
http://docwiki.embarcadero.com/Libraries/XE4/ja/System.SysUtils.TOSVersion
XE4 であれば、RTTI で取れると思います。
[RTTI の操作 (DocWiki)]
http://docwiki.embarcadero.com/RADStudio/XE4/ja/RTTI_%E3%81%AE%E6%93%8D%E4%BD%9C%EF%BC%9A%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9
> 取れると思います。
取れますけど、HT さんの目的に使えるかと言えば...?
uses
...Rtti, TypInfo;
procedure TForm1.Button1Click(Sender: TObject);
var
Context: TRttiContext;
Fields: TArray<TRttiField>;
Methods: TArray<TRttiMethod>;
Field: TRttiField;
Method: TRttiMethod;
begin
Memo1.Lines.Clear;
Context := TRttiContext.Create;
// フィールド名を列挙
Memo1.Lines.Add('[Fields]');
Fields := Context.GetType(TypeInfo(TOSVersion)).GetFields;
for Field in Fields do
Memo1.Lines.Add(Field.Name);
Memo1.Lines.Add('');
// メソッド名を列挙
Memo1.Lines.Add('[Methods]');
Methods := Context.GetType(TypeInfo(TOSVersion)).GetMethods;
for Method in Methods do
Memo1.Lines.Add(Method.Name);
end;
monaa様、DEKO様
ご回答ありがとうございます。
DEKO様のコードを実行させていただいた結果
以下のようになりました。(Memo1の内容です)
[Fields]
[Methods]
Check
Check
Check
ToString
私の環境ではうまく取得出来ませんでした。
ネット上のサンプルで、TButtonのメソッドやプロパティを
列挙するものがありました。その内のプロパティを列挙する
コードは以下のもので、うまく動きました。
procedure TForm1.Button2Click(Sender: TObject);
var
LContext: TRttiContext;
LType: TRttiType;
LProperty: TRttiProperty;
begin
LContext := TRttiContext.Create;
LType := LContext.GetType(TypeInfo(TButton));
for LProperty in LType.GetProperties do
begin
Memo1.Lines.add(LProperty.ToString);
end;
end;
このコードとDEKOさんのコードを参考にいろいろやりましたが
うまくいきませんでした。さらに調べてやってみます。
>ネット上のサンプルで、TButtonのメソッドやプロパティを列挙するものがありました。
どこですか? 出典は隠す必要がある場合を除き、必ず明らかにすべきかと。その方が話が早い。
(monaaさんからも過去ログの参照元を訊かれていますよ。)
TRttiType.GetMethodsとTRttiType.GetPropertiesのコードサンプルとして記載されてる、これですか?
Rtti.TRttiType (Delphi) - RAD Studio Code Examples
http://docwiki.embarcadero.com/CodeExamples/XE4/en/Rtti.TRttiType_(Delphi)
>このコードとDEKOさんのコードを参考にいろいろやりましたがうまくいきませんでした。
上記のコードサンプルはちゃんと動いたけど、TOSVersionではダメだったということですか? どのようにダメ?
(私はXE4とか無いので試してませんが、、、。)
というか、なぜ「TOSVersionのフィールドとメソッドをコードで列挙」したいのだろう。。。。
差し支えなければ教えてください。
う、、、この掲示板にリンクを正しく認識してもらえなかったので再掲。
Rtti.TRttiType (Delphi) - RAD Studio Code Examples
http://docwiki.embarcadero.com/CodeExamples/XE4/en/Rtti.TRttiType_%28Delphi%29
> TOSVersionではダメだったということですか? どのようにダメ?
TOSVersion はレコードなのでプロパティは取れません。
[構造化型の情報 (DocWiki)]
http://docwiki.embarcadero.com/RADStudio/ja/%E6%A7%8B%E9%80%A0%E5%8C%96%E5%9E%8B%E3%81%AE%E6%83%85%E5%A0%B1
"フィールドとメソッド" と書いてあったので RTTI を紹介しましたが、
後になって「HT さんの(本来の)ご希望に副えるのかな?コレ?」と思ったのです。
[System.SysUtils.TOSVersion (DocWiki)]
http://docwiki.embarcadero.com/Libraries/ja/System.SysUtils.TOSVersion
> うまくいきませんでした。
との事だったので、プロパティも取りたかったのかな?と。
>TOSVersion はレコードなのでプロパティは取れません。
なるほどー。そういうことだったんですね。
でも、ここの表は一見すると矛盾してるような気が。
レコード型について、上の小さい表ではメソッドをサポートしてるとありますが、下の大きな表ではありませんね。
「主要なメソッドおよびプロパティ」だから、これ以外にもあるのかな?
http://docwiki.embarcadero.com/RADStudio/XE4/ja/%E6%A7%8B%E9%80%A0%E5%8C%96%E5%9E%8B%E3%81%AE%E6%83%85%E5%A0%B1#.E3.82.AF.E3.83.A9.E3.82.B9.E3.80.81.E3.82.A4.E3.83.B3.E3.82.BF.E3.83.BC.E3.83.95.E3.82.A7.E3.82.A4.E3.82.B9.E3.80.81.E3.83.AC.E3.82.B3.E3.83.BC.E3.83.89
> でも、ここの表は一見すると矛盾してるような気が。
確かに (^^)
「クラスのメンバは RTTI で大抵取れるけどレコードは限定的だよ」
というのだけ頭に入れておけばいいのかもしれませんね。
RTTI を使ったクラス/レコード操作というと、EasyLINQ とかがあります。
http://ht-deko.minim.ne.jp/ft1302.html#130210
Harry様、DEKO様
ご回答ありがとうございます。
Harry様
Tbuttonのサンプルは、仰るとおり下記からです。
http://docwiki.embarcadero.com/CodeExamples/XE4/en/Rtti.TRttiType_%28Delphi%29
上記を参考にMemo1に書き出すようにしました。
なぜ「TOSVersionのフィールドとメソッドをコードで列挙」したいのだろう
やりたかったことは、StringGridに
項目 値
フィールド名 その値
・・・ ・・・
というふうにかきたいということです。フィールド名が取得できればその
値も取得できるだろうと思いました。
出典の件及び正確に書いていなかった件について、申し訳ありませんでした。
DEKO様
TOSVersionではダメだったということですか? どのようにダメ?
DEKO様のサンプルで
Fields := Context.GetType(TypeInfo(TOSVersion)).GetFields;
for Field in Fields do //ここにBPを張る
でブレークするとFieldsが [nil]になっていました。
同様に
Methods := Context.GetType(TypeInfo(TOSVersion)).GetMethods;
for Method in Methods do //ここにBPを張る
でブレークするとMethodsが [nil]になっていました。
ほしいのは"プロパティ"でした。書き方が悪く申し訳ありませんでした。
教えていただいたURLのページを見て、プロパティは取得できないと
いうことなので、これで解決とさせていただきます。
ありがとうございました。
DEKOさん
RTTI初めて知りました。
本家の解説を見てもどんな側面で使う用途がいまいちピンときませんが、
凄い機能がついているんですね。
> 凄い機能がついているんですね。
上に書いてある EasyLINQ とか、JavaScript Engine for Delphi とかが RTTI を積極的に利用しています。
[Javascript engine for delphi based on spidermonkey]
http://ht-deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewtopic&t=1258