ListView и окраска ячеек - PullRequest
       40

ListView и окраска ячеек

4 голосов
/ 31 января 2012

У меня есть ListView (vsReport) и StringGrid, и что я хочу, если я нажимаю на какой-то элемент в ListView, то определенные ячейки в StringGrid должны менять цвета. Как мне это сделать?

Путь заполнен 1 (двигаться вверх) и 0 (двигаться вправо), он начинается в левом нижнем углу и заканчивается в правом верхнем углу, и я должен покрасить эти ячейки.


Спасибо за ответы, я справился со своей проблемой, но есть еще одна небольшая проблема, как я могу оставить текст в ячейках видимым? FillRect заполняет всю ячейку.

procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem; Selected: Boolean);
var aRect: TRect;
     a,x,y:integer;
     path:string;
begin
  path:=ListView1.Items[Item.Index].Caption;

  x:=0;
  y:=StringGrid1.RowCount;
for a := 0 to length(path) do
  begin
   if path[a]='1' then y:=y-1 else x:=x+1;
   aRect := StringGrid1.CellRect(x-1,y-1);
   StringGrid1.Canvas.Brush.Color := clBlue;
   StringGrid1.Canvas.FillRect(aRect);
   end;
end; 

1 Ответ

6 голосов
/ 31 января 2012
  1. Поймите, что изменение цвета ячейки должно быть постоянным, поэтому, когда StringGrid перерисовывается снова, например, когда StringGrid скрывается в диалоговом окне, также специальные цвета должны быть перекрашены снова.
  2. Таким образом, вам нужно где-то хранить нужные цвета.Скажем, вы хотите использовать для этого массив, а затем сделайте выбор между:
    • Сохранение специальных цветов вместе с координатами сетки в одномерном массиве.Это хорошо для использования памяти, но вам нужно будет искать во всем этом массиве конкретную координату, которую обеспечивает обработчик OnDrawCell StringGrid (см. Шаг 3),
    • Хранение только специальных цветов в двумерноммассив.Это хорошо для скорости при рисовании, но вам нужно синхронизировать границы столбцов и строк массива со значениями StringGrid,
    • Или, когда вам не нужно свойство Objects StringGrid для каких-либо целей,Вы можете использовать это свойство для хранения цветов, указав тип цвета TObject.Кричите, если вам нужна помощь в этом.
  3. Раскрасьте цветные ячейки в обработчике событий OnDrawCell StringGrid (поиск здесь по переполнению стека для [Delphi] StringGrid OnDrawCell когда требуется помощь с этим).
  4. Событие ListView OnSelectItem раскрывает элемент, по которому щелкают или выбирают иным образом.
  5. Извлекает необходимую информацию из этого элемента илиего подэлементы, чтобы определить, какая ячейка должна быть изменена в каком цвете.
  6. Добавьте эту информацию к выбранному решению хранения на шаге 2.
  7. Поймите, что когда все рисование теперь выполняется "автоматически", достаточно просто позвонить на StringGrid.Repaint.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...