数学建模社区-数学中国

标题: DBGrid的小用法! [打印本页]

作者: ilikenba    时间: 2004-12-8 15:10
标题: DBGrid的小用法!
<>var
3 g1 ?( P, L9 T9 d+ U  W1: array[1..8] of Integer;5 H# Z( h+ j2 e+ E# {
  W2: array[1..8] of Integer;</P>
, w4 D* `7 s  g<>procedure Treckoningform.Orderby(grid: TDBGrid;Column: TColumn;number:Integer);" c. U5 }: T3 }+ T: |# N
var7 ^  X3 l4 f$ ]/ n' k
  colwidth,Max:Integer;
7 C* ]$ W' C0 Pbegin4 T, @* x' N: z! r8 V- w7 o- e
  colwidth:=5;
' c, X: c, ?: P& F, C, f' O6 C: W9 @  Max:=5;4 M- K6 H2 T1 @1 l0 X
  if not(Column.Field is TBlobField ) then
3 l$ R" x: b0 p. Z! F8 U2 g# v6 c' ~    Tadotable(Column.Field.DataSet).indexFieldNames := Column.Field.FieldName4 n3 z; P/ z* t$ q2 j) q
  else8 U6 Q' H- \+ r" F# K9 {: b
  begin0 T$ s- L0 Q9 P& p# y: ?' P
    Column.width := max+50;. ?* G% `6 P' Y& t
    exit;# B1 `% K6 G1 j6 o2 ~
  end;
2 R: R6 p# z( N% ^$ r$ B; C  with Tadotable(Column.Field.DataSet) do
) T) `. a4 Z; `2 G  B  r  begin
, p/ ]* J. J. S6 ?/ G& y     case number of
. ?4 B6 s0 [; E5 z5 w3 T$ X     1: begin
8 ]( ^/ b3 Y1 l' y          case Column.ID of
8 \* M/ c7 f9 c5 b$ F/ C* g/ m          3: begin# `6 K6 y2 ]& }0 U4 e
              if(w1[3]*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then" N4 O$ D( M: @% h4 b4 w  m: @
                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5
  ~# F' ^/ t; m6 Y2 B              else$ A. A+ J2 D$ p6 f
                 Column.width :=w1[3]*8+5;! D& {, |% h( O, f3 l& J
             end;5 W( i0 _* [3 ?& w# u# T/ `) V
          4: begin0 U0 U% E6 t7 d
              if(w1[4]*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then1 n6 k+ U, G2 q0 e+ k. f
                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5  v1 H9 o& h7 D, a- b
              else
6 v8 Y, ]0 I+ u' d4 ?+ v                 Column.width :=w1[4]*8+5;" T4 m0 G( w; V# Z4 C6 F2 x
             end;6 g7 u9 L: \; W6 ~! f
          7: begin/ o- Y1 v* G8 K8 y; k/ m
              if(w1[7]*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then
" F5 _& V/ r- X# s+ a                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+55 M/ ]4 K. t" t* V6 z
              else- K; U6 g' T) Y( J/ }
                 Column.width :=w1[7]*8+5;
$ c2 ?* K" ?/ h( R7 s             end;
5 d. e) b  m! C( K2 Y1 K          else& P/ z3 j  `: ]8 Y
             begin* r# r0 S- ]8 |# }9 j1 g
               first;2 q- E. I/ o5 X+ G& D+ e* D, S  o
               while not eof do
( m; d4 J) T' i               begin
# C! W$ z$ G9 |; I8 x& o                  colwidth := grid.Canvas.TextWidth(Column.Field.AsString);
5 P4 y" Z6 l& i4 a                  Max:=math.Max(colwidth,Max);
' L6 h6 c( Z7 P: U7 N                  Next;; j, M' X4 l% q
               end;9 @3 J6 F) s' i' N
               if (Max &lt; grid.Canvas.TextWidth(Column.Title.Caption)) or (colwidth = 0) then
1 A# P0 Z2 g7 ~; C6 |" b$ H                  Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+56 F9 a$ ?7 e8 @' [( V; N  |
               else# P. R& B' K& ?' [: e1 h8 K
                  Column.width := Max+5;
+ v& T$ \% g8 h" x5 M             end;7 _- |: ^. ]* J( V
          end;/ e9 X* `9 ]& U, T9 j0 r
        end;( F/ }; Q  Z5 m5 S
     2: begin  [4 H. ^. l" v
          case Column.ID of4 m/ Z( |$ F* ?8 H% V' v3 B
          4: begin
; V; [; R7 b  j% z4 D0 T5 T3 m$ x              if(w2[4]*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then
* I6 A% ~( ]) n3 d0 H7 O( J                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+54 y% T. g5 k$ z
              else. C9 h1 g$ F' }; c3 ^
                 Column.width :=w2[4]*8+5;2 q9 a- m' H  `6 p
             end;
( V( `- Y. _( x4 }          5: begin7 O) Z) Y9 F) i! ^
              if(w2[5]*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then, }# C, S6 B, C* q; Q+ |) X
                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+52 l! C8 X7 L9 e8 I$ s. {
              else
1 Y8 @& Q; J. v4 J- S# u                 Column.width :=w2[5]*8+5;
/ \% c7 h- g; n3 G             end;
5 p( Q% T; s( v1 k0 B          6: begin4 B  p5 K8 l4 ^6 J+ S
              if(w2[6]*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then' r* `/ R8 w9 x3 R" N
                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+54 M4 a) D% A5 v' R! g% x1 `. l
              else# L8 v7 D% m8 S$ E& n
                 Column.width :=w2[6]*8+5;
0 d  D3 |/ D1 ]" ]% C1 E             end;# S' x- ~  {/ A: d3 g" J
          else
, B& E+ F. ?" Q             begin0 G9 B: b1 `4 g+ W* L, w
               first;
8 I8 ^) [8 T; R; }" U) z0 H               while not eof do
) Z+ Q  M" x2 k! x/ K               begin
% D9 C! X* ^9 v* N% ~. X                  colwidth := grid.Canvas.TextWidth(Column.Field.AsString);
+ z5 _( J/ J5 H6 ], F0 T. I# Z                  Max:=math.Max(colwidth,Max);
  f7 r- g8 A- T8 t( u                  Next;( e/ K. P. S1 b' d; L) @5 l" ^7 F
               end;
& [5 N; t. \% O$ C& ]  k6 n               if (Max &lt; grid.Canvas.TextWidth(Column.Title.Caption)) or (colwidth = 0) then
  Q; X/ I; `) [7 H& t* J                  Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+59 O( f+ b- H  e$ d% t; w: Z# B
               else8 P  P* }* J3 U; V
                  Column.width := Max+5;
+ P, p! m. M! a5 A! g' @             end;
- t4 S  t8 {3 E. O: B" J          end;; U- i0 J1 z3 k2 M8 ]& q# t" F
        end;
) _6 k3 H% G8 I, G: L4 p/ B; @7 }     end;
2 s$ a+ F. [% N, l2 @1 [" z6 t  end;! A' \6 O) s, @1 a3 C% P! o0 }# ]6 |
end;</P>5 ~4 O4 ?+ @+ g8 }0 @' @! y
<>procedure Treckoningform.suiDBGrid2TitleClick(Column: TColumn);
- b; l( ~7 i: s2 S* |begin! w) r% r# r" d2 w6 b% B' a; A* d
  Orderby(suiDBGrid2,Column,2);
" Q1 E$ n( p% A' [+ Tend;</P>; q$ R, [7 B2 \& A# {- K
<>procedure Treckoningform.suiDBGrid1DrawColumnCell(Sender: TObject;
1 R& ?; K3 [" p  const Rect: TRect; DataCol: Integer; Column: TColumn;+ o' E# M+ s/ M$ R5 t3 b- A
  State: TGridDrawState);
$ h) K8 Q, C7 s5 avar3 M7 |3 X3 n6 A1 u+ w
   DrawString : String;
# ?5 C, y/ [. z0 T- a3 O   sys:TSysOper;5 w) `" U% W5 W
begin3 Z, Y' e8 U% X2 H6 O$ z
   if (gdSelected in State)then
5 |% X  U$ x  Q0 b2 v) H   begin
, o! X+ H0 z$ T  m     suiDBGrid1.Canvas.Brush.Color:=clFuchsia;//使被选中的一行的颜色变成紫红色  g' H5 _: R  r' y% @
   end% t- R6 v) c6 w6 E# B; A  T, x
   else& q) k: w+ a2 [( f6 Z. S+ G
     suiDBGrid1.Canvas.Brush.Color:=clWindow;7 M5 S$ }) Y  D1 Z
   sys:=TSysOper.Create;6 ^% h; v4 H2 o! v0 @0 b+ R3 Z2 z0 [
   try+ m  v1 z" R1 o4 t$ k8 R* W
     if Column.Field.IsNull=false then
( M& @+ Z/ L2 B1 }' h& C) r     begin
  ^4 w  h! T& w( x       case DataCol of' z: s3 ]' Q1 S) z1 w3 ^
       3: begin
/ @$ U2 G* [8 F9 P            DrawString:=sys.getSex(Column.Field.CurValue);//得到要显示的字符串。
- T' g! E9 k  S" u: Z* Y            suiDBGrid1.Canvas.TextRect(Rect,Rect.Left,Rect.Top,DrawString);
7 M% A. @7 s9 l% G            w1[3]:=math.max(Length(DrawString),w1[3]);
. Y5 `6 k2 K$ I$ \0 M          end;
* P: ?" l1 [; x; y5 b; G, `       4: begin
, H5 i. x! C. Q! |/ P0 C            DrawString:=sys.getLoginMode(Column.Field.CurValue);* q) H: `* _* Y4 p
            suiDBGrid1.Canvas.TextRect(Rect,Rect.Left,Rect.Top,DrawString);
# n' U7 M6 l; C. ~+ v* v            w1[4]:=math.max(Length(DrawString),w1[4]);
% o+ ?& @2 z% o          end;# e( G) Y3 U2 z
       7:begin
& J  v  N8 X" V5 i4 S% {  d            DrawString:=TimeFormat(Column.Field.CurValue);/ S0 U1 e' ]/ ~' ~' J
            suiDBGrid1.Canvas.TextRect(Rect,Rect.Left,Rect.Top,DrawString);! a- N  V% J6 ^6 k* x  g
            w1[7]:=math.max(Length(DrawString),w1[7]);
! h/ }, H# l, P, i0 q          end;& s1 v+ `; Y1 `  @
       else
5 O4 W1 M2 D: ?% y. G& r          suiDBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);8 P. j3 N% |" m! l1 F
       end;: K7 O. _  }% i. c4 k' z* Y
    end) m% l7 h" c: m) [# w  ~
    else
" C( X7 H1 s' D* l  r, \* a: H! A       suiDBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
0 |/ C" d& q, f7 X* a  finally7 N% ?1 Q/ m- Q* X/ q
    sys.Free;* u' o) X9 s; `0 F" @# y% L
  end;% A; a% x  L4 m) ^# x" o
end;</P>( J, P3 ~$ B  o- v+ m, q- H% W
<>上面是操作DBGrid的两个事件的的例子!Orderby函数起到了一个点击标题排序并调整cell的大小使得显示完全的作用,这里在DBGrid的DrawColumnCell事件中加入将一些想将数据库中的内容换一种显示的方法,DrawString就是要显示的字符串,采用suiDBGrid1.Canvas.TextRect函数重画。这里是根据cell的ID号进行的重画,如果DBGrid是不能拖动的不会出问题,如果要实现拖动,还要动态取得cell的ID号!</P>




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5