コンポーネントのプロパティ情報をまとめて取得する方法はありますか?
例えば、ボタンをフォームに貼り付けて、
dfmファイルの中身を見るとボタンのプロパティ情報が見れると思います。
pasファイル側でボタンのプロパティを制御する時は、
Button1.Enabled := False;
みたいに書くと思います。
実行中のある時点でのコンポーネントの状態をファイルに出力したいのですが、
pas側で各コンポーネントごとのプロパティを一括で取得する方法はないでしょうか?
こういうことですか?
テキストエディタで入力したのでワーニングなどが出るかも
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;
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;
>テキストエディタで入力したのでワーニングなどが出るかも
では,実際のサンプルとして.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;
>[130_オブジェクトの保存 ( クラス型の保存 ) ]
>http://mrxray.on.coocan.jp/Delphi/plSamples/130_SaveComponent.htm
これは,正確に言うと,コンポーネントのプロパティをファイルに出力したりするのではありません.
「コンポーネント」の状態をまるごと扱う場合です.注意してください.
>> take さん
返信ありがとうございます。
記載の内容でやりたことができそうです。
>> Mr.XRAY さん
返信ありがとうございます。
Delphi6のPersonal版だとコンパイルエラーになってしまいました。
RTTIはDelphi2010からなんですかね?
貼ってもらったリンクは参考にさせてもらいます。
>コンパイルエラーになってしまいました。
それはスミマセンでした.私は貴方が使っている Delphi のバージョンを知らなかったものですから.
本当に申し訳ありませんでした.今後十分に注意します.
ツイート | ![]() |