2013-05-28 2 views
4

Как изменить цвет строк dbgrid, имеющих одинаковое значение в поле в delphi?Изменить цвет строки DBGRID на значение поля в delphi

, например, все строки, которые имеют один и тот же учитель

примечание: эти строки сгруппированы, и приходят друг за другом в DBGrid

заранее спасибо

ответ

14

Вы можете легко это реализовать с помощью DBGrids onDrawColumnCell Событие:

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; 
    DataCol: Integer; Column: TColumn; State: TGridDrawState); 
begin 
if Table1.FieldByName('Teacher').AsString = 'Joe' 
then 
    DBGrid1.Canvas.Brush.Color:=clRed; 
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State); 

end; 

Однако, если вы не знаете имя Учителя, то вам придется реализовать какой-то рекурсивного действия, это моя реализация:

var TeacherStringList : TStringList; 
    lastColorUsed : TColor; 
    AColors : Array of TColor; 


function mycolor: TColor; 
begin 
    result := RGB(Random(256), Random(256), Random(256)); 
end; 

procedure TForm3.Button1Click(Sender: TObject); 
var CurrS : String; 
    Index : Integer; 
begin 

    if TeacherStringList.Count <> 0 then TeacherStringList.Clear; 
    Table1.DisableControls; 
    try 
    while not Table1.Eof do 
    begin 

     CurrS := Table1.FieldByName('Teacher').AsString; 
     if (not TeacherStringList.Find(CurrS,Index)) and (not currS.IsEmpty) 
     then TeacherStringList.Add(CurrS); 
     Table1.Next; 

    end; 
    Table1.First; 
    SetLength(AColors,TeacherStringList.Count); 
    for Index := Low(AColors) to High(AColors) 
    do AColors[Index] := mycolor; 

    finally 
    Table1.EnableControls; 
    end; 

end; 

procedure TForm3.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; 
    DataCol: Integer; Column: TColumn; State: TGridDrawState); 
var Index : integer; 

begin 

    if (TeacherStringList.Find(Table1.FieldByName('Teacher').AsString,Index)) 
    then 
    DBGrid1.Canvas.Brush.Color:= AColors[index]; 

    DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State); 

end; 

procedure TForm3.FormCreate(Sender: TObject); 
begin 
    teacherStringList := TStringList.Create; 
    teacherStringList.Sorted := True; 
end; 

procedure TForm3.FormDestroy(Sender: TObject); 
begin 
    teacherStringList.Free; 
end; 
+0

Это не работает, потому что я не знаю, учителя имя – teocka

+0

Пусть:. Table1.FieldByName («Учитель») AsString = «Joe» в первые 10 строк; Table1.FieldByName ('Учитель'). AsString = 'Jack' в следующих 5 строках; Table1.FieldByName ('Учитель'). AsString = 'Jim' в следующих 8 строках; Мне нужно, чтобы первые 10 строк были серыми, следующие 5 строк были белыми, а следующие 8 строк были серыми, а затем снова белыми – teocka

+1

Пожалуйста, в следующий раз заметьте, что в вопросе важно, чтобы вы предоставили как можно больше данных, обновил мой ответ. – Peter