Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.28;
Скачать: 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 вся ветка

Текущий архив: 2004.03.28;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.023 c
14-1077862572
syte_ser78
2004-02-27 09:16
2004.03.28
Замыкание на себя


3-1077383692
HMT
2004-02-21 20:14
2004.03.28
Как заменить текст в поле dbgrid а ?


3-1077167527
esa
2004-02-19 08:12
2004.03.28
conversion error from string "blob"


1-1074852897
Goida
2004-01-23 13:14
2004.03.28
Что такое TDataModule?


14-1078218849
Eugenez
2004-03-02 12:14
2004.03.28
Ищу СD !!!