Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сделать Hint для каждой строки в ListBox ? [D5]


NTdim ©   (2002-03-21 12:22:00) 

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


lipskiy   (2002-03-22 20:53:00) [1]

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


Song   (2002-03-22 15:44:00) [2]

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


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

А как сделать так, чтобы этот 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 11:15:00) [4]

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


Song   (2002-03-22 11:12:00) [5]

ActivateHint не нужен


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

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

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.

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


lipskiy   (2002-03-21 17:38:00) [7]

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

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

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

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

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


Song   (2002-03-21 14:01:00) [8]

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

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


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

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

ListBox1.ItemRect(i)


lipskiy   (2002-03-21 13:35:00) [10]

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


lipskiy   (2002-03-21 13:35:00) [11]

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


Song   (2002-03-21 13:33:00) [12]

:)))

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


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

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

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:30:00) [14]

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.


lipskiy   (2002-03-21 13:26:00) [15]

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


NTdim   (2002-03-21 13:24:00) [16]

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


Song   (2002-03-21 12:57:00) [17]


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;


MBo   (2002-03-21 12:25:00) [18]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо