掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
EnumChildWindowsでTLabelを取得するには? (ID:45407)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
フクロウさん >開発環境はDelphi3です。 え、、、それは未知領域です。。。。 少なくとも動的配列は禁止ですね。 >(d)案で動いてTlabelの問題にぶつかったという経緯です。 念のため。いいえ、(d)案はウインドウを取得するのではなく、EXEのリソースからdfmのデータを取り出します。 >(c)案は当初より考えてはいましたが、は個人的に難しいのでは?と思っています。 >というのも継承構成が複雑で、継承先のdfmには継承元のdfmの情報は直接持っていないため、 >継承構成を懸案しながら、dfmの解析が必要だからです。 その通りです!! これは(d)案にもまったく同じことが言えます。ただし、(c)・(d)案ともに継承元(dfmファイル/リソース)は取得できます ので、やる気次第ですね。(理屈は簡単ですが、プログラミング的に難しい。) ちなみに、以下はサンプルのTAboutBoxフォームを継承した場合のTAboutBox2のdfmです。 TLabelの位置だけを変更してみたので、Left = 136 が追加されています。 inherited AboutBox2: TAboutBox2 Caption = 'AboutBox2' PixelsPerInch = 96 TextHeight = 12 inherited Panel1: TPanel inherited ProductName: TLabel Left = 136 end end end 1つのフォーム中では名前の衝突は無いはずだからツリー的管理は必要なく、先に継承元を読み込んで単純に オーバーライドしていけば可能…と思ってます。(言うは易し。) 継承のinheritedの他に、inlineてのもある模様…これはフレームか! 名前の衝突が無いという前提がいきなり崩れました…。どうすれば良いのか…。 >これはどのような、方法で解析されたのでしょうか? Questさんとは違ったアプローチですが、Name、Top、Left、Caption、Hintだけ取得する簡易的なものです。 上からプロパティを読んでいき、objectかendがあったら取捨選択して記録、再帰。ソートして出力…みたいな。 今となっては徒労であったことが判明したので、具体的なコードは割愛します。 Questさん >「なんらかの方法」でリソースを抽出できれば ここはとても簡単です。普通にリソースを読むだけなので。↓こんな感じで。 // EXEのリソースからdfmのテキストを得る関数、EXENameには'TFORM1'とかを指定する // // ヘルプのObjectBinaryToTextの例より作成 // 検索順序:ReadComponentResFile→ObjectTextToResource→ObjectResourceToText→ObjectBinaryToText function CompoResourceToString(const EXEName, ResName: String): String; var AInstance: HMODULE; ResStream: TResourceStream; StrStream: TStringStream; begin AInstance:=LoadLibrary(PChar(EXEName)); if AInstance=0 then Exit; try ResStream:=TResourceStream.Create(AInstance, ResName, RT_RCDATA); try StrStream:=TStringStream.Create(''); try ObjectBinaryToText(ResStream, StrStream); Result:=StrStream.DataString; finally StrStream.Free; end; finally ResStream.Free end; finally FreeLibrary(AInstance); end; end; ↑これはObjectBinaryToTextでテキスト化してますが、TReaderだとバイナリのストリームのまま放り込むことになります。 以下は余談。 TReaderで扱えるのはリソースヘッダ無しのバイナリdfmデータしか扱えませんが、変換すればテキストも大丈夫。 dfmデータは以下の3種類あると思います。若干ややこしいです。。。 ・ テキストの*.dfm … ObjectTextToBinaryで変換すればOk。 ・ バイナリの*.dfm … リソースヘッダが付いてるので、TStream.ReadResHeaderでリソースヘッダを読み飛ばせばOk。 ・ EXEリソース内のバイナリdfmデータ … リソースヘッダは付いてないので、そのままでOk。 ということで、TReaderを使ったアプローチもまだ考え中です。 フクロウさんにお聞きしておきたいことがいくつかあります。 ・ 制作に使用されたバージョンとは別に、現在使用できるDelphiでもっと新しいのはないのでしょうか? ・ 動的に生成、または変化するCaptionとか無いですよね? あったら前提が崩れます。 ・ 出力はTop、Left順の一覧テキストで良いのでしょうか。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.