delphi: как я могу изменить цвет ячейки в сетке строк

Я хочу изменить цвет фона (не шрифт) ячейки в сетке строк в Delphi.

Всего одна ячейка, а не строка или столбец.

Могу я?


RRUZ: ваша процедура правильная и работает, но моя процедура не работает.

Моя процедура:

x - глобальный массив целых чисел

procedure TF_avalie_salon.StringGrid1DrawCell(Sender: TObject; ACol,
    ARow: Integer; Rect: TRect; State: TGridDrawState);
    var   S: string;
begin
    S := StringGrid1.Cells[ACol, ARow];
    StringGrid1.Canvas.FillRect(Rect);
    SetTextAlign(StringGrid1.Canvas.Handle, TA_CENTER);
    StringGrid1.Canvas.TextRect(Rect,Rect.Left + (Rect.Right - Rect.Left) div 2, Rect.Top + 2, S);
    if (ARow<>0 )AND(acol<>0)AND(gridclick=true) then
    begin
        try
          gridclick:=false;
          x[acol+((strtoint(Edit_hafte.Text)-1)*7),arow]:=strtoint(StringGrid1.Cells[ACol, ARow]);
        except
          x[acol+((strtoint(Edit_hafte.Text)-1)*7),arow]:=0;
          StringGrid1.Cells[acol,arow]:='0';
          with TStringGrid(Sender) do
          begin
            Canvas.Brush.Color := clGreen;
            Canvas.FillRect(Rect);
            Canvas.TextOut(Rect.Left+2,Rect.Top+2,Cells[ACol, ARow]);
          end;
        end;
    end;
end;

Когда я использую Canvas.Brush.Color с приведенным ниже кодом, Canvas.Brush.Color не работает. Если я неактивен ниже кода, я могу изменить цвет ячеек. Но мне нужны оба.

    S := StringGrid1.Cells[ACol, ARow];
    StringGrid1.Canvas.FillRect(Rect);
    SetTextAlign(StringGrid1.Canvas.Handle, TA_CENTER);
    StringGrid1.Canvas.TextRect(Rect,Rect.Left + (Rect.Right - Rect.Left) div 2, Rect.Top + 2, S);

person Arash    schedule 15.07.2011    source источник
comment
Код, который делает ячейку зеленой, выполняется только в случае исключения, и это почти возможно только в функции StrToInt. Это намеренно?   -  person Andreas    schedule 15.07.2011
comment
да, Андреас, я хочу изменить цвет ячейки, когда это создает проблему.   -  person Arash    schedule 15.07.2011
comment
админ или модиратор : можно еще раз задать этот вопрос ( для доработки и очистки )   -  person Arash    schedule 15.07.2011
comment
Это дублируется, здесь в stackoverflow есть много вопросов, касающихся customdraw. Рисование ячейки или текста работает таким же образом. Вам просто нужно использовать правильное свойство.   -  person Rafael Colucci    schedule 15.07.2011


Ответы (3)


Ссылка Rafael содержит все, что вам нужно, используя событие OnDrawCell. способ закрасить ячейки StrignGrid. проверьте этот образец, который рисует только фон определенной ячейки.

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;  Rect: TRect; State: TGridDrawState);
begin
  if (ACol = 3) and (ARow = 2) then
    with TStringGrid(Sender) do
    begin
      //paint the background Green
      Canvas.Brush.Color := clGreen;
      Canvas.FillRect(Rect);
      Canvas.TextOut(Rect.Left+2,Rect.Top+2,Cells[ACol, ARow]);
    end;
end;
person RRUZ    schedule 15.07.2011
comment
спасибо, это работает отдельно, но не в моей процедуре. пожалуйста, проверьте мою процедуру в теле моего вопроса. Спасибо . - person Arash; 15.07.2011
comment
Что вы имеете в виду, что не работает? Вы пытались установить точку останова в строке, где вы установили цвет фона (Canvas.Brush.Color := clGreen;), чтобы проверить, достигает ли приложение этой точки? - person RRUZ; 15.07.2011
comment
РУУЗ: да, я делаю точку останова, она достижима. я думаю, что не могу его использовать, потому что ваш код правильный и он из приложения. я не знаю, что делать. - person Arash; 15.07.2011
comment
дело не в моих мыслях или ваших мыслях. это простой код менее чем в 15 строк, который, как я сказал, не работает вместе, но оба они работают по отдельности. теперь, если вы можете помочь, это так мило, и я буду очень благодарен вам, но другие комментарии, которые не помогают, являются спамом. - person Arash; 16.07.2011

Я использовал эти коды, переведенные на C++. Есть две конкретные заметки, потом выложу код.

  1. В "StringGrid1" свойство "DefaultDrawing" должно быть FALSE, чтобы это работало.

  2. Объект "Canvas" должен быть полностью определен: т.е. StringGrid1->Canvas->Font->Color =clBlack.

КОД:

void __fastcall TForm3::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
      TGridDrawState State)
{
UnicodeString   uStr = "Hello";
int     k, l;
char    cc[100];


if(TRUE)
    {
    if((ACol <= 1) || (ARow <= 1))
        {
        StringGrid1->Canvas->Font->Color = clBlack;
        StringGrid1->Canvas->Brush->Color = clBtnFace;
        if(ACol == 0)
            {
            if(ARow > 1)
                {
                sprintf( cc, " %5.1f", rowLabels[ARow - 2]);
                uStr = cc;
                StringGrid1->Canvas->TextRect( Rect, Rect.left+2, Rect.top+2, uStr);
                StringGrid1->Canvas->FrameRect(Rect);
                }
            }
        if(ARow == 0)
            {
            if(ACol > 1)
                {
                sprintf( cc, " %5.1f", colLabels[ACol - 2]);
                uStr = cc;
                StringGrid1->Canvas->TextRect( Rect, Rect.left+2, Rect.top+2, uStr);
                StringGrid1->Canvas->FrameRect(Rect);
                }
            }
        }
    else
        {
        switch (ACol%2)
            {
            case 0:
                {
                StringGrid1->Canvas->Font->Color = clRed;
                StringGrid1->Canvas->Brush->Color = 0x00E1FFF9;
                break;
                }
            case 1:
                {
                StringGrid1->Canvas->Font->Color = clBlue;
                StringGrid1->Canvas->Brush->Color = 0x00FFEBDF;
                break;
                }
            }
        StringGrid1->Canvas->TextRect( Rect, Rect.left+2, Rect.top+2, uStr);
        StringGrid1->Canvas->FrameRect(Rect);
        }
    }
}
person wGraves    schedule 26.09.2012

person    schedule
comment
Почему вы используете приведение Sender as TStringGrid, а также прямую ссылку на StringGrid1. И вы предполагаете, что это должна быть автономная процедура, а не метод формы, содержащей StringGrid1, и если она автономная, как, по вашему мнению, она будет называться? - person MartynA; 11.03.2018
comment
Возможно, вы захотите объяснить, почему, по вашему мнению, этот код работает и/или чего не хватало или что было неверно в исходном посте... - person Francesco B.; 11.03.2018
comment
Первая часть кода задает цвет ячейки, а также выравнивает текст по центру. Третья часть кода задает цвет определенной ячейки при выполнении условия. В этом коде условие изменения цвета ячейки - проверка на пустое значение, если в ячейке пусто, то оно выделяется красным цетом. - person Nigth F0X; 11.03.2018
comment
эти процедуры были специально написаны для использования клиентами. Если пользователь вводит данные неправильно или вообще ничего не вводит, ячейка меняет цвет на красный. Этот раздел кода проверяет наличие пустых значений, последней ячейки в столбце. - person Nigth F0X; 11.03.2018
comment
Sender as StringGrid используется, поскольку эта процедура наследует динамический StringGrid при создании отчетов с помощью fastreport. - person Nigth F0X; 11.03.2018
comment
Имо, ваш код - непродуманный беспорядок. Я предлагаю вам удалить его, потому что он будет иметь нулевую ценность для будущих читателей (в этом смысл SO) - person MartynA; 11.03.2018
comment
Возможно код был написан быстро под задачу, для красоты кода не пошло, после написания кода не добавилось - person Nigth F0X; 11.03.2018
comment
задача заключалась в том, чтобы выровнять текст по центру и проверить наличие нулевого значения в ячейке - person Nigth F0X; 11.03.2018
comment
Спасибо за ответ, это было полезно для меня. Я использую C++, поэтому для меня все равно весь код Delphi выглядит как беспорядок :) - person Max Kielland; 26.08.2020