![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать 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;