Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.038 c
3-1118231725
SaFy
2005-06-08 15:55
2005.07.18
Очистка таблици


4-1116825158
HotSpot
2005-05-23 09:12
2005.07.18
Не удается создать новое сообщение в Outlook Express


1-1120022379
Лёха
2005-06-29 09:19
2005.07.18
Эффекты в компонентах.


3-1117706174
Ega23
2005-06-02 13:56
2005.07.18
Invalid BLOB handle in record buffer


14-1118916224
Yanis
2005-06-16 14:03
2005.07.18
Как придумать программу?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский