Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.04;
Скачать: CL | DM;

Вниз

Как сделать Hint для каждой строки в ListBox ?   Найти похожие ветки 

 
NTdim ©   (2002-03-21 12:22) [0]

Как сделать Hint для каждой строки в ListBox ? [D5]
Понятно что нужно использовать OnMouseMove
но как взять номер итемса ?


 
MBo ©   (2002-03-21 12:25) [1]

function ItemAtPos(Pos: TPoint; Existing: Boolean): Integer;


 
Song ©   (2002-03-21 12:57) [2]


procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
Var Point:TPoint;
t:Integer;
begin
Point.X:=X;
Point.Y:=Y;
With ListBox1 Do
Begin
t:=ItemAtPos(Point,True);
IF t>-1 then
Begin
// Если размер надписи превышает длину контрола, загружаем его значение в хинт
IF Canvas.TextWidth(Items[t])>Width then Hint:=Items[t] else Application.CancelHint;
End Else Application.CancelHint;
End;
end;


 
NTdim ©   (2002-03-21 13:24) [3]

Огромное спасибо :))


 
lipskiy ©   (2002-03-21 13:26) [4]

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


 
Song ©   (2002-03-21 13:30) [5]

Displays a hint window for the control at a specified position.

procedure ActivateHint(CursorPos: TPoint);

Description

ActivateHint locates the control or menu item at the position specified by CursorPos, where CursorPos represents a screen coordinates in pixels. After locating the control, ActivateHint displays the control’s Hint in a hint window.


 
Andrey007   (2002-03-21 13:31) [6]

Определять номер строки можно ещё так:

NumStr:=Trunc(Y/ListBox1.Canvas.TextExtent(ListBox1.Items[0]).cy);
if ListBox1.TopIndex>0 then NumStr:=NumStr+ListBox1.TopIndex;
if (NumStr>ListBox1.Items.Count-1) or
(ListBox1.Canvas.TextExtent(ListBox1.Items[NumStr]).cx=0) then Exit; // курсор вне текста


 
Song ©   (2002-03-21 13:33) [7]

:)))

В Москву можно и через Камчатку ездить


 
lipskiy ©   (2002-03-21 13:35) [8]

2 Song
Угу, понятно. А как узнать эти точные координаты итемса - чтоб текст совпал? Там ведь еще всякие поля, отступы...


 
lipskiy ©   (2002-03-21 13:35) [9]

И как сменить шрифт хинту?


 
Andrey007   (2002-03-21 13:40) [10]

>А как узнать эти точные координаты итемса - чтоб текст совпал? Там ведь еще всякие поля, отступы...

ListBox1.ItemRect(i)


 
Song ©   (2002-03-21 14:01) [11]

FAQ... и почему интересно люди его не любят...

http://delphi.mastak.ru/cgi-bin/faq.pl?look=1&id=988623788&n=16


 
lipskiy ©   (2002-03-21 17:38) [12]

2 Song
Спасибо за ссылку.
Почему не любят - могу объяснить, почему я не люблю.
По трем причинам.

Первая - хрен найдешь быстро то, что надо. Бывает, что и ключевых слов просто не придумаешь для поиска. Да и разложены вопросы отнюдь не идеально. Да и заголовки вопросов тоже имеют "несправочный" вид. Маленький список вопросов на одом листе и большие промежутки между ними - неприятно читать. В общем, тяжело искать - это раз.

Вторая - нет интерактива. Далеко не все примеры из FAQ работают безусловно. Часто что-то неоговорено. А часто просто не совсем то, что надо.

Третья - я честно хожу в FAQ, когда вопрос возникает впервые. Не найдя ответа - иду в форум, ну и когда начинается диалог, то проще и надежнее спросить тут же новые вопросы в том же направлении.

А вообще это уже треп пошел, модератор вырежет - и правильно сделает. Прошу прощения за мусор.


 
Andrey007   (2002-03-22 10:43) [13]

У меня почему-то это не работает, то есть подсказка не выскакивает:

procedure TPCBPInputForm.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
var NumStr: Integer;
Pnt: TPoint;
begin
Pnt.x:=X; Pnt.y:=Y;
NumStr:=ListBox1.ItemAtPos(Pnt,True);
if NumStr>-1 then
begin // Если размер надписи превышает длину контрола, загружаем его значение в хинт
if Canvas.TextWidth(ListBox1.Items[NumStr])>ListBox1.Width then
begin
Application.Hint:=ListBox1.Items[NumStr];
Application.ActivateHint(Pnt)
end
else Application.CancelHint;
[...]
end
end;

При этом ListBox1.ShowHint=True.

Что я сделал неправильно?


 
Song ©   (2002-03-22 11:12) [14]

ActivateHint не нужен


 
Song ©   (2002-03-22 11:15) [15]

И хинт надо устанавливать не для класса TApplication, а для TListBox


 
Andrey007   (2002-03-22 14:25) [16]

А как сделать так, чтобы этот hint рисовался полностью перекрывая надпись и продолжался после ListBox"a на форме? У меня ListBox лежит на TTabSheet, причём ListBox.Align:=alClient и когда я рисовал DrawText(ListBox.Canvas.Handle,Pchar(ListBox.Items[NumStr]),-1,r,DT_LEFT), то hint не выходил за пределы ListBox"a.


 
Song ©   (2002-03-22 15:44) [17]

По-моему он ограничен клиентской областью. Это ограничение системы.


 
lipskiy ©   (2002-03-22 20:53) [18]

По моему задача сводится просто к тому, чтобы сделать такой же хинт, как, например, в TreeView - он там прекрасно работает и вылазит за пределы окна. М.б. можно это повторить?



Страницы: 1 вся ветка

Текущий архив: 2002.04.04;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.017 c
1-9478
P.
2002-03-25 18:39
2002.04.04
GIF


1-9459
Swinger
2002-03-24 00:26
2002.04.04
ICQ


1-9585
MARcoDEN
2002-03-24 08:20
2002.04.04
Запуск программы


1-9578
michael_B
2002-03-24 22:18
2002.04.04
Подскажите компоненту для создания плавающего меню под стиль OfficeXP


3-9380
vopros
2002-03-12 13:48
2002.04.04
Глупый вопрос...Как по Lookup полю в таблице сделать сортровку?