При работе с компонентом DBGrid в Delphi может возникнуть проблема с отображением чекбоксов в ячейках, особенно когда речь идет о тематических стилях. Вопрос пользователя касается именно такой ситуации: при перемещении по строкам таблицы стиль чекбокса начинает вести себя некорректно.
Описание проблемы
Пользователь столкнулся с проблемой, что при использовании следующего кода для отображения чекбокса внутри DBGrid возникают странные искажения стиля при перемещении по строкам:
uses Vcl.Themes;
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
...
begin
if Column.Field.DataType = ftBoolean then
begin
...
if ThemeServices.ThemesEnabled then
begin
...
ThemeServices.DrawElement(TDBGrid(Sender).Canvas.Handle, Details, Rect);
end
else
begin
...
DrawFrameControl(TDBGrid(Sender).Canvas.Handle, CheckBoxRectangle, DFC_BUTTON, CtrlState[Column.Field.AsBoolean]);
end;
end;
end;
При этом код работает как ожидалось в обеих тематических стилях VCL (тестировалось в XE2, XE7 и Berlin). Однако при перемещении по строкам возникает визуальный дефект.
Комментарии к проблеме
В комментариях указывается, что возможно, FillRect не должен использовать стандартную кисть для заливки фона, а должен обращаться к сервисам тем для рисования фона родительского элемента.
Подтвержденный ответ
Пользователь нашел решение проблемы, добавив следующие строки кода:
if not (gdFocused in State) then
Grid.Canvas.Brush.Color := StyleServices.GetSystemColor(clHighlight);
Эти строки позволяют корректно отображать фон ячейки, если ячейка не выделена. Вот полный метод с учетом внесенных изменений:
uses Vcl.Themes;
procedure CheckBoxGrid(FieldName: String; ValueCheck: Variant; Grid: TDBGrid; const Rect: TRect; Column: TColumn; State: TGridDrawState);
...
begin
if Column.FieldName = FieldName then
begin
...
if StyleServices.Enabled then
begin
...
StyleServices.DrawElement(Grid.Canvas.Handle, Details, Rect);
if not (gdFocused in State) then
Grid.Canvas.Brush.Color := StyleServices.GetSystemColor(clHighlight);
end
else
begin
...
end;
end;
end;
Альтернативный ответ
Представленный код уже содержит решение проблемы, однако стоит отметить, что использование тематических стилей может потребовать дополнительной настройки в зависимости от версии Delphi и используемых стилей оформления.
Заключение
При работе с чекбоксами в DBGrid важно учитывать особенности тематических стилей и правильно настраивать фон ячеек, чтобы избежать визуальных искажений. Использование методов StyleServices позволяет обеспечить корректное отображение элементов управления в соответствии с текущим стилем оформления.
Пользователь сталкивается с проблемой некорректного отображения стиля чекбокса в компоненте `DBGrid` в Delphi при перемещении по строкам, что связано с использованием тематических стилей и необходимостью правильной настройки фона ячеек.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.