delphi:如何更改字符串网格中单元格的颜色

delphi:如何更改字符串网格中单元格的颜色,delphi,background-color,tstringgrid,Delphi,Background Color,Tstringgrid,我想在delphi中更改字符串网格中单元格的背景色(而不是字体) 只有一个单元格,而不是一行或一列 我可以吗 RRUZ:你的程序是正确的,有效的,但在我的程序中不起作用 我的程序: x是整数的全局数组 procedure TF_avalie_salon.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var S: string; be

我想在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;

Rafael链接包含所有您需要的内容,使用事件是绘制StringGrid单元格的方法。检查此仅绘制特定单元格背景的示例

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;

我使用了这些代码,翻译成C++。这里有两个特别的注释,然后我将发布代码

  • 在“StringGrid1”中,属性“DefaultDrawing”必须为FALSE才能工作

  • “Canvas”对象必须是完全限定的:即StringGrid1->Canvas->Font->Color=clBlack

  • 代码:

    void\uu fastcall TForm3::StringGrid1DrawCell(TObject*Sender、int-ACol、int-ARow、TRect和Rect、,
    TGR(州)
    {
    unicode destring uStr=“你好”;
    int k,l;
    char-cc[100];
    如果(真)
    {
    如果((ACol Font->Color=clBlack;
    StringGrid1->Canvas->Brush->Color=clBtnFace;
    如果(ACol==0)
    {
    如果(ARow>1)
    {
    sprintf(抄送,“%5.1f”,行标签[ARow-2]);
    uStr=cc;
    StringGrid1->Canvas->TextRect(Rect,Rect.left+2,Rect.top+2,uStr);
    StringGrid1->Canvas->FrameRect(Rect);
    }
    }
    如果(ARow==0)
    {
    如果(ACol>1)
    {
    sprintf(抄送,“%5.1f”,协作[ACol-2]);
    uStr=cc;
    StringGrid1->Canvas->TextRect(Rect,Rect.left+2,Rect.top+2,uStr);
    StringGrid1->Canvas->FrameRect(Rect);
    }
    }
    }
    其他的
    {
    开关(ACol%2)
    {
    案例0:
    {
    StringGrid1->Canvas->Font->Color=clRed;
    StringGrid1->Canvas->Brush->Color=0x00E1FFF9;
    打破
    }
    案例1:
    {
    StringGrid1->Canvas->Font->Color=clBlue;
    StringGrid1->Canvas->Brush->Color=0x00FFEBDF;
    打破
    }
    }
    StringGrid1->Canvas->TextRect(Rect,Rect.left+2,Rect.top+2,uStr);
    StringGrid1->Canvas->FrameRect(Rect);
    }
    }
    }
    
    谢谢,,,它单独起作用,但在我的过程中不起作用。请在我的问题主体中检查我的过程。谢谢。什么是不起作用的?您是否尝试在设置背景颜色的行中设置brekpoint(
    Canvas.Brush.color:=clGreen;
    )检查应用程序是否达到那个点?鲁兹:是的,我做了一个断点,它是可以到达的。我想我不能使用它,因为你的代码是正确的,它来自应用程序。我不知道该怎么做。这与我的想法或你的想法无关。这是一个不到15行的简单代码,我说不能一起工作,但它们单独工作。现在,如果你能帮上忙,我会非常感激你,但是其他没有帮助的评论都是垃圾邮件。使单元格变绿的代码只有在异常情况下才会执行,这几乎只能在stroint函数中执行。这是故意的吗?是的,andreas,,,我想在出现问题时更改单元格颜色。admin还是modira托尔:我能再问一次这个问题吗(为了完成和清算)这是重复的,在stackoverflow中Reggard customdraw在这里有许多问题。绘制单元格或文本的工作方式相同。您只需要使用正确的属性。为什么要将
    发送方用作TStringGrid
    强制转换以及对
    StringGrid1
    的直接引用。您打算这应该是免费的吗-常设程序,而不是包含
    StringGrid1
    的表单方法,如果是独立的,您设想如何实际调用它?也许您想解释一下为什么您认为此代码有效和/或原始帖子中缺少或不正确的内容……代码的第一部分设置单元格的颜色,并对齐文本居中。代码的第三部分在满足条件时设置某个单元格的颜色。在此代码中,更改单元格颜色的条件是检查是否有空值(如果为“空”)在单元格中,然后用红色cet突出显示。这些过程是专门为客户端使用而编写的。如果用户输入数据不正确或根本没有输入任何内容,则单元格将颜色更改为红色。代码的这一部分检查空值,即列中的最后一个单元格。使用Sender as StringGrid是因为此过程使用fastreport生成报告时继承动态StringGrid
    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;
    
    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);
            }
        }
    }
    
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    var
    i:integer;  
    begin
      with Sender as TStringGrid do
        begin
            Canvas.FillRect(Rect);
            DrawText (Canvas.Handle,
                PChar(Cells[ACol, ARow]),
                Length(Cells[ACol, ARow]),
                Rect, DT_WORDBREAK or DT_EXPANDTABS or DT_CENTER);
        end;
        for i:=2 to  StringGrid1.RowCount - 1 do
        if StringGrid1.Cells[3,i]='' then
          begin
            StringGrid1.Canvas.Brush.Color:=clRed;
              if ((ACol=3)and(ARow=i)) then
                begin
                  StringGrid1.Canvas.FillRect(Rect);
    
                end;
          end;
    
    
    end;