過去記事で書いたフローティングパネルより、さらにカンタンで気持ちイイ、パネルの浮かべ方です。
【もくじ】
1.学びのきっかけ
作成中のマークシートリーダーに、手書き答案の採点機能も追加搭載したくなり、そうなるとどうしても必要になるのが、手書き答案の解答欄矩形の座標データ。
データそのものは、OpenCV の矩形検出を使えばなんとか取得できそう。ただ、どうしても不要な矩形まで検出してしまうことがあるので、検出できた座標を一覧形式で表示し、解答欄矩形ではないものをそこから削除する作業と場所が必要。
これに最適なのがフローティングパネル。解答欄矩形の座標データは、その取得作業が完了してしまえば、表示しておく必要はさらさらない。さっさと消して、より広い表示スペースを確保したい。
そう思って、コレを作りました☆

実行中の様子です。

タイトルバーを D&D して任意の位置へ移動できます。

(画面は座標位置へ、自動スクロールします)
2.実装
【専用フォームを作成】
最初に、パネルを載せるための専用フォームを作成します(メイン Unit は既存のもの)。

新しいフォームの名前は、例: frmFloatHolder とします。

次は、プロパティの設定ですが、上のように名前を付けたら、あと2つ設定します。
1つは、タイトルバー。細くして、フワフワ浮遊感が出る?・・・かな??
BorderStyle を bsSizeToolWin に設定。

もう1つは、最前面に表示されるように
FormStyle を fsStayOnTop に設定。

以上の設定を終えたら、例:UnitFloatHolder.pas という名前で保存します。
【メインフォーム側の処理】
メインフォームから frmFloatHolder を操作できるように、Unit1 の implementation の下の(なければ作成)uses に UnitFloatHolder を追加します。

メインフォーム上に新しい Panel を置いて、あれこれ載せます。

Button1Click手続きにクリック時のフローティング処理を書きます。
procedure TForm1.Button1Click(Sender: TObject);
begin
//フローティングフォームを作成
if not Assigned(frmFloatHolder) then
frmFloatHolder := TfrmFloatHolder.Create(Application);
//パネルのサイズをフォームに合わせる
frmFloatHolder.ClientWidth := Panel1.Width;
frmFloatHolder.ClientHeight := Panel1.Height;
//親をメインフォームからフローティングフォームに書き換える
Panel1.Parent := frmFloatHolder;
//パネルを移動用フォーム全体に広げる
Panel1.Align := alClient;
//フローティングフォームを表示
frmFloatHolder.Show;
end;
実行して、Button1をクリックしてみました!

ただ、フローティングパネルの閉じるボタン(右上)をクリックすると・・・

それでは寂しいので、フローティングパネルの基地を作ります。
基地の名前は「 PanelAnchor 」

(Visible := False で運用するなら、とくにこだわらなくてもいい部分ではあります)
基地に戻るためのボタンをフローティングパネルに追加します。

下にいるのもなんなので・・・フローティングパネル(Panel1)を右クリックして、表示されるサブメニューから「コントロール」→「前面に移動」を順にクリック。

フローティングパネルが上にきました!

で、基地に戻るためのコードを書きます。Button2 をダブルクリックして・・・
procedure TForm1.Button2Click(Sender: TObject);
begin
//親を基地のパネル」に設定
Panel1.Parent := PanelAnchor;
Panel1.Align := alClient;
//基地を表示
PanelAnchor.Visible := True;
//フローティングパネル用のフォームを隠す
frmFloatHolder.Hide;
end;
実行して、基地に戻してみました!

実際の運用では基地の Visible を False に設定して、表面上はフローティングパネルは消えたらもうそれまで・・・というようにしたり、あとは自由自在です。
3.まとめ
この方法の最大のメリットは「パネル内のコントロールのイベントハンドラは、全部 メインユニットにある」 という点です。メンテナンスが 走召 楽勝。これで WinAPI の知識は不要で、安全でメンテナンスしやすいフローティングパネルが実現できました!
前回のフローティングパネルで、さんざん悩んだアレはいったい何だったのか・・・
いや・・・
“Every cloud has a silver lining.”
「どんな雲にも銀の縁取りがある」
あの経験が僕を今日に導いてくれたのだから・・・
ヒトも、プログラムも、進化します。
明日も Delphi と、肩ならべて、歩こう!!!
4.お願いとお断り
このサイトの内容を利用される場合は、自己責任でお願いします。ここに記載した内容を利用した結果、利用者および第三者に損害が発生したとしても、このサイトの管理者は一切責任を負えません。予め、ご了承ください。