ListView和着色单元格

时间:2012-01-31 18:04:06

标签: delphi listview lazarus tstringgrid

我有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 个答案:

答案 0 :(得分:6)

  1. 意识到单元格的颜色变化应该是永久性的,以便在再次绘制StringGrid时,例如当StringGrid被对话框混淆时,也应该再次绘制特殊颜色。
  2. 因此,您需要在某处存储所需的颜色。假设您要使用数组,然后在以下选项之间进行选择:
    • 将特殊颜色与网格坐标一起存储在一维数组中。这对于内存使用很有用,但是您需要在整个数组中搜索StringGrid的OnDrawCell处理程序(参见步骤3)提供的特定坐标,
    • 仅在二维数组中存储特殊颜色。这对绘制时的速度有好处,但是你需要将数组的列和行边界同步到StringGrid的那一行,
    • 或者,当您出于任何目的不需要StringGrid的Objects属性时,可以通过将颜色与TObject进行类型转换来使用此属性进行颜色存储。如果您需要帮助,请大声喊。
  3. 在StringGrid的OnDrawCell事件处理程序中绘制彩色单元格(在需要帮助的情况下,在此处搜索 [Delphi] StringGrid OnDrawCell 的Stack Overflow)。
  4. ListView的OnSelectItem事件公开了单击或以其他方式选择的项目。
  5. 从该项目或其子项目中检索necessery信息,以确定要以何种颜色更改哪个单元格。
  6. 将该信息添加到步骤2的所选存储解决方案中。
  7. 意识到现在所有的绘画都是“自动”完成的,只需拨打StringGrid.Repaint即可。