Необходимо создать соответствующую компоненту которая показывает
"быструю подсказку" (Hints) с более чем одной строкой. Компонента
наследуется от TComponent и называется TMHint. Hint-текст можно
задавать следующим образом: "Строка 1@Строка 2@Строка 3". Символ '@'
используется как разделитель строк. Если Вам нравится другой символ -
измените свойство Separator. Свойство Active указывает на активность
(TRUE) или неактивность (FALSE) "многострочности".
unit MHint;
interfaceuses
SysUtils, WinTypes, WinProcs, Messages,
Classes, Graphics, Controls, Forms, Dialogs;
type
TMHint = class(TComponent)
private
ScreenSize: Integer;
FActive: Boolean;
FSeparator: Char;
FOnShowHint: TShowHintEvent;
protectedprocedure SetActive(Value: Boolean);
procedure SetSeparator(Value: char);
procedure NewHintInfo(var HintStr: string;
var CanShow: Boolean;
var HintInfo: THintInfo);
publicconstructor Create(AOwner: TComponent); override;
publishedproperty Active: Boolean
read FActive write SetActive;
property Separator: Char
read FSeparator write SetSeparator;
end;
procedureRegister;
implementationconstructor TMHint.Create(AOwner: TComponent);
begininherited Create(AOwner);
FActive := True;
FSeparator := '@';
Application.OnShowHint := NewHintInfo;
ScreenSize := GetSystemMetrics(SM_CYSCREEN);
end;
procedure TMHint.SetActive(Value: Boolean);
begin
FActive := Value;
end;
procedure TMHint.SetSeparator(Value: Char);
begin
FSeparator := Value;
end;
procedure TMHint.NewHintInfo(var HintStr: string;
var CanShow: Boolean;
var HintInfo: THintInfo);
var
I: Byte;
beginif FActive thenbegin
I := Pos(FSeparator, HintStr);
while I > 0 dobegin
HintStr[I] := #13;
I := Pos(FSeparator, HintStr);
end;
if HintInfo.HintPos.Y+10 > ScreenSize then
HintInfo.HintPos.Y := ScreenSize-11;
end;
end;
procedureRegister;
begin
RegisterComponents('MyComponents', [TMHint]);
end;
end.
Или вот ещ¸ пример.
unit Multhnt1;
interfaceuses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure FormCreate(Sender: TObject);
private{ Private-Deklarationen }public{ Public-Deklarationen }end;
var
Form1: TForm1;
implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
Var I: Integer;
S: String;
beginfor I := 0 to ComponentCount -1 doif Components[I] is TControl thenWith TControl(Components[I]) DoBegin
S := Hint;
While Pos('@',S) <> 0 Do
S[Pos('@',S)] := #13;
Hint := S;
End;
end;
end.
Here is the translation of the content into Russian:
В TMHint вместо использования GetSystemMetrics, чтобы получить размер экрана, рассмотрите более современный подход,such as Screen.Height или Screen.MaxClientHeight.
В NewHintInfo можно использовать регулярное выражение для разбиения строки подсказки на несколько строк.
Вместо перебора всех контролей на форме в Multhnt1, рассмотрите более целевой подход, such as only iterating through controls that have hints set.
Рассмотрите добавление более надежной обработки ошибок и валидации кода для его улучшения.
Альтернативное решение:
Вместо создания custom компонента, like TMHint, можно использовать third-party library или создать простое решение с помощью built-in Delphi components, such as a TMemo control with word wrap enabled.
В статье описывается создание компоненты TMHint, которая позволяет выводить текстовые подсказки с более чем одной строкой, а также управляет активностью и разделителем строк в этих подсказках.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.