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

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

ошибка при работе с 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?


Наверх

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