我有一个字符串网格,用户可以在其中更改列的颜色。我将颜色存储在看起来像这样的字符串中: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/