【问题标题】:ListView and coloring celllsListView 和着色单元格
【发布时间】:2012-01-31 18:04:05
【问题描述】:

我有 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; 

【问题讨论】:

  • 欢迎来到 StackOverflow。到目前为止,您尝试了哪些不起作用的方法?这不是一个“请为我做作业”的网站。我们非常乐意尝试并引导您找到解决方案,或帮助您弄清楚为什么您正在做的事情不起作用,但您必须证明您自己已经为此付出了一些努力。请编辑您的问题以提供您迄今为止尝试过的代码,并解释它如何无法按您的预期工作,这里有人可以帮助您弄清楚如何修复它。谢谢。 :)

标签: delphi listview lazarus tstringgrid


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

【讨论】:

  • +1。很好的答案,很好的细节水平,没有过度回答。 :)
猜你喜欢
  • 2013-01-09
  • 2011-08-19
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 2016-05-05
相关资源
最近更新 更多