ilikenba 发表于 2004-12-8 15:10

DBGrid的小用法!

<P>var
  W1: array of Integer;
  W2: array of Integer;</P>
<P>procedure Treckoningform.Orderby(grid: TDBGrid;Column: TColumn;number:Integer);
var
  colwidth,Max:Integer;
begin
  colwidth:=5;
  Max:=5;
  if not(Column.Field is TBlobField ) then
    Tadotable(Column.Field.DataSet).indexFieldNames := Column.Field.FieldName
  else
  begin
    Column.width := max+50;
    exit;
  end;
  with Tadotable(Column.Field.DataSet) do
  begin
     case number of
     1: begin
          case Column.ID of
          3: begin
              if(w1*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then
                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5
              else
                 Column.width :=w1*8+5;
             end;
          4: begin
              if(w1*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then
                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5
              else
                 Column.width :=w1*8+5;
             end;
          7: begin
              if(w1*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then
                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5
              else
                 Column.width :=w1*8+5;
             end;
          else
             begin
               first;
               while not eof do
               begin
                  colwidth := grid.Canvas.TextWidth(Column.Field.AsString);
                  Max:=math.Max(colwidth,Max);
                  Next;
               end;
               if (Max &lt; grid.Canvas.TextWidth(Column.Title.Caption)) or (colwidth = 0) then
                  Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5
               else
                  Column.width := Max+5;
             end;
          end;
        end;
     2: begin
          case Column.ID of
          4: begin
              if(w2*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then
                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5
              else
                 Column.width :=w2*8+5;
             end;
          5: begin
              if(w2*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then
                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5
              else
                 Column.width :=w2*8+5;
             end;
          6: begin
              if(w2*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then
                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5
              else
                 Column.width :=w2*8+5;
             end;
          else
             begin
               first;
               while not eof do
               begin
                  colwidth := grid.Canvas.TextWidth(Column.Field.AsString);
                  Max:=math.Max(colwidth,Max);
                  Next;
               end;
               if (Max &lt; grid.Canvas.TextWidth(Column.Title.Caption)) or (colwidth = 0) then
                  Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5
               else
                  Column.width := Max+5;
             end;
          end;
        end;
     end;
  end;
end;</P>
<P>procedure Treckoningform.suiDBGrid2TitleClick(Column: TColumn);
begin
  Orderby(suiDBGrid2,Column,2);
end;</P>
<P>procedure Treckoningform.suiDBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
var
   DrawString : String;
   sys:TSysOper;
begin
   if (gdSelected in State)then
   begin
     suiDBGrid1.Canvas.Brush.Color:=clFuchsia;//使被选中的一行的颜色变成紫红色
   end
   else
     suiDBGrid1.Canvas.Brush.Color:=clWindow;
   sys:=TSysOper.Create;
   try
     if Column.Field.IsNull=false then
     begin
       case DataCol of
       3: begin
            DrawString:=sys.getSex(Column.Field.CurValue);//得到要显示的字符串。
            suiDBGrid1.Canvas.TextRect(Rect,Rect.Left,Rect.Top,DrawString);
            w1:=math.max(Length(DrawString),w1);
          end;
       4: begin
            DrawString:=sys.getLoginMode(Column.Field.CurValue);
            suiDBGrid1.Canvas.TextRect(Rect,Rect.Left,Rect.Top,DrawString);
            w1:=math.max(Length(DrawString),w1);
          end;
       7:begin
            DrawString:=TimeFormat(Column.Field.CurValue);
            suiDBGrid1.Canvas.TextRect(Rect,Rect.Left,Rect.Top,DrawString);
            w1:=math.max(Length(DrawString),w1);
          end;
       else
          suiDBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
       end;
    end
    else
       suiDBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
  finally
    sys.Free;
  end;
end;</P>
<P>上面是操作DBGrid的两个事件的的例子!Orderby函数起到了一个点击标题排序并调整cell的大小使得显示完全的作用,这里在DBGrid的DrawColumnCell事件中加入将一些想将数据库中的内容换一种显示的方法,DrawString就是要显示的字符串,采用suiDBGrid1.Canvas.TextRect函数重画。这里是根据cell的ID号进行的重画,如果DBGrid是不能拖动的不会出问题,如果要实现拖动,还要动态取得cell的ID号!</P>
页: [1]
查看完整版本: DBGrid的小用法!