![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ListView (vsReport, CheckBoxes=True) [D5, Win2k]
Fktrc © (2004-09-07 13:14:00)Hello, All.
Мне требуется отловить "событие" OnChecked для ListView. События такого, конечно, нет, в этом и проблема. Пытался вешаться на OnChanging/OnChange - в итоге куча посторонних сработок. Отделить в них события, возникающие при изменении св-ва Item.Checked от событий, возникающих при перемещении курсора по ListView, я не смог.
Срабатывать "событие" должно как от изменения CheckBox'а на выделенном ListItem'е клавишей пробела, так и по щелчку на CheckBox, припаянному к неактивному в данный момент ListItem'у.
Вешать слежение за крыжиками на отдельный поток можно, но нежелательно, для приемлемого времени реакции поток должен сканировать список с большой частотой и плюс синхронизация с главным потоком. А список может содержать до нескольких сотен, если не тысяч, элементов.
Как можно изящно решить проблему?
Fktrc (2004-09-08 13:13:00) [1]Спасибо.
Ozone (2004-09-08 05:29:00) [2]Item := clientList.GetItemAt(X,Y); => Item := ListView1.GetItemAt(X,Y);
Ozone (2004-09-08 05:28:00) [3]Тоже в свое время столкнулся с этой проблемой
procedure TFServer.ListView1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
Item: TListItem;
begin
if htOnStateIcon in ListView1.GetHitTestInfoAt(X, Y) then begin
Item := clientList.GetItemAt(X,Y);
if Item.Checked then {...}
else {...}
end
end;
Fktrc (2004-09-08 04:58:00) [4]Спасибо, посмотрю.
Семен Сорокин (2004-09-07 14:25:00) [5]Fktrc © (07.09.04 13:14)
посмотрите реализацию ф-ий ListView_GetCheckState, ListView_SetCheckState из commctrl.pas может поможет в решении
проблемы.
TUser © (07.09.04 13:57) [1]
не всегда ведь Checked можно поменять нажатием пробела, здесь именно OnChange надо юзать.
TUser (2004-09-07 13:57:00) [6]OnClick + ItemAtPos