![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как в 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');