Вниз
Скачать: CL | DM;

определить нажатие на checkbox в ListView   Найти похожие ветки 

← →
Yuri Btr ©   (2004-03-06 15:22) [0]

Ув. мастера, подскажите как "красиво" определить что было нажатие  пользователем именно на checkbox в ListView. (Checkboxes=true, Style=vsReport)
События OnClick, OnSelectItem генерируются не позволяя опр. клик на чекбоксе. (например Item может и не выделяться при клике по чекбоксу)
События OnChange, OnChanging генерируются в разных ситуациях, частично их можно отфильтровать с пом. Change=ctState, но всё равно идёт срабатывание при добавлении, уничтожении ListView, перемещении, клике на Item вне чекбокса...


← →
Yuri Btr ©   (2004-03-06 16:18) [1]

Да, забыл сказать заранее спасибо...
:-)
Очччень надо.


← →
Юрий Зотов ©   (2004-03-06 16:44) [2]

procedure TForm1.ListView1Click(Sender: TObject);
const
 CheckState: array[boolean] of string = ("Unchecked", "Checked");
var
 P: TPoint;
 Item: TListItem;
begin
 with ListView1 do
 begin
   P := ScreenToClient(Mouse.CursorPos);
   if GetHitTestInfoAt(P.X, P.Y) = [htOnStateIcon] then
   begin
     Item := GetItemAt(P.X, P.Y);
     if Item <> nil then
       Caption := Format("%d: %s", [Item.Index, CheckState[Item.Checked]])
   end
 end
end;


← →
Yuri Btr ©   (2004-03-06 18:33) [3]

to Юрий Зотов ©
Вот оно - GetHitTestInfoAt+GetItemAt !!!
Спасибо Вам, выручили !


← →
Yuri Btr ©   (2004-03-06 19:44) [4]

Осталась одна лишь проблема - OnClick не генерируется при клике правой кнопкой мыши на чекбоксе, однако чекбокс изменяет своё состояние, глупых людей мало, но всё же неприятный факт...
К тому же правая кнопка не ловится при клике на чекбоксе и на OnMouseUp...
Видимо всё таки нужно создавать компонент от TListView  - и перехватывать в нём сообщения от мыши, также в нём реализовать новое событие OnCheckClick (как в TCheckListBox)


← →
Yuri Btr ©   (2004-03-06 19:55) [5]

Ура.
Всё решилось, вот код:

procedure TForm1.LV1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
var
Item: TListItem;
begin
with (Sender as TListView) do
 begin
  if GetHitTestInfoAt(X,Y) = [htOnStateIcon]
   then
    begin
     Item := GetItemAt(X,Y);
     if Item <> nil
      then
       //do some stuff
    end;
 end;
end;



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.024 c
1-1078409816
t_vic
2004-03-04 17:16
2004.03.28
Ошибка при выполнении программы


4-1073984926
Андрю-ХА
2004-01-13 12:08
2004.03.28
Контекстное меню


8-1068816509
Pa5ha
2003-11-14 16:28
2004.03.28
Структура *.3DS файла


14-1077791522
Undert
2004-02-26 13:32
2004.03.28
PHP ....


14-1077777849
sea
2004-02-26 09:44
2004.03.28
Нужно откомпилять прогу под Unix




   Наверх