gpt4 book ai didi

delphi - ListView 和着色单元格

转载 作者:行者123 更新时间:2023-12-03 15:26:01 25 4
gpt4 key购买 nike

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

关于delphi - ListView 和着色单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9084606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com