新型フローティングパネル

過去記事で書いたフローティングパネルより、さらにカンタンで気持ちイイ、パネルの浮かべ方です。

【もくじ】

1.学びのきっかけ
2.実装
3.まとめ
4.お願いとお断り

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 」

大きさは、とりあえず Panel1 と同じにしました。
(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.お願いとお断り

このサイトの内容を利用される場合は、自己責任でお願いします。ここに記載した内容を利用した結果、利用者および第三者に損害が発生したとしても、このサイトの管理者は一切責任を負えません。予め、ご了承ください。