У меня есть TListView, в котором я хочу отобразить одну конкретную строку с полужирным текстом.Для этого я создал обработчик OnCustomDrawItem следующим образом:
procedure TDataDirHandlingDlg.lvDataFoldersCustomDrawItem(
Sender: TCustomListView;
Item: TListItem;
State: TCustomDrawState;
var DefaultDraw: Boolean);
begin
case GetItemStatus(Item.Data) of
ddNonExistent:
begin
Sender.Canvas.Font.Color := clGrayText;
Sender.Canvas.Font.Style := [];
end;
ddCurrent:
begin
Sender.Canvas.Font.Style := [fsBold];
Sender.Canvas.Font.Color := clBlue;
end;
else
begin
Sender.Canvas.Font.Color := clWindowText;
Sender.Canvas.Font.Style := [];
end;
end;
end;
(Справочная информация: это список определенных каталогов и их свойств. Точно один каталог может быть "Текущим", и это тот, который я хочучтобы подчеркнуть. GetStatusItem возвращает значение перечисления, которое имеет либо ddOK, ddNonExistent, либо ddCurrent).
Это сработало, как я и ожидал, с помощью Delphi 10.2 ("Tokyo") Update 2 , но не работает с помощью Update3 .Чтобы быть более конкретным, цвет шрифта все еще работает.Но стиль шрифта этого не делает.
В исходном коде VCL я вижу, что Vcl.ComCtrls.pas был изменен с Обновления 2 на Обновление 3 в TCustomListView.CNNotify, а вызов SaveDC / RestoreDC был удален вОбновление 3. Я думаю, что это актуально, но мне пока не удалось понять код.
Как видите, я не пытаюсь на самом деле нарисовать текст в обработчике.Я просто меняю свойства холста.
Вопрос в следующем: это просто удача, что код работал в обновлении 2? Нужно ли рисовать текст самостоятельно, или этого должно быть достаточно, чтобы изменить холст и позволить VCL продолжить?с нанесением текста?Если да, то почему он не работает в обновлении 3?