Исправление Чекбокса в TListView в Режиме vsReport в Delphi
Вопрос, поставленный пользователем, заключается в необходимости добавления чекбокса в определенный столбец TListView, который находится в режиме отображения vsReport и имеет три столбца. Пользователь пытается реализовать чекбокс в третьем столбце, используя метод CustomDrawSubItem, но сталкивается с проблемами при отображении чекбокса и других столбцов списка.
Оригинальный код с ошибкой
Исходный код, предоставленный пользователем, содержит ошибку в логике определения DefaultDraw. В результате этого чекбокс не отображается, а столбцы списка отображаются некорректно. Важно понимать, что если DefaultDraw установлен в True, то VCL самостоятельно выполнит отрисовку элемента, и наоборот, если False - отрисовку должен выполнить пользовательский код.
Исправленный код
procedure TForm15.ListView1DrawItem(Sender: TCustomListView; Item: TListItem;
Rect: TRect; State: TOwnerDrawState);
var
r: TRect;
i: Integer;
s: string;
size: TSize;
h: HTHEME;
begin
FillRect(Sender.Canvas.Handle, Rect, GetStockObject(WHITE_BRUSH));
r := Rect;
inc(r.Left, PADDING);
for i := 0 to TListView(Sender).Columns.Count - 1 do
begin
r.Right := r.Left + Sender.Column[i].Width;
if i <> 2 then // Индексация столбцов начинается с 0
begin
if i = 0 then
begin
s := Item.Caption;
// Отрисовка заголовка и т.д. (код не представлен)
end
else
s := Item.SubItems[i - 1];
Sender.Canvas.Brush.Style := bsClear;
DrawText(Sender.Canvas.Handle,
PChar(s),
length(s),
r,
DT_SINGLELINE or DT_VCENTER or DT_LEFT or DT_END_ELLIPSIS);
end
else // Отрисовка чекбокса в третьем столбце
begin
size.cx := GetSystemMetrics(SM_CXMENUCHECK);
size.cy := GetSystemMetrics(SM_CYMENUCHECK);
if UseThemes then
begin
h := OpenThemeData(Sender.Handle, 'BUTTON');
if h <> 0 then
begin
// Код для отрисовки чекбокса с использованием тем
end;
end
else
// Код для отрисовки чекбокса без использования тем
// ...
end;
inc(r.Left, Sender.Column[i].Width);
end;
end;
Настройка свойств TListView
Установите свойство OwnerDraw в True для TListView.
Убедитесь, что размеры столбцов настроены корректно и третий столбец предназначен для отображения чекбокса.
Альтернативный подход
Если полностью переходить на режим OwnerDraw не хочется, можно попробовать следующий подход:
Установите ширину первого столбца (капшн) в 0, чтобы он не отображался.
Разместите метки в первом подстолбце (втором столбце) и затем чекбоксы.
Используйте CustomDrawSubItem для отрисовки меток, например, функцией TextOut.
Заключение
Исправление заключается в корректном использовании DefaultDraw и перерисовке элементов списка вручную. Важно помнить, что для отображения чекбокса следует использовать подходящие функции отрисовки, такие как DrawThemeBackground или DrawFrameControl, в зависимости от использования тем оформления.
Пользователь столкнулся с проблемой корректного отображения чекбокса в третьем столбце `TListView` в режиме `vsReport` в Delphi, используя метод `CustomDrawSubItem`, и ищет решение для правильной настройки отрисовки элементов списка.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.