2016-09-30 10 views
0

ヒントメッセージをアプリケーションに送信するにはどうすればよいですか? 私は少しテストで試してみた:コードでヒントメッセージを送信するにはどうすればよいですか?

TForm1 = class(TForm) 
    ApplicationEvents1: TApplicationEvents; 
    Memo1: TMemo; 
    procedure ApplicationEvents1Hint(Sender: TObject); 
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

procedure TForm1.ApplicationEvents1Hint(Sender: TObject); 
begin 
    Memo1.Lines.Add(Application.Hint); 
end; 

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
begin 
    Application.Hint := 'Hello'; 
end; 

観測MEMO1の行は、空のヒントメッセージが毎回送信され、私は「こんにちは」を設定されているようです。実際のシナリオでは

enter image description here

、空のヒントメッセージは、私のヒントメッセージを非表示になりますし、私は私が間違ってやっているのか理解していない、これは間違ったアプローチですか?

答えて

4

あなたが実際にしようとしていることは、マウスがコントロール上を移動している間に現在表示されているヒントを微調整することです。これを行うには、TApplication.OnShowHintまたはTApplicationEvents.OnShowHintイベントを使用するか、ターゲットコントロールをサブクラス化してCM_HINTSHOWメッセージを処理します。唯一の新しいこのように表示されるヒントをカスタマイズすることは、各ヒント変化に/TApplicationEvents.OnHintイベントをトリガしないこと

procedure TForm1.ApplicationEvents1ShowHint(var HintStr: string; 
    var CanShow: Boolean; var HintInfo: THintInfo) 
begin 
    // HintInfo.HintControl is the control that is about to display a hint 
    if HintInfo.HintControl = Memo1 then 
    begin 
    // HintInfo.CursorPos is the current mouse position within the HintControl 
    HintStr := Format('Hello, cursor = %d,%d', [HintInfo.CursorPos.X, HintInfo.CursorPos.Y]); 

    // the hint will remain active until it times out (see 
    // TApplication.HintHidePause and THintInfo.HideTimeout) or 
    // the mouse moves outside of the HintInfo.CursorRect. In 
    // the latter case, a new hint will be displayed. This allows 
    // you to change the hint for different sections of the 
    // HintControl. The CursorRect is set to the HintControl's 
    // whole client area by default. 

    // In this example, setting the new CursorRect to a 1x1 square 
    // around the current CursorPos will display a new hint string 
    // on each mouse movement... 
    HintInfo.CursorRect := Rect(HintInfo.CursorPos.X, HintInfo.CursorPos.Y, HintInfo.CursorPos.X, HintInfo.CursorPos.Y); 
    end; 
end; 

注:これらのいずれかが、あなたがカスタマイズすることができますTHintInfo記録、例えばへのアクセスを提供しますヒントポップアップが表示されます。 OnShowHint/CM_HINTSHOWを使用すると、既存のヒントポップアップのライブアップデートを実行できます。

hint with live updates

4

Application.Hintは直接設定しないでください。フレームワークはTApplication.Idleからそうします。それはそうのように、この処理を行います。ここでは

Control := DoMouseIdle; 
if FShowHint and (FMouseControl = nil) then 
    CancelHint; 
Application.Hint := GetLongHint(GetHint(Control)); 

Controlは、マウスの下にあるものは何でもコントロールです。あなたのプログラムの任意のコントロールのHintプロパティを指定していないので、このコードが実行されるたびにApplication.Hint''に設定します。

だから、ここに何が起こるかです:

  • あなたのマウスを移動:
  • あなたのマウス移動ハンドラーはApplication.Hintを設定することにより、それに応答します。
  • メッセージキューが空になり、TApplication.OnIdleが実行されます。
  • これは''に戻るApplication.Hintを更新します。

そして、最初に戻り、前後に繰り返します。

はい、これは間違ったアプローチです。あなたの本当の問題を知らないので、まさに正しいアプローチが何であるか、私は本当に分かりません。通常は、アクション、メニュー項目、ボタン、ツールボタンなどのコンポーネントに対してHintプロパティを設定します。しかし、おそらくあなたのニーズはよりダイナミックです。私は彼らに話すことができませんが、私はあなたがなぜこの行動を観察するのか説明したと信じています。

私が感じるもう一つのポイントは、ヒントがかなり面白い獣だということです。ヒントを同期的に表示することはありません。ヒントが表示されるとシステムが判断するまで待ってから、ヒントの内容を何か別の方法で提供します。また、アプリケーションがアイドル状態になると、マウスの動きが止まったときにヒントが表示されます。 OnMouseMoveイベントでヒントを表示させようとしているコードは、そのコードがフレームワークの目的を超えて動作するものとして最もよく記述されています。

+0

ありがとうございます。私はこれを念頭に置いておきます。 – ExDev

関連する問題