TOSVersionのフィールドとメソッドを列挙するには

解決


HT  2013-08-30 12:47:38  No: 45176  IP: 192.*.*.*

OS:Windows8
開発ツール:Delphi XE4(トライアル版)

HTと申します。
TOSVersionのフィールドとメソッドをコードで列挙する方法
を教えていたけますでしょうか。
過去ログでは、レコードの中のフィールドの数を求める方法は
ありましが、今回の事例はありませんでした。
よろしくお願い致します。

編集 削除
monaa  2013-08-30 13:45:27  No: 45177  IP: 192.*.*.*

コンパイルすれば失われる情報ですので
TOSVersionにかぎらず普通そういう方法はないかと思います。

参照元は
https://www.petitmonte.com/bbs/answers?question_id=7793
ですかね?

http://docwiki.embarcadero.com/Libraries/XE4/ja/System.SysUtils.TOSVersion

編集 削除
DEKO  2013-08-30 14:04:17  No: 45178  IP: 192.*.*.*

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

編集 削除
DEKO  2013-08-30 14:30:36  No: 45179  IP: 192.*.*.*

> 取れると思います。

取れますけど、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;

編集 削除
HT  2013-08-30 17:13:57  No: 45180  IP: 192.*.*.*

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さんのコードを参考にいろいろやりましたが
うまくいきませんでした。さらに調べてやってみます。

編集 削除
Harry  2013-08-30 23:17:52  No: 45181  IP: 192.*.*.*

>ネット上のサンプルで、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のフィールドとメソッドをコードで列挙」したいのだろう。。。。
差し支えなければ教えてください。

編集 削除
Harry  2013-08-30 23:25:50  No: 45182  IP: 192.*.*.*

う、、、この掲示板にリンクを正しく認識してもらえなかったので再掲。

Rtti.TRttiType (Delphi) - RAD Studio Code Examples
http://docwiki.embarcadero.com/CodeExamples/XE4/en/Rtti.TRttiType_%28Delphi%29

編集 削除
DEKO  2013-08-30 23:38:48  No: 45183  IP: 192.*.*.*

> 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

> うまくいきませんでした。
との事だったので、プロパティも取りたかったのかな?と。

編集 削除
Harry  2013-08-31 08:17:39  No: 45184  IP: 192.*.*.*

>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

編集 削除
DEKO  2013-08-31 11:36:02  No: 45185  IP: 192.*.*.*

> でも、ここの表は一見すると矛盾してるような気が。
確かに (^^)

「クラスのメンバは RTTI で大抵取れるけどレコードは限定的だよ」
というのだけ頭に入れておけばいいのかもしれませんね。

RTTI を使ったクラス/レコード操作というと、EasyLINQ とかがあります。
http://ht-deko.minim.ne.jp/ft1302.html#130210

編集 削除
HT  2013-08-31 12:21:28  No: 45186  IP: 192.*.*.*

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のページを見て、プロパティは取得できないと
  いうことなので、これで解決とさせていただきます。
  ありがとうございました。

編集 削除
monaa  2013-09-02 11:05:24  No: 45187  IP: 192.*.*.*

DEKOさん
RTTI初めて知りました。
本家の解説を見てもどんな側面で使う用途がいまいちピンときませんが、
凄い機能がついているんですね。

編集 削除
DEKO  2013-09-02 11:43:45  No: 45188  IP: 192.*.*.*

> 凄い機能がついているんですね。
上に書いてある EasyLINQ とか、JavaScript Engine for Delphi とかが RTTI を積極的に利用しています。

[Javascript engine for delphi based on spidermonkey]
http://ht-deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewtopic&t=1258

編集 削除