TAction 有一个 OnHint 事件,但不幸的是没有 OnHideHint 事件。这有以下缺点:我有 ToolButtons 和其他与操作相关的控件。每当鼠标悬停在这样的控件上时,Action 的提示就会显示在 StatusBar 中;(我已将 StatusBar 的 AutoHint 属性设置为 True)。但是当鼠标离开 ToolButton 时,StatusBar 中先前的自定义文本(不是来自提示)不会自动恢复!现在我可以为表单上的每个控件编写一个 OnMouseLeave 事件处理程序来恢复我在状态栏中的自定义文本,但这会很麻烦!不是有什么东西可以自动恢复状态栏中的先前文本吗?TAction 中的 OnHideHint 事件将是理想的!
问问题
606 次
2 回答
2
这是默认行为,当 AutoHint 为 True 时,状态栏会通过在第一个面板中显示提示文本的长版本来自动响应提示操作。
您遇到的问题是,当您用鼠标离开控件时,您基本上是在进入另一个窗口,它是父控件。并且因为该父级没有分配给它的提示字符串值,所以提示动作被更新为一个空字符串。
如果您想在没有提示显示时返回默认值,请在表单上放置一个TApplicationEvents组件并使用 TApplication.OnHint 事件,如下所示:
var
OriginalPanelText : String = 'BLA';
procedure TForm1.ApplicationEvents1Hint(Sender: TObject);
begin
if StatusBar1.SimplePanel or (StatusBar1.Panels.Count = 0)
then
if Application.Hint <> ''
then
StatusBar1.SimpleText := Application.Hint
else
StatusBar1.SimpleText := OriginalPanelText
else
if Application.Hint <> ''
then
StatusBar1.Panels[0].Text := Application.Hint
else
StatusBar1.Panels[0].Text := OriginalPanelText;
end;
于 2013-06-10T22:23:00.493 回答
0
魔术AutoHint
都发生在TStatusBar.ExecuteAction
. 当提示停止显示该代码时,会将状态栏文本设置为空。您可以像这样修改行为:
type
TStatusBar = class(ComCtrls.TStatusBar)
private
FRestoreTextAfterHintAction: string;
public
function ExecuteAction(Action: TBasicAction): Boolean; override;
end;
function TStatusBar.ExecuteAction(Action: TBasicAction): Boolean;
var
HintText: string;
begin
if AutoHint and not (csDesigning in ComponentState) and
(Action is THintAction) and not DoHint then begin
HintText := THintAction(Action).Hint;
if SimplePanel or (Panels.Count=0) then begin
if HintText='' then begin
SimpleText := FRestoreTextAfterHintAction;
end else begin
FRestoreTextAfterHintAction := SimpleText;
SimpleText := HintText;
end;
end else begin
if HintText='' then begin
Panels[0].Text := FRestoreTextAfterHintAction;
end else begin
FRestoreTextAfterHintAction := Panels[0].Text;
Panels[0].Text := HintText;
end;
end;
Result := True;
end else begin
Result := inherited ExecuteAction(Action);
end;
end;
我使用了一个相当粗糙的插入器类和一个脆弱的实例变量来存储要恢复的文本。如果你愿意,你可以把它弄得更健壮一些。上面的代码至少向你展示了你需要添加你的钩子的地方。
于 2013-06-11T11:01:53.277 回答