Содержание материала

Aвтор: Serzs

 

Предположим, у нас есть список строк, причем все строки или некоторые не влазят по ширине. Пользоваться прокруткой не всегда удобно. Возможно использование другого варианта. Мышкой проводим по списку и, если строка не влазит по ширине, то появляется Hint, содержащий текущую строку целиком, причем прямо поверх самой строки! Идея подходит ? Тогда это можно реализовать, например, так ...

Текст формы примера :

 

Code:

object MainForm: TMainForm

Left = 7

   Top = 121

   Width = 200

   Height = 157

   Hint = '34534535'

   Caption = 'Long hints'

   Font.Charset = DEFAULT_CHARSET

   Font.Color = clWindowText

   Font.Height = -13

   Font.Name = 'MS Sans Serif'

   Font.Style = []

   ShowHint = True

   OnCreate = FormCreate

   PixelsPerInch = 120

   TextHeight = 16

   object ListBox1: TListBox

   Left = 12

     Top = 12

     Width = 165

     Height = 97

     Hint = '1|2'

     ItemHeight = 16

     Items.Strings = (

     '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ'

     'A1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ'

     '1234567890'

     'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

     'ABCD')

     ParentShowHint = False

     ShowHint = True

     TabOrder = 0

     OnMouseMove = ListBox1MouseMove

end

end

 


 

Текст модуля :

Code:

unit Main;

 

interface

 

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls;

 

type

TMainForm = class(TForm)

   ListBox1: TListBox;

   procedure FormCreate(Sender: TObject);

   procedure ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,

     Y: Integer);

private

   { Private declarations }

   FHintRow: Integer; // Номер строки в списке, на которую указывает мышь

 

public

   { Public declarations }

   // Обработчик подсказок

   procedure OnShowHint(var HintStr: string;

     var CanShow: Boolean;

     var HintInfo: THintInfo);

end;

 

var

MainForm: TMainForm;

 

implementation

 

{$R *.DFM}

 

procedure TMainForm.FormCreate(Sender: TObject);

begin

FHintRow := -1;

Application.OnShowHint := OnShowHint; // Установка обработчика

end;

 

procedure TMainForm.OnShowHint(var HintStr: string;

var CanShow: Boolean;

var HintInfo: THintInfo);

var

Pos: TPoint;

begin

with HintInfo do

   if HintControl is TListBox then // Проверка на нужный объект

     with HintControl as TListBox do

     begin

       Pos.X := 0;

       Pos.Y := ListBox1.Tag;

       HintPos := ListBox1.ClientToScreen(Pos);

       HintStr := ListBox1.Hint;

     end;

end;

 

procedure TMainForm.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

var

MousePos: TPoint;

ItemPos: TRect;

RowWidth,

   ItemNum: Integer;

FHint: string;

begin

MousePos.X := X;

MousePos.Y := Y;

ItemNum := ListBox1.ItemAtPos(MousePos, True);

   // Определение номера строки в списке

 

if (ItemNum <> FHintRow) then // Проверка на перемещение мыши на другую строку

begin

   FHintRow := ItemNum;

   if ItemNum <> -1 then // Проверка на наличие элементов в списке

   begin

     ItemPos := ListBox1.ItemRect(ItemNum);

 

     Application.CancelHint; // Снять текущую подсказку

     ListBox1.Tag := ItemPos.Top; // Запоминаем позицию строки по вертикали

 

     FHint := ListBox1.Items[ItemNum];

 

     // Проверка на ширину строки

     RowWidth := ListBox1.Canvas.TextWidth(FHint);

     if (RowWidth > ListBox1.ClientWidth) then

       FHint := FHint + '|'

     else

       FHint := '';

 

     ListBox1.Hint := FHint;

   end

   else

   begin

     ListBox1.Hint := '';

     Application.CancelHint;

     ListBox1.Tag := -1;

   end;

end

end;

 

end.

 


 

Текст проекта :

Code:

program PrjHint;

 

uses

Forms,

Main in 'Main.pas' {MainForm};

 

{$R *.RES}

 

begin

Application.Initialize;

Application.CreateForm(TMainForm, MainForm);

 

Application.ShowHint := True;

Application.HintPause := 100;

Application.HintHidePause := 999999;

 

Application.Run;

end.

 

Автор: Сергей Королев

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить