出于某种原因,我指定“|”在任何Delphi控件的提示字符串内的符号,提示终止于第一次发生“|”所以工具提示窗口只包含部分文本,直到第一个“|”遇到...
我在C ++中测试了这个符号(包括WinApi + MFC),它显示了带有“|”的K的提示符号,所以它看起来像是一些特定于Delphi的bug。
整个程序运行正常,但这个提示只是让我感到厌恶... =
那么,任何想法如何解决这个问题?
答案 0 :(得分:3)
这是设计的,并且是记录在案的行为:
提示字符串有两个部分 - 短和长 - 由
|
字符分隔。弹出工具提示使用短提示。状态栏使用长提示。使用Controls
单元中的GetShortHint
和GetLongHint
全局函数从提示字符串中提取长短提示。
要“修复”这个以便显示|
个字符,您必须:
直接为所需控件创建子类以处理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;
答案 1 :(得分:-1)
嗯,我提出的最简单的解决方案就是编辑" 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;
所以我刚刚添加了#34; {$DEFINE _ONLY_SIMPLE_HINTS_}
"到我的项目=)
免责声明:根据Remy Lebeau的建议使用TApplication.OnShowHint
或CM_HINTSHOW
拦截,如果你不像我一样懒惰。