使用“|” Delphi中提示文本的符号

时间:2017-10-26 01:55:33

标签: winapi windows-7 delphi-7

出于某种原因,我指定“|”在任何Delphi控件的提示字符串内的符号,提示终止于第一次发生“|”所以工具提示窗口只包含部分文本,直到第一个“|”遇到...

我在C ++中测试了这个符号(包括WinApi + MFC),它显示了带有“|”的K的提示符号,所以它看起来像是一些特定于Delphi的bug。

整个程序运行正常,但这个提示只是让我感到厌恶... =

那么,任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

这是设计的,并且是记录在案的行为:

TControl. Hint property

TApplication.Hint property

  

提示字符串有两个部分 - 短和长 - 由|字符分隔。弹出工具提示使用短提示。状态栏使用长提示。使用Controls单元中的GetShortHintGetLongHint全局函数从提示字符串中提取长短提示。

要“修复”这个以便显示|个字符,您必须:

在分割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.OnShowHintCM_HINTSHOW拦截,如果你不像我一样懒惰。