1

D6 教授

特別なグリッドを備えた特別なアプリケーションがあります。セルに配置できない他の情報を表示できる HintWindow があります。たとえば、長いメモ。マウスをセルに移動すると、2 秒間待機し、情報が表示されます。

HintWindow が正常に動作しない、または通常の「ヒント」と同じように動作しないというこのテーマの問題。

通常のヒントが表示され、次の場合には消えます: - 時間の経過を示すヒント - アクティブなフォームが非アクティブ化されている - 新しいフォームが表示されている - アプリケーションが別のタスクに置き換えられている (ALT + TAB)

しかし、HintWindow は新しいフォームが表示されていること、またはアプリケーションが変更されたことを検出できません。時間... :-(

マウスの変化を検出するために "MouseMove" を使用したもう 1 つの問題は、ヒントを開始することです。

このイベントは HintWindow が消えた場合にも発生します。したがって、次のコードで周期的な表示から保護する必要があります。

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
    Caption := INtTOStr(X) + ' ' + IntToStr(Y) + ' ' + IntToStr(GetTickCount);
    // If same coordinate I don't show it again
    if (LX <> X) or (LY <> Y) then begin
        miHint.DoActivateHint(Self, 'Anytext', 2000, 2000);
        LX := X; LY := Y;
    end;
end;

この LX、LY がないと、HintWindow が周期的に現れたり消えたりします。

したがって、アプリケーション「Hint」と同じメソッドで動作するが、このグリッドに限定された HintWindow を作成する方法を知る必要があります。「タスク変更」「フォーム変更」でクローズする必要があります。どうやってするの?

ご協力ありがとうございます: dd

4

1 に答える 1

2

カスタマイズされたヒントを表示する必要があるときはいつでも、アプリケーションのイベントに渡されるHintInfoパラメーターのHintWindowClassを置き換えることにより、アプリケーション全体でヒントを表示する提供されたメカニズムを使用することをお勧めします。おそらく、以下にいくつかの有用な実装の詳細が見つかるかもしれません。OnShowHint

古い回答:
ある古いアプリケーションでは、リスト ボックスとグリッドに別のヒント クラスがありました。動作は少し散らばっていますが、基本的には次のように要約されます。

アプリケーション内のすべての DBGrid には、「MyDBGridHint」などの識別ヒントが割り当てられます。アプリケーションのOnShowHintイベントは、渡された HintInfo の HintControl が TCustomDBGrid であるかどうかをテストし、渡された場合は HintInfo を渡すプロシージャを呼び出します。

この手順では、Grid の MouseCoord メソッドと HintInfo.CursorPos を使用してヒントが表示されるセルを見つけ、Grid の DataLink を一時的に変更してセルの表示テキストを取得します。次に、プロシージャは TCanvas を作成し、そのハンドルにグリッド用に取得した DC を割り当て、グリッドのフォントをキャンバスに割り当て、グリッド セルの境界がテキストを表示するのに十分かどうかをテストします。ヒントを表示すると判断した場合は、セル テキストを HintInfo.HintStr に割り当て、派生したヒント ウィンドウ クラスを に割り当て、HintInfo.HintWindowClass位置、境界を計算し、フォントなどを設定して戻ります。

次にOnShowHint、HintStr がまだグリッド ヒント識別子であるかどうかをイベント テストで確認し (コード内に「グリッドによって所有されているコントロールがこれを生成します」というコメントがあります)、そうである場合はヒントをキャンセルします。

このように説明しようとしても役に立つかどうかはわかりませんが、試してみます...

于 2010-08-23T09:23:36.307 に答える