2010-08-23 33 views
1

D6教授德爾福:如何讓我自己的提示窗口?

我們有一個特殊的應用程序與特殊的網格。它有一個HintWindow可以顯示不能放在單元格中的其他信息。例如長備忘錄。 將鼠標移動到單元格時,它將等待2秒鐘,並顯示信息。

這個主題的問題是HintWindow工作不正常,或者與正常的「提示」一樣。

普通提示正在出現,並且它們正在消失在這些情況下: - 提示表示時間ellapsed - 的活性形式被去激活 - 一種新的形式示出 - 應用被另一任務(Alt + Tab)代替

但是我們的HintWindow無法檢測到新窗體顯示或應用程序已更改 - 它一直保留在頂部,直到出現失敗。時間... :-(

,我們用「的MouseMove」來檢測鼠標變化的另一個問題 - 。開始提示

此事件也發生如果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週期性出現,dissappears

所以:我們需要知道我們是如何作出這樣的工作在相同的方法類似應用HintWindow「提示「,但只限於這個網格 它必須關閉「任務更改」,「更改格式」。怎麼做?

感謝您的幫助: DD

回答

2

你最好使用提供機制,顯示提示整個應用程序,通過更換傳遞給應用程序的OnShowHint事件HintInfo參數HintWindowClass每當你需要顯示定製提示。也許你會在下面找到一些有用的實現細節。

老答案:
在一箇舊的應用程序我有列表框和網格不同的提示類。行爲有點分散,但基本上歸結爲;

應用程序中的所有DBGrid都分配了一些識別提示,如:'MyDBGridHint'。應用程序的OnShowHint事件測試是否通過'HintInfo的'HintControl'是'TCustomDBGrid',如果是,則調用傳遞'HintInfo'的過程。

此過程通過使用帶有HintInfo.CursorPos的網格的MouseCoord方法找到提示應該在的單元格,通過臨時更改網格的DataLink獲取單元格的顯示文本。然後該過程創建一個TCanvas併爲其分配一個爲網格檢索的DC,將網格的字體分配給畫布並測試網格單元的邊界是否足以顯示文本。如果它決定顯示提示,則將單元格文本分配給HintInfo.HintStr和派生的提示窗口類別HintInfo.HintWindowClass,計算位置,邊界,設置字體等並返回。

然後OnShowHint事件測試,以查看HintStr是否仍然是網格提示標識符(我在代碼中有一個註釋,「由網格擁有的控件產生這個。」),如果是的話取消提示。

我不知道,如果想形容它像這樣可以幫上什麼忙,但這裏正試圖...

+0

唉唉......我忘了說,這個控制是一個虛擬的網格,不是基於在VCL網格上 - 它基於自定義控件。 所以提示來自這個班級。 但是:我不想使用任何控件時可見的「正常」提示。我想讓這些細胞給出信息。所以我需要抓住光標移動。 – durumdara 2010-08-23 09:52:09

+0

@durumdara - >「需要捕捉遊標移動」 - 傳遞給'OnShowHint'事件的'HintInfo'已經有了遊標位置,我描述的實現使用它來定位'提示'將會在哪個單元格上。我現在也提供了一些指向文檔的鏈接。讀一下他們... – 2010-08-23 10:08:50