При разработке на Delphi иногда возникают ситуации, когда стандартное поведение компонентов ведет себя не так, как ожидается. Одна из таких ситуаций связана с использованием вертикальной черты (|) в тексте подсказки (Hint) для любого контрола в Delphi. По умолчанию, если в строке подсказки присутствует символ вертикальной черты, подсказка будет обрезана именно на этом символе, и пользователь увидит только часть текста до первого встретившегося символа |.
Это поведение является документально подтвержденным и обусловлено тем, что подсказки могут содержать две части: короткую и длинную, разделенные символом |. Короткие подсказки используются для всплывающих подсказок, в то время как длинные подсказки — для строки состояния. Для извлечения короткой и длинной подсказок из строки подсказки используются глобальные функции GetShortHint и GetLongHint из модуля Controls.
Для того чтобы отобразить символ | в подсказке, можно использовать один из следующих подходов:
Использовать событие TApplication.OnShowHint или TCustomApplicationEvents.OnShowHint. Эти события срабатывают при подготовке всплывающей подсказки, после разделения текста подсказки и перед ее отображением. В этих событиях доступна запись THintInfo, которая содержит поле HintStr, которое можно изменить на любой текст, включая символ |.
Пример использования 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;
Подклассование контрола для обработки сообщения CM_HINTSHOW. Это сообщение также позволяет изменить текст подсказки перед ее отображением.
Еще один способ — редактирование модуля 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;
После этого можно добавить определение _ONLY_SIMPLE_HINTS_ в свой проект.
Также существует альтернативный способ использования других символов из Unicode, которые визуально напоминают вертикальную черту, например:
U+01C0: 'ǀ'
U+0964: '।'
U+2223: '∣'
U+2502: '│'
...
Эти символы можно попробовать использовать в тексте подсказки, чтобы обойти ограничение на использование символа |.
Важно помнить, что изменение исходных файлов вендора может быть рискованным и не рекомендуется для стандартной практики разработки. Использование официально предоставленных событий и сообщений для обработки подсказок является предпочтительным и безопасным способом решения подобных проблем.
При разработке в Delphi возникает проблема с отображением подсказок из-за особенностей обработки символа вертикальной черты, и для его отображения необходимо использовать специальные методы, такие как обработка событий или переопределение сообщений.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.