Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.18;
Скачать: CL | DM;

Вниз

Как в ListView CheckBoxes отловить событие установки галки?   Найти похожие ветки 

 
Mishenka   (2005-06-28 16:25) [0]

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


 
Nes ©   (2005-06-28 16:53) [1]

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


 
begin...end ©   (2005-06-28 20:15) [2]

> 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.


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


>  [2] begin...end ©


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


 
begin...end ©   (2005-06-28 20:53) [4]

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

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


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

> Mishenka

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


 
ssk ©   (2005-06-29 09:26) [6]

В OnMouseDown:

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


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

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


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

2 Mishenka
можно


 
begin...end ©   (2005-06-29 11:25) [9]

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

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

> Mishenka   (29.06.05 9:35) [7]

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



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

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

Наверх




Память: 0.49 MB
Время: 0.053 c
1-1119647298
мниор
2005-06-25 01:08
2005.07.18
DLL


1-1120122756
LLlMblra
2005-06-30 13:12
2005.07.18
Определение позиции курсора относительно экрана


1-1119709799
webpauk
2005-06-25 18:29
2005.07.18
Конвертация


3-1118303009
Niarond
2005-06-09 11:43
2005.07.18
Запись Blob : pFIBQuery -> ADOQuery


14-1119867598
stone
2005-06-27 14:19
2005.07.18
Начальник тупой?