Если в CheckListBox достаточно элементов, поэтому у него есть полоса прокрутки, при каждом нажатии на последний элемент она переходит к следующему, что приводит к нежелательному поведению:
- проверка / снятие отметки с следующего элемента вместо того, на который я нажал
Протестировал его как в Delphi XE7, так и в более новой версии, 10,2 Tokyo, и он делает то же самое
Попытка захвата сообщения WM_LBUTTONDOWN и отслеживания его, в результате которого было найдено точное место, где происходят события.
Vcl.Controls.pas
...
procedure TControl.WMLButtonDown(var Message: TWMLButtonDown);
begin
SendCancelMode(Self);
inherited; //there it scrolls by 1 line
if csCaptureMouse in ControlStyle then
MouseCapture := True;
if csClickEvents in ControlStyle then
Include(FControlState, csClicked);
DoMouseDown(Message, mbLeft, []); // it does the check/uncheck
end;
...
Код для воспроизведения: (и перетащите TCheckListBox на форму)
...
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
CheckListBox1.Height := 145; //just so it's short enough
for i := 0 to 30 do
begin
CheckListBox1.Items.Add('Item'+IntToStr(i));
end;
end;
...
Затем нажмите на чекбокс элемента, который показан внизу
Также попытался пройти через модуль, который содержит все о CheckListBox (Vcl.CheckLst, но не нашел ничего пригодного для использования
EDIT
BrakNicku обнаружил, что он может воспроизводить его только с частичными предметами, что, похоже, относится и к мне
Его решение: установите для свойства IntegralHeight значение True, чтобы оно предотвращало эту проблему.