Форум: "Основная";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
ВнизКак в 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.037 c