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

Using "|" symbol for a hint-text in Delphi

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

我已经在 C++(WinApi + MFC)中测试了该符号,它显示了带有“|”的漂亮 K 提示符号,所以它看起来像是一些 Delphi 特定的错误。

整个程序工作正常,但是这个带有提示的东西让我很烦 =\

那么,有什么解决办法吗?

这是设计使然,记录在案的行为:

TControl. Hint property

TApplication.Hint property

There are two parts to the Hint string--short and long--separated by the | character. Short hints are used by pop-up tool tips. Long hints are used by the status bar. Use the GetShortHint and GetLongHint global functions from the Controls unit to extract the long and short hints from a hint string.

为了 "fix" 这样你可以显示 | 个字符,你必须:

两者都在准备弹出窗口时触发,在拆分 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.OnShowHintCM_HINTSHOW 拦截。