2016-09-30 49 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.OnShowHintTApplicationEvents.OnShowHint事件,或者使用目標控件的子類來處理CM_HINTSHOW消息。所有這些都將提供訪問THintInfo記錄,你可以自定義,如:

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; 

請注意,以這種方式自定義顯示的提示不會觸發每一絲變化/TApplicationEvents.OnHint事件,只有當新提示彈出窗口顯示。 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