Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > TListView


Автор: Unregistered 1.6.2004, 07:51
Привет. Возникла такая проблема: Использую компонент TListView с Checkboxes=true. Теперь нужно отследить момент, когда пользователь "чекнул итем". Как это сделать? Посмотрел по событиям компонента и ничего подходящего не нашел. Спасибо.

Автор: shilnik 1.6.2004, 07:55
А как же onClick?

Автор: Unregistered 1.6.2004, 09:21
Никак. На OnClick не отследишь это состояние итема. Ну в общем-то решение я нашел, не знаю на сколько хорошее:

procedure TfrmMain.ListView1Change(Sender: TObject; Item: TListItem;
Change: TItemChange);
begin

if (Change=ctState) then
begin
if Item.Checked then ..................


if not Item.Checked then .....................
end;

Автор: Girder 1.6.2004, 11:32
Цитата
Ну в общем-то решение я нашел, не знаю на сколько хорошее

Нормальное решение.

Цитата
Никак. На OnClick не отследишь это состояние итема

Да нет, можно.

Для общего развития:

Смотри:
Код

procedure TForm1.XXXClick(Sender: TObject);
var i:integer;
   Item:TListItem;
begin
i:=XXX.Items.Count;
if i>0 then
 begin
  repeat
   dec(i);
   Item:=XXX.Items[i];
   if (Item.Checked) then
    begin
     ...// и делай с ним что хочь
    end;
  until (i=0);
 end;
end;


Если у тебя два миллиона записей, с Checkboxes.
Тогда можно вот так:
Код

var Item:TListItem;

procedure TForm1.XXXClick(Sender: TObject);
begin
if (Item<>nil)and(Item.Checked) then
 begin
   ...// и делай с ним что хочь
 end;
end;

procedure TForm1.XXXMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
Item:=XXX.GetItemAt(X,Y);
end;

Автор: Unregistered 2.6.2004, 08:34
Ну, это ж просто проверка идет на checked. Я может криво выразился... Если использовать онклик, то не будет реакции на пробел. Чекнуть-то и пробелом можно. Ну даже если это и опустить, то в первом варианте не узнаешь какой итем отмечен в данный момент, соответственно именно с ним не сопоставишь конкретные действия (они выполняться для всех чекнутых). Второй вариант тоже не подходит. С итемами связаны разные объекты образованные от разных классов. В момент когда юзер отмечает итем нужно произвести конкретные действия зависящие от связанного с итемом объекта. При простом клике на итеме ничего происходить не должно (не важно отмечен он или нет) в твоем коде это не прокатывает. Кроме того, нужно обработать и переход в состояние not Checked. Тут вообще ерунда получиться. В общем не состояние, а переход в состояние нужно отслеживать.

Автор: Girder 2.6.2004, 09:30
Согласен, я просто показал, что по извращавшись это в принципе реально сделать

Забыл совсем:
В Item.SubItems добавь запись о состоянии, к примеру:
-Item.SubItems.Add('1')-Если выбран
-Item.SubItems.Add('2')-Если не выбран
а потом их изменяй при изменении состоянии

Тогда проверяя Item.Checked и Item.SubItems.Strings[X] ты можеш точно сказать изменилось или нет состояние.

Удачи.

Автор: <Spawn> 2.6.2004, 16:21
А можно не париться и использовать предназначеное для этого событие OnClickCheck

Автор: <Spawn> 2.6.2004, 18:26
Ой сори, не посмотрел про какой компонент идет речь - событие OnClickCheck есть у TCheckListBox, а не у TListView

Автор: Unregistered 3.6.2004, 01:01
Ну вариант с Change работает, на нем и остановлюсь наверное. Спасибо всем.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)