Есть ли ошибка в элементе управления представлением списка Delphi при использовании настраиваемого чертежа?

QC # 101189

Я пытаюсь настроить отображение индикатора выполнения в Delphi TListView , как было предложено ] Ответ NGLN на другой вопрос SO . Это прекрасно работает, за исключением взаимодействия с горячим отслеживанием при рисовании с использованием новой темы проводника, представленной в Vista.

Похоже, что горячее отслеживание и пользовательские события рисования в Delphi мешают друг другу. Например, вывод, который я вижу, выглядит следующим образом:

enter image description here

Текст в столбце 1 должен читаться как элемент 3, но он стирается. Это похоже на ошибку в оболочке Delphi для элемента управления представлением списка, но в равной степени может быть и то, что я делаю что-то не так!

Хотя я разрабатывал это в XE2, то же самое происходит в 2010 году и, предположительно, в XE.

Вот код для воспроизведения этого поведения:

Файл Pascal

unit Unit1;

interface

uses
  Windows, Classes, Controls, Forms, CommCtrl, ComCtrls;

type
  TForm1 = class(TForm)
    ListView: TListView;
    procedure FormCreate(Sender: TObject);
    procedure ListViewCustomDrawSubItem(Sender: TCustomListView;
      Item: TListItem; SubItem: Integer; State: TCustomDrawState;
      var DefaultDraw: Boolean);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  ListView.RowSelect := True;
  ListView.Items.Add.Caption := 'Item 1';
  ListView.Items.Add.Caption := 'Item 2';
  ListView.Items.Add.Caption := 'Item 3';
end;

procedure TForm1.ListViewCustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
var
  R: TRect;
begin
  DefaultDraw := False;
  ListView_GetSubItemRect(Sender.Handle, Item.Index, SubItem, LVIR_BOUNDS, @R);
  Sender.Canvas.MoveTo(R.Left, R.Top);
  Sender.Canvas.LineTo(R.Right-1, R.Bottom-1);
end;

end.

Файл формы

object Form1: TForm1
  Caption = 'Custom Draw List View Bug'
  ClientHeight = 290
  ClientWidth = 554
  OnCreate = FormCreate
  object ListView: TListView
    Align = alClient
    Columns = <
      item
        Caption = 'Column 1'
        Width = 250
      end
      item
        Caption = 'Column 2'
        Width = 250
      end>
    ViewStyle = vsReport
    OnCustomDrawSubItem = ListViewCustomDrawSubItem
  end
end

14
задан Community 23 May 2017 в 11:46
поделиться