![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ошибка при работе с ListView
Corona © (2006-11-13 11:52:00)добавляю данные в листвью
================================================== ListView_SetExtendedListViewStyle(List3.Handle, LVS_EX_HEADERDRAGDROP or LVS_EX_TWOCLICKACTIVATE or LVS_EX_GRIDLINES or LVS_EX_FLATSB);
with List3 do
begin
for z := 0 to x do
Columns.Add.Caption := IntToStr(z);
for z := 0 to y do
List3.Items.Add.Caption := IntToStr(z);
end;
==================================================
потом обрабатывю DoubleClick в ListView
и здесь когда ловишь ListView_SubItemHitTest
subitem приходит нормально
а item всегда -1
чего я делаю не так???
Corona (2006-11-13 13:13:00) [1]
> Т. е. горизонтальные координаты праильные, отсюда есть subitem,
> а вертикальные - нет.
>
> поставь в коде ListView.ScreenToClient
пасиб
заработало
во блин оно как
Corona (2006-11-13 13:10:00) [2]
> ну даже ведь визуально можно проверить, на глаз. Взять координаты,
> которые ты передаешь и прикинуть их на листвью. Только
> от угла его самого, а не формы естесственно
хм...
такое ощущение что ScreenToClient координату X нормально переводит
а координату Y переводит, но не совсем верно
если их вычесть ~ ширину заголовка кологок, то вроде начинает работать :)
только как бы ее вычислить точно
интересно, а почему там работало
ничего не понимаю %)
ЮЮ (2006-11-13 13:04:00) [3]
> в дочернем он на всю его дину и ширину
потому [form].ScreenToClient(pt) практически равен нужному ListViewScreenToClient(pt)
> а в родительском - в нижней части на всю ширину
Т. е. горизонтальные координаты праильные, отсюда есть subitem, а вертикальные - нет.
поставь в коде ListView.ScreenToClient
clickmaker (2006-11-13 13:02:00) [4]
> [11] Corona (13.11.06 12:59)
ну даже ведь визуально можно проверить, на глаз. Взять координаты, которые ты передаешь и прикинуть их на листвью. Только от угла его самого, а не формы естесственно
Corona (2006-11-13 12:59:00) [5]
> А ListView в тех же местах форм лежит? Здесь же вызывается
> метод ScreenToClient формы, а не ListView
ListView лежат в разных местах форм
в дочернем он на всю его дину и ширину
а в родительском - в нижней части на всю ширину
ЮЮ (2006-11-13 12:56:00) [6]
> pt := ScreenToClient(pt);
А ListView в тех же местах форм лежит? Здесь же вызывается метод ScreenToClient формы, а не ListView
Corona (2006-11-13 12:56:00) [7]
> проверь, те ли координаты в pt передаешь. Может относительно
> не того окна screentoclient
проверил
subitem определяется то правильно
а вот item ...
где-то в другом месте копать похоже надо
даже придумать не могу где
такое ощущение что самого item'а нет :)
clickmaker (2006-11-13 12:50:00) [8]проверь, те ли координаты в pt передаешь. Может относительно не того окна screentoclient
Corona (2006-11-13 12:27:00) [9]
> вот здесь поподробней
у меня есть основное окно
на нем лежит пустой ListView плюс куча других контролов
код его заполнения и обработчик клика я писал выше
так же из меню вызывается дочернее диалоговое окно
на котром тоже лежит ListView
и заполняется и обрабатывается оно аналогично родительскому
там вот в нем все работает замечательно
проблем нет
а в основном родительском окне в обработчике клика я не получаю значение Item'а (всегда -1), а получаю только SubItem.
понятно объяснил?
зы. могу прислать проект в личку
он не очень большой ~ 1 метр в архиве.
clickmaker (2006-11-13 12:20:00) [10]
> причем фишка еще в чем
> есть дочернее окно в нем именно этот код работает
> а в родительском не пашет
вот здесь поподробней
Corona (2006-11-13 12:18:00) [11]сам то я сишник
на дельфи первый проект делаю
вот и вылезла бяка :(
причем понять не могу где копать
уже код построчно сравнил с работающим в дочернем окне
Corona (2006-11-13 12:14:00) [12]причем фишка еще в чем
есть дочернее окно в нем именно этот код работает
а в родительском не пашет
причем код один в один %)
>Почему бы просто не объявить как TLVHitTestInfo?
SubItemHitTest берет PLVHitTestInfo потому так и сделал :)
>И что в итоге в flags возвращается?
LVHT_NOWHERE
%)
clickmaker (2006-11-13 12:07:00) [13]
> GetMem(ht, sizeof(TLVHitTestInfo));
а это зачем? Почему бы просто не объявить как TLVHitTestInfo?
ht.pt := Point(pt.X, pt.Y); - тоже лишнее движение
И что в итоге в flags возвращается? Константы есть для этого - LVHT_ONITEMICON, LVHT_ONITEMLABEL...
Corona (2006-11-13 12:00:00) [14]вот обработчик DoubleCLick
var
ht: PLVHitTestInfo;
s: string;
k: integer;
Msg: TMsg;
TargetTime: Longint;
pt: TPoint;
begin
GetCursorPos(pt);
pt := ScreenToClient(pt);
GetMem(ht, sizeof(TLVHitTestInfo));
ZeroMemory(ht, sizeof(TLVHitTestInfo));
ht.pt := Point(pt.X, pt.Y);
k := ListView_SubItemHitTest(List3.Handle, ht);
if (ht.iSubItem > 0) and (k <> -1) then
begin
ht.iItem := ht.iItem - 1;
ht.iSubItem := ht.iSubItem - 1;
s := List3.Items.item[ht.iItem].SubItems.Strings[ht.iSubItem];
if CompareStr(s, 'X') = 0 then
List3.Items.item[ht.iItem].SubItems.Strings[ht.iSubItem] := ''
else
List3.Items.item[ht.iItem].SubItems.Strings[ht.iSubItem] := 'X';
end;
FreeMem(ht);
end;
clickmaker (2006-11-13 11:58:00) [15]а в flags что при этом? И что передаешь в pt?