Как отключить прокрутку CheckListBox при нажатии на последний элемент? - PullRequest
2 голосов
/ 24 апреля 2019

Если в 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, чтобы оно предотвращало эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...