事实证明,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 已经调用了一次。但这不应该被检测到。
更新 2
为了使这项工作也适用于菜单(也可以使用键盘进行导航,在这种情况下,鼠标光标可能位于屏幕上的任何位置),我认为以下添加就足够了:
IsHintFor
在辅助函数旁边声明一个全局变量:
var
GCurrentMenuWindow: HWND;
function IsHintFor(AForm: TCustomForm): Boolean;
并像这样扩展这个函数:
function IsHintFor(AForm: TCustomForm): Boolean;
begin
if GCurrentMenuWindow <> 0 then
Result := Assigned(AForm) and (GCurrentMenuWindow = AForm.Handle)
else
begin
Result := False;
var LCtl := FindDragTarget(Mouse.CursorPos, True);
if Assigned(LCtl) then
Result := GetParentForm(LCtl) = AForm;
end;
end;
然后,要使菜单栏正常工作,请将以下内容添加到每个带有菜单栏的表单类中:
procedure WMEnterMenuLoop(var Message: TWMEnterMenuLoop); message WM_ENTERMENULOOP;
procedure WMExitMenuLoop(var Message: TWMExitMenuLoop); message WM_EXITMENULOOP;
end;
implementation
procedure TForm6.WMEnterMenuLoop(var Message: TWMEnterMenuLoop);
begin
inherited;
GCurrentMenuWindow := Handle;
end;
procedure TForm6.WMExitMenuLoop(var Message: TWMExitMenuLoop);
begin
inherited;
GCurrentMenuWindow := 0;
end;
最后,要使上下文菜单起作用,请使用辅助函数将以下内容添加到单元中:
type
TPopupListEx = class(TPopupList)
protected
procedure WndProc(var Message: TMessage); override;
end;
{ TPopupListEx }
procedure TPopupListEx.WndProc(var Message: TMessage);
begin
inherited;
case Message.Msg of
WM_INITMENUPOPUP:
for var LMenu in PopupList do
if TObject(LMenu) is TPopupMenu then
if TPopupMenu(LMenu).Handle = Message.WParam then
begin
var LComponent := TPopupMenu(LMenu).PopupComponent;
if LComponent is TControl then
begin
var LForm := GetParentForm(TControl(LComponent));
if Assigned(LForm) then
GCurrentMenuWindow := LForm.Handle;
end;
Break;
end;
WM_EXITMENULOOP:
GCurrentMenuWindow := 0;
end;
end;
initialization
FreeAndNil(PopupList);
PopupList := TPopupListEx.Create;
end.
结果:
免责声明:未经全面测试。