掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
EnumChildWindowsでTLabelを取得するには? (ID:45398)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
仕込みすればいいのに…と思ってましたが、 >ただ、EXEが300個以上あり、担当者も複数に渡ります。 (^_^;;;;;;;;;;;;;;;; それでは仕込みは厳しいですねー。 >ちょっと、ツール化は難しいそうなので、コピペで泥臭くがんばろうかなと今は思っています。 フクロウさん、あきらめ早過ぎっすよ! 可能性がありそうな方法を分類すると、以下のようになると思います。 (a) 仕込み型 … 当該のプロジェクトにTLabelの情報を取得するコードを仕込んでコンパイル。(Questさん、私) (b) フォーム拝借型 … 当該のプロジェクトからフォームだけ取り出し、TLabelの情報を取得するコードと合わせてコンパイル。(Dさん) (c) ソース解析型 … 当該のプロジェクトからフォームの*.dfmを抜き出し、解析してTLabelの情報を取得。(一番現実的か?) (d) EXEから取得型 … 当該のEXEのリソースからフォーム情報を取り出し、解析してTLabelの情報を取得。(かなり面倒?) (a)と(b)が既出ですが、(c)のソース解析型が一番真っ当な気がします。 で、(d)の方法も出来そうな気がしてきたので、ちょっと研究してみます。うまくいったらお伝えします。 あれ、開発環境はどうなってますか? dfmがバイナリどうたらということはかなり古い? ------------------------------------------------------------------------------------ あと、自分も(a)の仕込み型のサンプルを作ってたので、せっかくですからここに置いておきます。 TLabelだけじゃ面白くないので、TControlなら取得するようにしてみました。(しかしかなり適当) 仕込むプロジェクトでフォームを新規作成、フォームをダブルクリック、フォームのNameプロパティをGetTCtrlFormに変更、 TMemoを配置、下記のコードをコピー&貼り付けすればOkです。 type TGetTCtrlForm = class(TForm) Memo1: TMemo; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private 宣言 } procedure ScreenActiveFormChange(Sender: TObject); procedure GetTControlData(AForm: TForm; AStrings: TStrings); public { Public 宣言 } end; var GetTCtrlForm: TGetTCtrlForm; implementation {$R *.dfm} uses ClipBrd; type TControlEx = class(TControl); // protectedなプロパティを取り出すための仕掛け procedure TGetTCtrlForm.FormCreate(Sender: TObject); begin Memo1.Font.Name:='MS ゴシック'; Self.FormStyle:=fsStayOnTop; Self.Show; Screen.OnActiveFormChange:=Self.ScreenActiveFormChange; end; procedure TGetTCtrlForm.FormDestroy(Sender: TObject); begin Screen.OnActiveFormChange:=nil; end; procedure TGetTCtrlForm.ScreenActiveFormChange(Sender: TObject); var SL: TStringList; begin SL:=TStringList.Create; try Self.GetTControlData(Screen.ActiveForm, SL); SL.Sort; // ソートすれば Top、Left順 になる SL.CommaText:=StringReplace(SL.Text, sLineBreak, ',', [rfReplaceAll]); // ゴニョゴニョして整形 Memo1.Lines.Assign(SL); // TMemoに出力 ClipBoard.AsText:=SL.Text; // クリップボードにも出力 finally SL.Free; end; end; procedure TGetTCtrlForm.GetTControlData(AForm: TForm; AStrings: TStrings); var TempSL: TStringList; I: Integer; AControl: TControl; begin AStrings.Add('------------------------------------------'); TempSL:=TStringList.Create; try for I:=0 to AForm.ComponentCount-1 do begin if not (AForm.Components[I] is TControl) then Continue; // TLabelのみにしても良い AControl:=AForm.Components[I] as TControl; TempSL.Clear; TempSL.Add(Format('(%4d,%4d) %d/%d', [AControl.Top, AControl.Left, I+1, AForm.ComponentCount])); TempSL.Add(AControl.Name); if not (AControl is TCustomMemo) then begin TempSL.Add(TControlEx(AControl).Caption); // Captionは無理やりほじくり出す end else begin TempSL.Add('* Caption N/A *'); // TMemoとかのCaptionにはText全部が入ってるからナシで end; TempSL.Add(AControl.Hint); TempSL.Add('------------------------------------------'); AStrings.Add(TempSL.CommaText); end; finally TempSL.Free; end; end;
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.