コンポーネントのプロパティ情報をまとめて取得するには?

解決


でんし  2013-04-17 17:49:13  No: 44349

コンポーネントのプロパティ情報をまとめて取得する方法はありますか?

例えば、ボタンをフォームに貼り付けて、
dfmファイルの中身を見るとボタンのプロパティ情報が見れると思います。

pasファイル側でボタンのプロパティを制御する時は、
Button1.Enabled := False;
みたいに書くと思います。

実行中のある時点でのコンポーネントの状態をファイルに出力したいのですが、
pas側で各コンポーネントごとのプロパティを一括で取得する方法はないでしょうか?


take  2013-04-17 18:32:09  No: 44350

こういうことですか?
テキストエディタで入力したのでワーニングなどが出るかも

var
  SaveObj : TComponent;
  s : string;
begin
  // 書き込み処理
  // 保存したいコンポーネントを指定
  SaveObj := Button1;
  // ストリームクラス生成
  e := TMemoryStream.Create;
  try
    // クラスをストリーム化
    e.WriteComponent(FSaveObj);
    // ファイルに保存
    e.SaveToFile('test.bin');

    // 実験用として中身を見る
    s := BinToTextOut(e);
    Memo1.Lines.Text := s;
  finally
    e.Free;
  end;
 
  // 読み込み処理
  // 読み込みたいコンポーネントを指定
  SaveObj := Button1;
  e := TMemoryStream.Create;
  try
    // ファイルからストーリームに読み込む
    e.LoadFromFile('test.bin');
    // ストリームクラスからクラスの値として範囲
    e.ReadComponent(SaveObj);
  finally
    e.Free;
  end;


take  2013-04-17 22:27:45  No: 44351

FSaveObj→SaveObj

BinToTextOutの中身が抜けてた

function TForm1.BinToTextOut(m: TMemoryStream): string;
var
  StrStream: TStringStream;
  s: string;
begin
  StrStream := TStringStream.Create(s);
  try
    m.Seek(0, soFromBeginning);
    ObjectBinaryToText(m, StrStream);
    StrStream.Seek(0, soFromBeginning);
    Result:= StrStream.DataString;
  finally
    StrStream.Free;

  end;
end;


Mr.XRAY  URL  2013-04-18 00:09:17  No: 44352

>テキストエディタで入力したのでワーニングなどが出るかも

では,実際のサンプルとして.WriteComponent と ReadComponent を使う例です.
TFileStream になっていますが,TMemoryStream の方がいいと思います.
例えば,Button1 を扱う場合は,TestData を Button1 とします.

[130_オブジェクトの保存 ( クラス型の保存 ) ]
http://mrxray.on.coocan.jp/Delphi/plSamples/130_SaveComponent.htm

単に,プロパティの値を取得するだけなのであれば,
以下のように取得できます (備考 : オン書きではありません).
動作確認環境は,質問者と同じで「秘密」です.

//-------------------------------------------------------------
//  Button1の全プロパティの取得例
//  usesにRTTIが必要
//-------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
  C : TRttiContext;
  T : TRttiType;
  P : TRttiProperty;
  S : String;
begin
  T:= C.GetType(TButton);

  for P in T.GetProperties do begin
    try
      S := P.ToString;
      S := S + ' : ' + P.GetValue(Button1).ToString;
      Memo1.Lines.Add(S);
    except
    end;
  end;
end;


Mr.XRAY  URL  2013-04-18 00:14:41  No: 44353

>[130_オブジェクトの保存 ( クラス型の保存 ) ]
>http://mrxray.on.coocan.jp/Delphi/plSamples/130_SaveComponent.htm

これは,正確に言うと,コンポーネントのプロパティをファイルに出力したりするのではありません.
「コンポーネント」の状態をまるごと扱う場合です.注意してください.


でんし  2013-04-18 06:33:49  No: 44354

>> take さん
返信ありがとうございます。
記載の内容でやりたことができそうです。

>> Mr.XRAY さん
返信ありがとうございます。
Delphi6のPersonal版だとコンパイルエラーになってしまいました。
RTTIはDelphi2010からなんですかね?

貼ってもらったリンクは参考にさせてもらいます。


Mr.XRAY  2013-04-18 06:45:59  No: 44355

>コンパイルエラーになってしまいました。

それはスミマセンでした.私は貴方が使っている Delphi のバージョンを知らなかったものですから.
本当に申し訳ありませんでした.今後十分に注意します.


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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