![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Над каким элементом в списке курсор. [D7]
Nikfel © (2007-10-06 20:47:00)Подскажите пожалуйста. Как определить над каким элементом в списке(TList) находится курсор мыши. Заранее спасибо.
Nikfel (2007-10-07 20:39:00) [1]Спасибо. Теперь все понятно.
DVM (2007-10-07 20:32:00) [2]
procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
LI: TListItem;
begin
LI := ListView1.GetItemAt(x, y);
if LI <> nil then
caption := inttostr(ListView1.GetItemAt(x, y).Index)
else
Caption := '';
end;
DVM (2007-10-07 20:28:00) [3]
> Скорей всего высоту надо использовать не 13.
Зачем тебе это 13 вообще сдалось? Есть как минимум 2 способа выяснить над каким элементом ListView находится указатель мыши и о обоих тебе уже написали. Но чукча видимо не читатель.
Nikfel (2007-10-07 20:15:00) [4]При горизонтальной полосе прокрутки в TListView:
procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var i:integer;
begin
i:=ListView1.TopItem.Index;
if i>0 then i:=i+1;
caption:=IntToStr(((Y) div 13)+i);
end;
Скорей всего высоту надо использовать не 13. Код возможно нуждается в доработке.
DVM (2007-10-07 11:32:00) [5]
> Такой код намного лудше, чем обработка WM_NCHITTEST
Само по себе WM_NCHITTEST совсем с сабжем не связано, но это сообщение приходит чаще, чем WM_MOUSEMOVE при движении мыши над контролом. Внутри его обработчика и надо выяснять, что за итем под указателем мыши.
> но наверно в компоненте TListView он не пройдет из-за полосы
> прокрутки
Пойдет. Только названия свойств и методов, а также сообщений другие. См, например [14]
> Nikfel ©
А ты вообще, что пытаешься сделать то? Скажи, может есть и другие решения.
Virgo_Style (2007-10-07 10:49:00) [6]
ListView1.GetItemAt()
ListBox1.ItemAtPos()
?
Nikfel (2007-10-07 08:33:00) [7]Большое спасибо. Такой код намного лудше, чем обработка WM_NCHITTEST, но наверно в компоненте TListView он не пройдет из-за полосы прокрутки(горизонтальной).
DVM (2007-10-06 22:58:00) [8]
> Тогда вообще просто.
[10] еще проще. :)
palva (2007-10-06 22:55:00) [9]> или listbox1.ItemHeight :)
Тогда вообще просто.
Вот смотрите, Nikfel ленится посмотреть справку, а мы за его счет приобрели бесценный опыт. Что бы мы без него делали.
DVM (2007-10-06 22:53:00) [10]или LB_ITEMFROMPOINT или listbox1.ItemAtPos()
palva (2007-10-06 22:52:00) [11]> сообщение LB_GETITEMHEIGHT
Ну то есть SendMessage надо использовать?
DVM (2007-10-06 22:51:00) [12]или listbox1.ItemHeight :)
DVM (2007-10-06 22:50:00) [13]
> palva © (06.10.07 22:42) [6]
> Константу 13, наверно можно как-нибудь извлечь через функцию
> API
сообщение LB_GETITEMHEIGHT
palva (2007-10-06 22:42:00) [14]procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Label1.Caption := IntToStr((Y) div 13);
end;
Константу 13, наверно можно как-нибудь извлечь через функцию API
GetSystemMetrix Cм. MSDN
DVM (2007-10-06 21:46:00) [15]
> Или укажите где можно почитать по этой теме информацию
В справке и MSDN. Я думаю, обработка сообщений WM_NCHITTEST приходящих листбоксу или листвью тебе поможет.
Nikfel (2007-10-06 21:22:00) [16]Можно ли небольшой пример. Как это сделать. Или укажите где можно почитать по этой теме информацию понятную для восприятия.
DVM (2007-10-06 21:10:00) [17]
> А над каким может?
TListBox, TListView
Nikfel (2007-10-06 21:10:00) [18]А над каким может?
Desdechado (2007-10-06 21:00:00) [19]TList - невизуальный класс, поэтому курсор над ним быть не может.