【发布时间】:2017-10-26 01:55:32
【问题描述】:
由于某种原因,当我指定“|”时任何 Delphi 控件的提示字符串中的符号提示终止于第一次出现的“|”所以工具提示窗口只包含部分文本,直到第一个“|”遇到...
我已经在 C++(WinApi + MFC)中测试了这个符号,它用“|”显示了漂亮的 K 提示符号,所以它看起来像是一些 Delphi 特定的错误。
整个程序运行良好,但这个带有提示的东西让我很烦 =\
那么,有什么办法可以解决这个问题吗?
【问题讨论】:
由于某种原因,当我指定“|”时任何 Delphi 控件的提示字符串中的符号提示终止于第一次出现的“|”所以工具提示窗口只包含部分文本,直到第一个“|”遇到...
我已经在 C++(WinApi + MFC)中测试了这个符号,它用“|”显示了漂亮的 K 提示符号,所以它看起来像是一些 Delphi 特定的错误。
整个程序运行良好,但这个带有提示的东西让我很烦 =\
那么,有什么办法可以解决这个问题吗?
【问题讨论】:
这是设计使然,并且记录在案的行为:
提示字符串有两部分 - 短和长 - 由
|字符分隔。弹出工具提示使用简短提示。状态栏使用长提示。使用Controls单元中的GetShortHint和GetLongHint全局函数从提示字符串中提取长提示和短提示。
要“修复”此问题以便您可以显示 | 字符,您必须:
使用TApplication.OnShowHint 或TApplicationEvents.OnShowHint 事件。
直接子类化所需控件以处理CM_HINTSHOW 消息。
在准备弹出窗口时,Hint 文本被拆分之后和实际显示弹出窗口之前,都会触发两者。两者都提供对THintInfo 记录的访问,您可以根据需要自定义该记录。它有一个HintStr 字段,您可以将其设置为您想要的任何文本,包括| 字符。它有一个HintControl 字段,指向显示弹出窗口的控件。
最简单的解决方案是使用OnShowHint 事件来设置HintStr := HintControl.Hint。
使用TApplication.OnShowHint:
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnShowHint := AppShowHint;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Application.OnShowHint := nil;
end;
procedure TForm1.AppShowHint(var HintStr: string; var CanShow: boolean; var HintInfo: THintInfo);
begin
HintStr := HintInfo.HintControl.Hint;
end;
使用TApplicationEvents.OnShowHint:
procedure TForm1.ApplicationEvents1ShowHint(var HintStr: string; var CanShow: boolean; var HintInfo: THintInfo);
begin
HintStr := HintInfo.HintControl.Hint;
end;
【讨论】:
嗯,我想出的最简单的解决方案就是编辑“Controls.pas”:
function GetShortHint(const Hint: string): string;
var
I: Integer;
begin
{$IFDEF _ONLY_SIMPLE_HINTS_}
Result:=Hint;
{$ELSE}
I := AnsiPos('|', Hint);
if I = 0 then
Result := Hint else
Result := Copy(Hint, 1, I - 1);
{$ENDIF}
end;
function GetLongHint(const Hint: string): string;
var
I: Integer;
begin
{$IFDEF _ONLY_SIMPLE_HINTS_}
Result:=Hint;
{$ELSE}
I := AnsiPos('|', Hint);
if I = 0 then
Result := Hint else
Result := Copy(Hint, I + 1, Maxint);
{$ENDIF}
end;
所以我刚刚在我的项目中添加了“{$DEFINE _ONLY_SIMPLE_HINTS_}”=)
免责声明:如果您不像我那么懒惰,请按照 Remy Lebeau 的建议使用 TApplication.OnShowHint 或 CM_HINTSHOW 拦截。
【讨论】:
TApplication(Events).OnShowHint 事件,或CM_HINTSHOW 消息。详情见我的回答