在狀態欄中顯示提示的規范方法是通過以下代碼:
Constructor TMyForm.Create;
begin
inherited create (nil);
...
Application.OnHint:= MyHint;
...
end;
procedure TMyForm.MyHint (Sender: TObject);
begin
sb.simpletext:= Application.Hint;
end;
procedure TMyForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Application.OnHint:= nil;
...
end;
當程式由模態形式組成時,上述作業正常,但在使用非模態形式(不一定是 MDI)時會出現問題。在這些情況下,會創建一個非模態表單并將Application.OnHint其分配給非模態表單內的程序;狀態欄顯示來自表單的提示。但是如果創建另一個非模態表單,Application.OnHint現在將分配給第二個表單中的相同程序。在第一個非活動表單中將滑鼠移到帶有提示的控制元件上會導致該提示顯示在第二個表單的狀態欄中!
如何使每個非模態表單顯示僅源自其自己的控制元件的提示?一種可能性是當表單變為非活動狀態時從控制元件中洗掉提示,并在表單再次變為活動狀態時恢復它們,但這非常不雅。問題出在Application.OnHint事件上。
uj5u.com熱心網友回復:
事實證明,OP 只是希望每個表單的狀態欄顯示來自該表單的所有提示(不介意它也顯示來自其他表單的提示)。
所以這是微不足道的。只需給所有表單一個狀態欄,然后將一個TApplicationEvents組件拖放到每個表單上。為每個組件的OnHint事件創建一個處理程式:
procedure TForm6.ApplicationEvents1Hint(Sender: TObject);
begin
StatusBar1.SimpleText := Application.Hint;
end;
然后一切都會正常作業:

更新
看來OP確實介意。那么,一種解決方案是這樣做:
procedure TForm6.ApplicationEvents1Hint(Sender: TObject);
begin
if IsHintFor(Self) then
StatusBar1.SimpleText := Application.Hint
else
StatusBar1.SimpleText := '';
end;
在你所有的表格上。但是您只需要定義一次幫助函式
function IsHintFor(AForm: TCustomForm): Boolean;
begin
Result := False;
var LCtl := FindDragTarget(Mouse.CursorPos, True);
if Assigned(LCtl) then
Result := GetParentForm(LCtl) = AForm;
end;
不幸的是,這確實浪費了幾個 CPU 周期,因為FindDragTarget每次Application.Hint更改它都會呼叫幾次,從某種意義上說是不必要的,因為 VCL 已經呼叫了一次。但這不應該被檢測到。

uj5u.com熱心網友回復:
我將給出一個部分答案,因為我對這個主題的研究已經產生了一些適用于一種形式但不適用于另一種形式的東西。
關于我的解決方案的作業形式,有一個TDBGrid和一些按鈕;網格有一個明確的提示。此表格的解決方案如下:
uses
Controls;
type
TMyForm = class (TForm)
...
public
Procedure CMMouseEnter (var msg: TMessage); message CM_MouseEnter;
Procedure CMMouseLeave (var msg: TMessage); message CM_MouseLeave
end;
Procedure TMyForm.CMMouseEnter (var msg: TMessage);
begin
inherited;
if msg.lparam = integer (dbGrid1)
then sb.simpletext:= dbGrid1.Hint
end;
Procedure TMyForm.CMMouseLeave(var msg: TMessage);
begin
inherited;
if msg.lparam = integer (dbGrid1)
then sb.simpletext:= ''
end;
雖然這段代碼有效,但我不喜歡那種integer (dbGrid1)演員;有更好的方法嗎?
這段代碼在哪里不起作用?另一個表單有一個頁面控制元件,其中包含兩個標簽頁;在一個標簽頁上有帶有提示的速度按鈕,在另一個標簽頁上有一個帶有提示的 dbgrid。撰寫與上述類似的代碼不起作用 -msg.lparam輸入時CMMouseEnter的值似乎是轉換頁面控制元件的值(也許是它的句柄?)。那么如何使用已定義的提示來控制控制元件呢?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/406924.html
標籤:
