Delphi ListView和着色单元格

Delphi ListView和着色单元格,delphi,listview,lazarus,tstringgrid,Delphi,Listview,Lazarus,Tstringgrid,我有ListView(vsReport)和StringGrid,我想要的是,如果我单击ListView中的某个元素,StringGrid中的特定单元格必须更改颜色。我该怎么做 路径由1(上移)和0(右移)填充,从左下角开始,到右上角结束,我必须给这些单元格上色 谢谢你的回答,我已经解决了我的问题,但是还有一个小问题,我如何让单元格中的文本可见?FillRect填充整个单元格 procedure TForm1.ListView1SelectItem(Sender: TObject; Item:

我有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; 
  • 认识到单元格的颜色变化应该是永久性的,因此当再次绘制StringGrid时,例如当StringGrid被对话框模糊时,也应该再次绘制特殊颜色
  • 因此,您需要将所需的颜色存储在某个位置。假设您要使用一个数组,然后在以下选项中进行选择:
    • 将特殊颜色与栅格坐标一起存储在一维数组中。这有利于内存使用,但您需要在整个数组中搜索StringGrid的
      OnDrawCell
      处理程序(参见步骤3)提供的特定坐标
    • 仅在二维数组中存储特殊颜色。这有助于提高绘图速度,但需要将数组的列和行边界与StringGrid的列和行边界同步
    • 或者,当您出于任何目的不需要StringGrid的
      对象
      属性时,您可以通过在
      对象
      之间键入颜色来将此属性用于颜色存储。如果你需要帮助,就大声喊
  • 在StringGrid的
    OnDrawCell
    事件处理程序中绘制彩色单元格(在堆栈溢出上搜索需要帮助的时间)
  • ListView的
    OnSelectItem
    事件公开单击或以其他方式选择的项目
  • 从该项或其子项中检索必要的信息,以确定要以何种颜色更改哪个单元格
  • 将该信息添加到步骤2所选的存储解决方案中
  • 要知道,当所有的绘画都“自动”完成时,只需调用
    StringGrid.Repaint
    就足够了

  • 欢迎来到StackOverflow。到目前为止,您尝试了哪些不起作用的方法?这不是一个“请帮我做作业”的网站。我们非常乐意尝试并指导您找到解决方案,或者帮助您找出为什么您所做的不起作用,但您必须表明您自己已经为此付出了一些努力。请编辑您的问题,以提供您迄今为止尝试的代码,并解释它是如何无法按预期工作的,这里有人可以帮助您找出如何修复它。谢谢。:)+1.回答得很好,详细程度也很好,没有回答过度。:)