我有一个字符串网格,用户可以在其中更改列的颜色。我将颜色存储在看起来像这样的字符串中:columnToColor:= '1;233,233,233' 1是列233; 233; 233是rgb颜色;每当我必须更改颜色时,我都会更改此字符串。它永远不会包含多于一列和一种颜色

在我的drawcellevent中,我正在这样做:

color := Explode(';',columnToColor); //this will return an array
if (length(color)-1 >= 0) then
begin
  if TryStrToInt(color[0], val) then
  begin
    if aCol = StrToInt(color[0]) then
    begin
      cellText := grid.Cells[aCol,aRow];
      grid.Canvas.Brush.Color := TColor(RGB(StrToInt(color[1]),StrToInt(color[2]),StrToInt(color[3])));
      rec := grid.CellRect(aCol,aRow);
      grid.Canvas.FillRect(rec);
      grid.Canvas.TextOut(rec.Left,rec.top,cellText);
    end;
  end;
end;


我正在使用被入侵的StringGrid类从另一个过程调用invalidateCol:

With TCustomStringGrid(grid) do
  InvalidateCol(grid.col)


当我仅更改一列颜色时,此方法有效。我可以自由滚动,但网格仍然会保持良好的列颜色。但是,当我更改另一列的颜色时,仍然可以看到它们的颜色。一旦我水平滚动并返回到列,则仅最后一个彩色的列被着色,其他设置为默认颜色。颜色仅保留在最后一个彩色列上。因此,如果我为2列上色,然后单击第一列,则该单元格的颜色将设置为默认值。我水平滚动整个列1设置为默认颜色。只有第二列会保持其颜色,无论我做什么。

我该如何解决这个问题?

最佳答案

对我来说,这也许变得更加清楚了。问题是您希望网格控件以单独的颜色绘制每列。尽管您的columnToColor字符串仅为单个列指定颜色,但是您希望每个列都可能具有不同的颜色。滚动网格并重新绘制列时,只有在columnToColor中指定的列才具有所需的颜色。

这是所有发生的原因,因为Windows控件需要能够随时完全重新绘制自身。绘制控件后,该控件将不记得其状态。如果它变得无效(控件被拖动,滚动等),则控件必须能够完全重新绘制自身。

您的代码无法做到这一点。由于它仅记住最近修改的列的颜色,因此当需要绘制其他列时,它们将获得默认颜色。您的方法无法成功,因为控件仅跟踪一种单一的列颜色。

解决方案很简单。您需要记住每列的颜色。一种明显的方法是将颜色保留在数组中:

FColumnColor: array of TColor;


要么

FColumnColor: TArray<TColor>;


在更现代的德尔福。甚至TList<TColor>

当您需要更改列的颜色时,可以通过修改FColumnColor[ColIndex]来进行。同样,每当需要绘画时,请从FColumnColor[ColIndex]中读取颜色。

关于delphi - 防止delphi重绘列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26035668/

10-13 02:43