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

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

Как в ListView CheckBoxes отловить событие установки галки? [D6, Win2k]


Mishenka ©   (2005-06-28 16:25:00) 

Как в ListView с CheckBoxes = True отловить событие установки и снятия галки?


begin...end   (2005-06-29 11:25:00) [1]

> ssk ©   (29.06.05 9:26) [6]

Позвольте порекомендовать Вам бегло ознакомиться с ответами предыдущих авторов.

> Mishenka   (29.06.05 9:35) [7]

Можно. Открываем MSDN, копаем в сторону LVN_ITEMCHANG INGи изменяем второй пример из [2].


Smash   (2005-06-29 09:46:00) [2]

2 Mishenka
можно


Mishenka   (2005-06-29 09:35:00) [3]

А можно ли у некоторых Item'ов запретить снимать галочку, тобишь допустим у Item'ов 0 и 1, галочка не снималась, даже когда по ней щёлкали?


ssk   (2005-06-29 09:26:00) [4]

В OnMouseDown:

if (htOnStateIcon in LV.GetHitTestInfoAt(X, Y))then //клик на чекбоксе


begin...end   (2005-06-28 21:01:00) [5]

> Mishenka

Забыл добавить: чтобы пример 2 работал, в список uses нужно добавить модуль CommCtrl.


begin...end   (2005-06-28 20:53:00) [6]

> Гаврила ©   (28.06.05 20:51) [3]

Ну уж прям и выпендриться нельзя :-)


Гаврила   (2005-06-28 20:51:00) [7]


>  [2] begin...end ©


Думаю что достаточно варианта 1 + отработки нажатия пробела


begin...end   (2005-06-28 20:15:00) [8]

> Nes ©   (28.06.05 16:53) [1]

Этой проверкой можно проверить состояние элемента, но не отловить изменение его состояния.

> Mishenka   (28.06.05 16:25)

Вижу, по крайней мере, 2 способа.

1. Использовать обработчик ListView.OnMouseDown. В него передаются координаты клика, по которым с помощью метода TCustomListView.GetHitTestInfoAt можно определить область элемента, на которой кликнули. Вот рабочий пример:

procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
const
 States: array [Boolean] of string = ('не отмечен', 'отмечен');
var
 Item: TListItem;
begin
 if Button = mbLeft then
   with Sender as TListView do
   begin
     Item := GetItemAt(X, Y);
     if Assigned(Item) then
       if htOnStateIcon in GetHitTestInfoAt(X, Y) then
         Caption := Format('Индекс элемента: %d, состояние: %s', [Item.Index, States[Item.Checked]])
   end
end.


2. Обрабатывать уведомления, которые ListView посылает контролу-родителю (т.е. контролу, который указан в свойстве ListView.Parent). В частности, при изменении состояния какого-либо из своих элементов ListView посылает родителю уведомление LVN_ITEMCHANGED (разумеется, путём посыла сообщения WM_NOTIFY). Ниже приведён рабочий пример для случая, когда parent'ом для ListView'а является форма. Форме нужно назначить обработчик сообщения WM_NOTIFY.

type
 TForm1 = class(TForm)
   ...  
   private
     procedure WMNotify(var Message: TWMNotify); message WM_NOTIFY;
     ...
 end;

procedure TForm1.WMNotify(var Message: TWMNotify);
const
 States: array [Boolean] of string = ('не отмечен', 'отмечен');
var
 OldChecked, NewChecked: Boolean;
begin
 with Message do
   if NMHdr.hwndFrom = ListView1.Handle then
     if NMHdr.code = LVN_ITEMCHANGED then
     begin
       OldChecked := Boolean(PNMListView(NMHdr).uOldState and (1 shl 13) <> 0);
       NewChecked := Boolean(PNMListView(NMHdr).uNewState and (1 shl 13) <> 0);
       if OldChecked <> NewChecked then
         Caption := Format('Индекс элемента: %d, состояние: %s', [PNMListView(NMHdr).iItem, States[NewChecked]])
     end;
 inherited
end.


Nes   (2005-06-28 16:53:00) [9]

if listview1.Items.Item[0].Checked=true then showmessage('123');


Наверх

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