各位高人:
   怎么才能在StringGrid的Drawcell事件里合并单元格并且在合并的单元格上显示字符呢? 
  我已经在网上抄袭了一段合并单元格的例子 合并是成功了但是 往合并的单元格上写字符串的时候
怎么没显示啊 !! 偶千思不得其解 望各位江湖老大们帮帮偶这个小弟啊!! 谢谢 谢谢  偶在线。。

解决方案 »

  1.   

    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    var
      FrameFlags1, FrameFlags2: DWORD;
      TmpR:TRect;
      Str:String;
    begin
      if (ACol=0) and (ARow=3) then     //第四行第一列
      begin
        TmpR:=StringGrid1.CellRect(3,3);//把区域扩大到第四行第四列.
        Rect.Right:=TmpR.Right;
        (Sender as TstringGrid).Canvas.FillRect(Rect); 
        (Sender as TstringGrid).Canvas.TextOut(rect.Left,Rect.Top+3,'我我');
      end;
      if (ACol in [1..3]) and (ARow=3) then     //如果是第四行第2,3,4列就不画了,因为在第一列已经画了.
        Exit;
      FrameFlags1 := 0;
      FrameFlags2 := 0;
      if goFixedVertLine in StringGrid1.Options then
      begin
        FrameFlags1 := BF_RIGHT;
        FrameFlags2 := BF_LEFT;
      end;
      if goFixedHorzLine in StringGrid1.Options then
      begin
        FrameFlags1 := FrameFlags1 or BF_BOTTOM;
        FrameFlags2 := FrameFlags2 or BF_TOP;
      end;
      if gdFixed in State then
      begin
        Str:='Test';
        StringGrid1.Canvas.Brush.Color:=StringGrid1.FixedColor;
        StringGrid1.Canvas.FillRect(Rect);
        DrawEdge(StringGrid1.Canvas.Handle, Rect, BDR_RAISEDINNER, FrameFlags1);
        DrawEdge(StringGrid1.Canvas.Handle, Rect, BDR_RAISEDINNER, FrameFlags2);
        DrawText(StringGrid1.Canvas.Handle,PChar(Str),Length(Str),Rect,DT_SINGLELINE or DT_VCENTER or DT_CENTER);
      end else
      begin
        Str:=StringGrid1.Cells[acol,arow];
        StringGrid1.Canvas.Brush.Color:=StringGrid1.Color;
        StringGrid1.Canvas.FillRect(Rect);
        DrawEdge(StringGrid1.Canvas.Handle, Rect, BDR_RAISEDINNER, FrameFlags1);
        DrawEdge(StringGrid1.Canvas.Handle, Rect, BDR_RAISEDINNER, FrameFlags2);
        DrawText(StringGrid1.Canvas.Handle,PChar(Str),Length(Str),Rect,DT_SINGLELINE or DT_VCENTER or DT_CENTER);
      end;end;
      

  2.   

    效果一般般 但是没办法啊!!偶水平太菜了 不会重写Grid类
      

  3.   

    //重载 OnDrawCell 事件
    procedure TForm1.SGDrawCell(Sender: TObject; ACol, ARow: Integer;
    Rect: TRect; State: TGridDrawState);
    var
    r:TRect;
    d:TStringGrid;
    s:string;
    ts:TStrings;
    i,n:integer;
    fixed:Boolean;
    begin
    d:=TStringGrid(sender);
    if (Acol=2) and (ARow=0) then
    begin
    r.left:=Rect.left-1-d.colwidths[ACol-1];
    r.top:=rect.top-1;
    r.right:=rect.right;
    r.bottom:=rect.bottom;
    s:=d.cells[ACol-1,ARow];
    end else
    if (Acol=1) and (ARow=0) then
    begin
    r.left:=Rect.left-1;
    r.top:=rect.top-1;
    r.right:=rect.right+d.colwidths[ACol+1];
    r.bottom:=rect.bottom;
    s:=d.cells[ACol,ARow];
    end //////////以上列合并
    else
    if (Acol=0) and (ARow=2) then
    begin
    r.left:=Rect.left-1;
    r.top:=rect.top-1-d.RowHeights[ARow-1];
    r.right:=rect.right;
    r.bottom:=rect.bottom;
    s:=d.cells[ACol,ARow-1];
    end else
    if (Acol=1) and (ARow=0) then
    begin
    r.left:=Rect.left-1;
    r.top:=rect.top-1;
    r.right:=rect.right;
    r.bottom:=rect.bottom+d.RowHeights[ARow+1];
    s:=d.cells[ACol,ARow];
    end ////////以上为行合并
    else
    begin
    r.left:=Rect.left-1;
    r.top:=rect.top-1;
    r.right:=rect.right;
    r.bottom:=rect.bottom;
    s:=d.cells[ACol,ARow];
    end;d.Canvas.brush.color:=d.color;
    d.canvas.Font.color:=$ff0000;Fixed:=false;
    if (Arow begin
    d.Canvas.brush.color:=d.FixedColor;
    d.Canvas.Font.color:=$ff00ff;
    Fixed:=True;
    //d.Canvas.Font.style:=d.Canvas.Font.style+[fsBold];
    end;
    if gdfocused in state then
    begin
    d.canvas.Brush.color:=$00ff00;
    end;
    if fixed then
    begin
    d.Canvas.Pen.color:=$0;
    d.canvas.Rectangle(r);d.Canvas.Pen.color:=$f0f0f0;
    d.Canvas.Pen.Width:=2;
    d.canvas.Moveto(r.left+1,r.top+2);
    d.canvas.Lineto(r.left+r.right,r.top+2);d.Canvas.Pen.color:=$808080;
    d.Canvas.Pen.Width:=1;
    d.canvas.Moveto(r.Left+1,r.bottom-1);
    d.canvas.Lineto(r.left+r.right,r.bottom-1);end else
    begin
    d.Canvas.Pen.color:=$0;
    d.Canvas.Pen.Width:=1;
    d.canvas.Rectangle(r);
    end;
    n:=r.top+4;
    ts:=TStringList.Create;
    ts.CommaText:=s;
    for i:=0 to ts.Count-1 do
    begin
    d.canvas.Textout(r.left+4,n,ts[i]);
    inc(n,d.RowHeights[ARow]);
    end;
    end;
      

  4.   

    //重载 OnTopLeftChange事件,特别是行的合并
    procedure TForm1.SGTopLeftChanged(Sender: TObject);
    var
    d:TStringGrid;
    begin
    d:=TStringGrid(Sender);
    d.Cells[0,1]:=d.Cells[0,1];
    d.Cells[0,2]:=d.Cells[0,2];
    end;end.
      

  5.   

    谢谢各位江湖大哥 偶已经解决了该问题 偶使用了EasyGrid 在也不用受StringGrid 的折磨啦