2

フォーム上に、内容が異なる 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 つのページ、およびページ上にあるすべてのコンポーネントを除外する必要がありますか?OnMouseEnterOnMouseLeave
OnMouseEnterLeave

別の更新:現在 TPageControl を使用していますが、動作は似ています。
ちらつきはありませんが、TPageControl の上にマウスを移動すると、TTabSheet がまったく表示されません。
マウスの左ボタンを押した場合にのみ、UI シートが表示されます。マウスを離すと、他のシートが正常に表示されます。(マウスの左ボタンを押すと、TJVPageList にも UI ページが表示されます。)
TPageControl と両方の TTabSheets のマウス イベント ハンドラー (enter/leave) を使用しました。

更新 3: 完了しました。OnMouseLeave静的 Panel / TabSheet / JvStandardPage (#1) はハンドラーをトリガーしてはなりません。

4

1 に答える 1

4

あなたが説明したことは、2 つのコントロールTPageControlではなく 1 つのTPanelコントロールを使用したほうがよいかもしれません。TPageControlの独自のイベントを使用OnMouseEnter/Leave(またはメッセージをインターセプトCM_MOUSEENTER/LEAVE) して、必要に応じて を切り替えTPageControl.ActivePageます。

于 2012-12-16T19:04:01.437 に答える