Есть ли способ избавиться от этой проблемы рисования в элементе управления TListView?

Я использую XE5 Update 2 на 64-разрядной версии Windows 7 (все обновления обновлены).

У меня есть приложение с простым объектом TListView.

object lsvReceipts: TListView
  Left = 0
  Top = 0
  Width = 1382
  Height = 760
  Align = alClient
  Columns = <
    item
      Caption = 'Column 1'
      Width = 100
    end
    item
      Caption = 'Column 2'
      Width = 100
    end
    item
      Caption = 'Column 3'
      Width = 100
    end
    item
      Caption = 'Column 4'
      Width = 100
    end>
  MultiSelect = True
  OwnerData = True
  RowSelect = True
  TabOrder = 0
  ViewStyle = vsReport
  OnData = lsvReceiptsData
  ExplicitLeft = 136
  ExplicitTop = 200
  ExplicitWidth = 521
  ExplicitHeight = 321
end

Вот часть кода pas. Он просто отображает данные из объекта firedac TFDQuery.

procedure TForm3.lsvReceiptsData(Sender: TObject; Item: TListItem);
var index: integer;
begin

 index := Item.Index;
 receiptsQuery.RecNo := index;
 Item.Caption := dockReceiptsQueryDR_.AsString; 
 Item.SubItems.Add(receiptsQueryDOCK_RCPT_ID.AsString);
 Item.SubItems.Add(receiptsQueryRCVD_DATE.AsString);
end;

Как вы можете видеть на изображении ниже, есть некоторые проблемы с перерисовкой, которые возникают, когда я выбираю несколько строк, а затем отменяю их выделение. Если я установлю для OwnerData значение false и добавлю записи в список вручную с помощью метода lsvReceipts.Items.Add, этого не произойдет.

Любые идеи о том, как избавиться от этого? Основываясь на других сообщениях, которые я видел здесь, элемент управления изобилует проблемами. К сожалению, я должен использовать его на данный момент.

И если вам интересно, мне нужен список с несколькими столбцами, где пользователь может выбрать несколько записей. Я начал с использования DBGrid с установленным параметром множественного выбора, однако после его использования функциональность для выбора нескольких строк ограничена (например, SHIFT+Click, SHIFT+PageUp/PageDown не работают). В любом случае, мы планируем перейти на сетку devexpress в будущем, но пока я должен придерживаться элементов управления vcl vanilla.

Спасибо

введите здесь описание изображения


person costa    schedule 01.03.2014    source источник
comment
@Graymatter: кода OnDrawItem нет. Я не реализую это событие. Нужно ли мне?   -  person costa    schedule 01.03.2014
comment
Не совсем исправление, но, возможно, стоит взглянуть на OnDrawItem, поскольку вы можете рисовать элементы самостоятельно. Другой альтернативой является просмотр TVirtualStringTree (code.google.com/p/virtual-treeview), который делает то же самое при использовании в режиме сетки и включенном полном выборе строки. Если вы посмотрите на страницу в расширенной демонстрации и включите параметр toFullRowSelect, вы сможете увидеть, как она выглядит.   -  person Graymatter    schedule 01.03.2014
comment
Установите DoubleBuffered в представлении списка. Если вы не можете по какой-либо причине, обратитесь к предыдущему комментарию.   -  person Sertac Akyuz    schedule 01.03.2014
comment
Это очень странно. Я использую тот же элемент управления именно так, как вы описываете, и не вижу проблемы. Я посмотрю позже.   -  person David Heffernan    schedule 01.03.2014
comment
Это очень странно. Мой контроль, вроде бы такой же, как и у вас, ведет себя не так   -  person David Heffernan    schedule 01.03.2014
comment
@David - В ссылке, которую я разместил, вы, кажется, продублировали ее.   -  person Sertac Akyuz    schedule 01.03.2014
comment
@SertacAkyuz Да, я заметил. Хотя не может сделать это снова.   -  person David Heffernan    schedule 01.03.2014
comment
Спасибо всем за ответы - установка DoubleBuffered=true устраняет эту проблему. Я искал проблему, но не нашел эту статью, указанную Сертаком. Я собираюсь проголосовать за закрытие вопроса.   -  person costa    schedule 03.03.2014