2012-05-10 3 views
0

Я делаю это:Колор StringGrid колонки в зависимости от ColumnName текста

procedure TForm1.BitBtn1Click(Sender: TObject); 
var dtStart: TDateTime; 
    I: Integer; 
begin 
    dtStart := DateTimePicker1.Date; 
    for I := 0 to 7 do 
    AdvStringGrid1.Cells[I+1, 0] := uppercase(FormatDateTime('DD/MM/YYYY  DDD', dtStart + I)); 
    end; 

Есть ли способ, чтобы цвет колонки, когда появится (пример) воскресенье (ВС)? Я бы хотел, чтобы столбец SUN (весь путь вниз) отображался в другом цвете, чем остальные.

ответ

3

Вы можете сделать это, используя событие OnDrawCell (do неDefaultDraw - False). Вот пример с регулярной TStringGrid:

// Sample to populate the cells with the days of the week 
procedure TForm1.FormShow(Sender: TObject); 
var 
    r, c: Integer; 
begin 
    StringGrid1.ColCount := 8; // Ignore fixed column and row for this example 
    StringGrid1.RowCount := 8; 

    for c := 1 to StringGrid1.ColCount - 1 do 
    for r := 1 to StringGrid1.RowCount - 1 do 
     StringGrid1.Cells[c, r] := FormatSettings.ShortDayNames[c]; 
end; 

// Assign this to the StringGrid's OnDrawCell using the Object Inspector 
// Events tab. 
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; 
    Rect: TRect; State: TGridDrawState); 
var 
    CellText: string; 
begin 
    if (ARow > 0) and (ACol > 0) then 
    begin 
    CellText := StringGrid1.Cells[ACol, ARow]; 
    if Pos('Sun', CellText) > 0 then 
    begin 
     StringGrid1.Canvas.Brush.Color := clRed; 
     StringGrid1.Canvas.FillRect(Rect); 
    end 
    else 
     StringGrid1.Canvas.Brush.Color := clWindow; 
    end; 

    // The '+ 4' is from the VCL; it's hard-coded when themes are enabled. 
    // You should probably check the grid's DrawingStyle to see if it's 
    // gdsThemed, and adjust as needed. I leave that as an exercise for you. 
    StringGrid1.Canvas.TextOut(Rect.Left + 4, Rect.Top + 4, CellText); 
end; 

Пример вывода точного кода выше:

enter image description here

Вот второй пример, который выводит только то, что вы хотите (за исключением я не конвертировать СОЛНЦЕ в колпачки):

procedure TForm1.FormShow(Sender: TObject); 
var 
    r, c: Integer; 
begin 
    StringGrid1.DefaultColWidth := 100; 
    StringGrid1.ColCount := 8; 
    StringGrid1.RowCount := 8; 

    for c := 1 to StringGrid1.ColCount - 1 do 
    for r := 1 to StringGrid1.RowCount - 1 do 
     StringGrid1.Cells[c, r] := FormatDateTime('mm/dd/yyyy ddd', 
               Date() + c + r - 1); 
end; 

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; 
    Rect: TRect; State: TGridDrawState); 
var 
    CellText: string; 
begin 
    if (ARow > 0) and (ACol > 0) then 
    begin 
    CellText := StringGrid1.Cells[ACol, ARow]; 
    if Pos('Sun', CellText) > 0 then 
     StringGrid1.Canvas.Brush.Color := clRed 
    else 
     StringGrid1.Canvas.Brush.Color := clWindow; 
    StringGrid1.Canvas.FillRect(Rect); 
    end; 
    StringGrid1.Canvas.TextOut(Rect.Left + 4, Rect.Top + 4, CellText); 
end; 

Вот захват соответствует второму образцу:

enter image description here

+0

В моем случае это не работает. У меня там тоже есть дата. Также это цвет только активных клеток. Я хотел бы покрасить весь столбец (включая фиксированную ячейку), если в имени столбца существует слово SUN. – user763539

+0

Этот код также уничтожает содержимое моей ячейки, поэтому я не вижу ничего ... – user763539

+0

Ум, нет, нет. :) Я добавлю захват экрана. Он также окрасит любую ячейку, содержащую текст 'Sun' (найденный с помощью' Pos' в коде выше), а не только активные ячейки. Вам нужно настроить код в соответствии с вашими конкретными потребностями; то, что я написал, было примером того, как это сделать, но это только отправная точка. :) –

0

Использование процедуры DrawCell - путь. В этом примере рассматривается возможность того, что столбец с «Солнцем» может находиться в любом столбце. Оставьте DefaultDrawing значением по умолчанию - true.


    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; 
     Rect: TRect; State: TGridDrawState); 
    begin 
     with Sender as TStringGrid do 
     if Pos('Sun', Cells[ACol, 0])>0 then begin 
     Canvas.Brush.Color := clRed; 
     Canvas.FillRect(Rect); 
     Canvas.Font.Color := clwhite; 
     Canvas.TextOut(Rect.Left + 2, Rect.Top + 2, Cells[ACol, ARow]); 
     end; 
     end; 

+0

Извините за поздний ответ ... Я был на пару дней. У меня очень странное поведение сетки строк, когда я использую ваш код. Имя заголовка столбца, которое находится в 2-х рядах, внезапно становится единым, а часть, которая была во второй строке, частично отключена. Также вся колонка не окрашена только тогда, когда я нажимаю на ячейку под ней. Я не знаю, как отправлять фотографии здесь, чтобы я мог показать это вам ... – user763539

+0

Как вы размещаете фотографии здесь? У меня нет этого варианта, кроме моего первоначального вопроса ... «Помощь» вообще не помогает ... – user763539

+0

Мой плохой - я не понимал, что вы используете сторонний компонент. Я думаю, что с помощью AdvStringGrid вы можете легко установить цвет. Вам не нужно использовать процедуру DrawCell. Не помогите с фотографиями :( – bobonwhidbey