Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Исправление отображения чекбокса внутри DBGrid в Delphi: решение проблемы стиля

Delphi , Компоненты и Классы , TDBGrid

При работе с компонентом 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TDBGrid ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 02:17:32/0.0032598972320557/0