フォーム上に、内容が異なる 2 つの 100% 重複するパネルがあります。
1 つ目 (情報の静的な表示) はデフォルトで表示されますが、ユーザーがマウスを 2 つの近くに移動すると、もう 1 つ (ユーザー操作) が置き換えられます。マウスが離れると元に戻ります。
このようなもの:
if (*the mouse is near*) then
begin
Panel1.Hide;
Panel2.Show;
end
else
begin
Panel2.Hide;
Panel1.Show;
end;
私の問題は、マウスの動きをどこでキャプチャするかです。
各コンポーネントには独自のOnMouseMove
ハンドラーがあります。もちろん、それぞれをフォーム ハンドラーに転送することもできますが、もう少し洗練された (そして維持しやすい) ものが必要です。
完璧な解決策は次のようなものですForm1.MousePreview := true;
。
別の解決策は、座標を変換してフォーム ハンドラーを呼び出す汎用ハンドラーを割り当てることです。割り当ては FormCreate で行うことができます。
しかし、1 つの TImage には既に独自のマウス イベント ハンドラがあるため、これは思ったほど簡単ではありません。
2 つのパネルを試してみOnMouseEnter
ましOnMouseLeave
たが、うまくいきませんでした。1号は姿を消しましたが、2号は現れませんでした。これは、マウスが Panel2 を離れると消えてしまうためだと思いますが、その上にボタンを入力するとパネルも離れてしまいます。
そのため、座標ベースのアプローチを使用して、チェックの信頼性を高めたいと考えています。
2 パネル方式は完全に間違っているのではないでしょうか?
更新: はい、レミーが言ったように、そうです。
TPageControl にはビジュアル タブがあるため、TJVPageList を使用しています。PageList
のハンドラーが 1 つのページを設定し、もう 1 つのページを設定します。しかし、マウスが PageList の上に移動すると、両方のページがちらつき始めます。各ページにもイベント ハンドラーを追加しようとしましたが、違いはありませんでした。すべての/イベント
をチェックして、PageList、2 つのページ、およびページ上にあるすべてのコンポーネントを除外する必要がありますか?OnMouseEnter
OnMouseLeave
OnMouseEnter
Leave
別の更新:現在 TPageControl を使用していますが、動作は似ています。
ちらつきはありませんが、TPageControl の上にマウスを移動すると、TTabSheet がまったく表示されません。
マウスの左ボタンを押した場合にのみ、UI シートが表示されます。マウスを離すと、他のシートが正常に表示されます。(マウスの左ボタンを押すと、TJVPageList にも UI ページが表示されます。)
TPageControl と両方の TTabSheets のマウス イベント ハンドラー (enter/leave) を使用しました。
更新 3:
完了しました。OnMouseLeave
静的 Panel / TabSheet / JvStandardPage (#1) はハンドラーをトリガーしてはなりません。