Осуществление OnStateIconClick в TListView
Каждый элемент в представлении списка может иметь иконку рядом с собой. Список иконок определяется свойством SmallImages (или LargeImages). Далее, свойство StateImages определяет дополнительные изображения, которые будут отображаться рядом с каждым элементом в представлении списка.
Каждый элемент в списке Items может быть связан с изображением, устанавливая его свойство StateIndex. Изображение состояния появляется слева от нормального пункта списка.
Стиль Radio для выбора пунктов
Допустим, нужен способ позволить пользователю Выбирать / Отмечать / Помечать один элемент из списка. Не получается использовать свойство Selected, поскольку может быть такая ситуация, когда один пункт должен быть Выбран, тогда как другой Отмечен.
Свойство CheckBoxes не помогает. CheckBoxes позволяет отмечать несколько пунктов одновременно.
Но нужно создать кое-что, подобно RadioGroup, где только один пункт списка будет отмечен одновременно.
А также некоторые пункты были бы non-chekable.
И вот что нужно сделать:
- Использовать StateIndex элемента, чтобы отобразить радиокнопку, подобно изображению для элемента.
- Обработать событие OnClick, чтобы осуществить OnStateImageClick.
- Вывести полужирный шрифт для отмеченного пункта.
// карта позиций изображения состояния в TImageList const lisSelected = 5; lisNotSelected = 4; lisNonSelectable = -1; // дескрипторы ListView OnClick procedure TlvForm.lvClick(Sender: TObject); var hts : THitTests; lvCursosPos : TPoint; li, lii : TListItem; begin inherited; // Позиция курсора мыши, связанного с ListView lvCursosPos := lv.ScreenToClient(Mouse.CursorPos) ; // Где щелкнули? hts := lv.GetHitTestInfoAt(lvCursosPos.X, lvCursosPos.Y); // Находимся на пункте state-clicked if htOnStateIcon in hts then begin li := lv.GetItemAt(lvCursosPos.X, lvCursosPos.Y); if Assigned(li) then begin if li.StateIndex = lisNonSelectable then Exit; for lii in lv.Items do if lii.StateIndex <> lisNonSelectable then lii.StateIndex := lisNotSelectd; li.StateIndex := lisSelected; end; end; end; // ListView AdvancedCustomDrawItem procedure TlvForm.lvAdvancedCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage; var DefaultDraw: Boolean); begin if Assigned(Item) then begin if Item.StateIndex = lisSelected then Sender.Canvas.Font.Style := [fsBold] else Sender.Canvas.Font.Style := []; end; end;
В событии OnClick ScreenToClient конвертирует координаты позиции мыши в координаты TListView. GetHitTestInfoAt определяет какие элементы списка находятся под мышью. Если пользователь нажал на значок состояния, включается htOnStateIcon в результате GetHitTestInfoAt.
Ну все, пробуйте...
Комментарии