我使用的是绝地组件组(TJvDBGrid)的Delphi 2和DBGrid。现在,我发现当值已知时,定义单元格颜色非常容易,例如:
OnGetCellParams event:
if DBGrid.Field.AsInteger = 0
then Background := clYellow;
但在我的例子中,用户可以定义什么值将具有什么颜色,存储在单独的表中。我的问题是,有没有一种方法可以通过查找单元格值是否有指定的颜色来给单元格着色?
感谢您在这件事上的任何帮助或指导,谢谢。
发布于 2012-07-19 05:53:24
最简单的方法可能是使用表单的OnCreate
填充一个数组,然后在OnGetCellParams
事件中访问该数组。数组应该包含尽可能多的项,如果没有指定颜色,则数组索引为0。(下面是未经测试的即兴代码!)
type
TForm1 = class(TForm)
...
procedure FormCreate(Sender: TObject);
private
FColors: array of TColor;
end;
implementation
procedure TForm1.FormCreate(Sender: TObject);
var
NumRows, i: Integer;
begin
// One row for each possible value for the integer column you're
// trying to color the cell for (eg., if the table can hold a value
// from 0-10, you need the same # of items in the array (array[0..10])
NumRows := NumberOfPossibleValues;
SetLength(FColors, NumberOfPossibleValues);
// Pre-fill the array with the default clWindow color,
// in case a custom color isn't assigned to a value
// (for instance, the user doesn't set a color for a value
// of 7).
for i := 0 to High(FColors) do
FColors[i] := clWindow;
// Assumes your color values are in a database called FieldColors,
// in a datamodule called dmAppData, and that there's a
// column named ColValue indicating the `Field.AsInteger`
// value and the corresponding TColor stored as an integer.
dmAppData.FieldColors.First;
while not dmAppData.FieldColors.Eof do
begin
i := dmAppData.FieldColors.FieldByName('ColValue').AsInteger;
// Might want to put a check here to make sure the value isn't
// more than the number of items in the array!!!
FColors[i] := TColor(dmAppData.FieldColors.FieldByName('Color').AsInteger);
dmAppData.FieldColors.Next;
end;
end;
在您的OnGetCellParams
事件中:
Background := FColors[DBGrid.Field.AsInteger];
您可能希望在OnGetCellParams
中使用局部变量,以确保保持在数组边界内:
Background := clWindow;
i := DBGrid.Field.AsInteger;
if (i > 0) and (i < Length(FColors)) then
Background := FColors[i];
更慢的方法是在OnGetCellParams
事件中为每一行执行一个Locate
:
在OnGetCellParams
中
Background := clWindow;
if dmAppData.FieldColors.Locate('ColValue', DBGrid.Field.AsInteger, []) then
Background := TColor(dmAppData.FieldColors.FieldByName('Color').AsInteger);
https://stackoverflow.com/questions/11550160
复制相似问题