帮忙推荐一个网格控件。

解决方案 »

  1.   

    stringgrid是drawgrid的子孙,并在drawgrid的基础上添加了存储字符串的数据结构,详细的你可以直接看vcl的源代码。要让stringgrid的列居中可以自己绘制单元格,将stringgrid的defaultdrawing设为false,再重载DrawCell就可以了。
      

  2.   

    to  tommyjian(海里的猫):
    能否贴一段重载DrawCell代码看一看??
      

  3.   

    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    var
      s:string;
      r:TRect;
    begin
      with StringGrid1 do
        begin
          Canvas.FillRect(Rect);
          s:=Cells[ACol,ARow];
          r:=Rect;
          DrawText(Canvas.Handle,PChar(s),Length(s),r,DT_CENTER );
        end;
    end;
      

  4.   

    to  singun(singun) :
    按你的代码,运行时就不能对STRINGGRID进行操作了~~
    我试过,用画的运行时就不能进行操作!!
    不知道是不是还要添加什么代码?!
      

  5.   

    参考代码:
    比如想要使字符串网格的第一行字符居中对齐,其他行右对齐,可以通过StringGrid.OnDrawCell事件处理来完成。procedure WriteText(ACanvas: TCanvas; const ARect: TRect; DX, DY: Integer;
      const Text: string; Format: Word);
    var
      S: array[0..255] of Char;
      B, R: TRect;begin
      with ACanvas, ARect do
      begin
      case Format of
      DT_LEFT : ExtTextOut(Handle, Left + DX, Top + DY, ETO_OPAQUE or
      ETO_CLIPPED, @ARect, StrPCopy(S, Text),
      length(Text), nil);  DT_RIGHT : ExtTextOut(Handle, Right - TextWidth(Text) - 3, Top + DY,
      ETO_OPAQUE or ETO_CLIPPED, @ARect, StrPCopy(S, Text), Length(Text), nil);  DT_CENTER : ExtTextOut(Handle, Left + (Right - Left - TextWidth(Text)) div 2, Top + DY, ETO_OPAQUE or ETO_CLIPPED, @ARect,
      StrPCopy(S, Text), Length(Text), nil);
      end;
      end;
    end;
    procedure TBEFStringGrid.DrawCell(Col, Row: Longint; Rect: TRect; State: TGridDrawState);
    var  procedure Display(const S: string; Alignment: TAlignment);
      const
      Formats: array[TAlignment] of Word = (DT_LEFT, DT_RIGHT, DT_CENTER);
      begin
      WriteText(Canvas, Rect, 2, 2, S, Formats[Alignment]);
      end;begin
      case Row of
      0 : { 居中对齐第一行 }
      if (Col < ColCount) then
      Display(Cells[Col,Row], taCenter)
      else
      { 右对齐其他行 }
      Display(Cells[Col,Row], taRight);
      end;end;