Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Многострочный Hint

Delphi , Синтаксис , Hint подсказки

Многострочный Hint

Необходимо создать соответствующую компоненту которая показывает "быструю подсказку" (Hints) с более чем одной строкой. Компонента наследуется от TComponent и называется TMHint. Hint-текст можно задавать следующим образом: "Строка 1@Строка 2@Строка 3". Символ '@' используется как разделитель строк. Если Вам нравится другой символ - измените свойство Separator. Свойство Active указывает на активность (TRUE) или неактивность (FALSE) "многострочности".


unit MHint;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages,
  Classes, Graphics, Controls, Forms, Dialogs;

type
  TMHint = class(TComponent)
  private
    ScreenSize: Integer;
    FActive: Boolean;
    FSeparator: Char;
    FOnShowHint: TShowHintEvent;
  protected
    procedure SetActive(Value: Boolean);
    procedure SetSeparator(Value: char);
    procedure NewHintInfo(var HintStr: string; 
      var CanShow: Boolean;
      var HintInfo: THintInfo);
  public
    constructor Create(AOwner: TComponent); override;
  published
    property Active: Boolean
      read FActive write SetActive;
    property Separator: Char
      read FSeparator write SetSeparator;
  end;

procedure Register;

implementation

constructor TMHint.Create(AOwner: TComponent);

begin
  inherited 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;

begin
  if FActive then
    begin
      I := Pos(FSeparator, HintStr);
      while I > 0 do
        begin
          HintStr[I] := #13;
          I := Pos(FSeparator, HintStr);
        end;
      if HintInfo.HintPos.Y+10 > ScreenSize then
        HintInfo.HintPos.Y := ScreenSize-11;
    end;
end;

procedure Register;

begin
  RegisterComponents('MyComponents', [TMHint]);
end;

end.



Или вот ещ¸ пример. 



unit Multhnt1;

interface

uses
  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;
begin
for I := 0 to ComponentCount -1 do
  if Components[I] is TControl then
    With TControl(Components[I]) Do
    Begin
      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.pas

unit MHint; 
interface 
uses 
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs; 
type 
  TMHint = class(TComponent) 
  private 
    FScreenSize: Integer; 
    FActive: Boolean; 
    FSeparator: Char; 
    FOnShowHint: TShowHintEvent; 
  protected 
    procedure SetActive(Value: Boolean); 
    procedure SetSeparator(Value: char); 
    procedure NewHintInfo(var HintStr: string; var CanShow: Boolean; var HintInfo: THintInfo); 
  public 
    constructor Create(AOwner: TComponent); override; 
  published 
    property Active: Boolean read FActive write SetActive; 
    property Separator: Char read FSeparator write SetSeparator; 
  end; 

procedure Register; 
implementation 
constructor TMHint.Create(AOwner: TComponent); 
begin 
  inherited 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; 
begin 
  if FActive then 
    begin 
      // Разбить строку подсказки на несколько строк, используя символ разделителя
      I := Pos(FSeparator, HintStr); 
      while I > 0 do 
        begin 
          HintStr[I] := #13; // Заменить символ разделителя на символ новой строки
          I := Pos(FSeparator, HintStr); 
        end; 

      // Аjustirirovat позицию подсказки, чтобы она не выходила за пределы экрана
      if HintInfo.HintPos.Y + 10 > ScreenSize then 
        HintInfo.HintPos.Y := ScreenSize - 11; 
    end; 
end; 

procedure Register; 
begin 
  RegisterComponents('MyComponents', [TMHint]); 
end; 

Multhnt1.pas

unit Multhnt1; 
interface 
uses 
  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 declarations } 
  public 
     { Public declarations } 
  end; 

var 
  Form1: TForm1; 
implementation 

{$R *.DFM} 

procedure TForm1.FormCreate(Sender: TObject); 
Var 
  I: Integer; 
  S: String; 
begin 
   // Перебрать все контролы на форме и форматировать их подсказки
  for I := 0 to ComponentCount - 1 do 
    if Components[I] is TControl then 
      With TControl(Components[I]) Do 
        Begin 
          S := Hint; // Получить строку подсказки
          While Pos('@', S) <> 0 Then // Разбить строку на несколько строк
            S[Pos('@', S)] := #13; 
          Hint := S; // Установить форматированную строку подсказки обратно на контроле
        End; 
end; 
end. 

Советы:

  1. В TMHint вместо использования GetSystemMetrics, чтобы получить размер экрана, рассмотрите более современный подход,such as Screen.Height или Screen.MaxClientHeight.
  2. В NewHintInfo можно использовать регулярное выражение для разбиения строки подсказки на несколько строк.
  3. Вместо перебора всех контролей на форме в Multhnt1, рассмотрите более целевой подход, such as only iterating through controls that have hints set.
  4. Рассмотрите добавление более надежной обработки ошибок и валидации кода для его улучшения.

Альтернативное решение: Вместо создания 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Hint подсказки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-28 05:32:31/0.0071220397949219/1