数学建模社区-数学中国

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

作者: ilikenba    时间: 2004-12-8 15:10
标题: DBGrid的小用法!
<>var7 h! b5 ^" G9 P" |8 \
  W1: array[1..8] of Integer;" K: r; M. c: C5 m* f/ E
  W2: array[1..8] of Integer;</P>, F7 i- b) L( e) D& f- x5 p
<>procedure Treckoningform.Orderby(grid: TDBGrid;Column: TColumn;number:Integer);
4 b7 ]* c- U* h$ }) S: U; Ovar. }3 y; z& J3 m$ `; c& ]$ F) ]
  colwidth,Max:Integer;6 v, A$ C% a' ^9 C9 ]
begin( n. K1 \. T: o
  colwidth:=5;- C2 g, f5 z$ \7 {3 B, I7 W3 U
  Max:=5;
1 a7 _  i; e/ Z, z0 c; z2 \  if not(Column.Field is TBlobField ) then2 }* y& v( }4 `3 m: `7 r
    Tadotable(Column.Field.DataSet).indexFieldNames := Column.Field.FieldName; }! g2 p) P! }% f! T6 b" u  V9 h4 A  U
  else% d' |1 s- b) v  M7 ~
  begin
/ y* A; v& i5 S2 A, A    Column.width := max+50;' B* }2 W  `- k0 F* [
    exit;
* ~( B4 u  z8 ^% p  n  end;. Z0 e: i7 h* \2 w1 Y
  with Tadotable(Column.Field.DataSet) do5 q6 C6 ~& v8 S1 y8 [' e
  begin
- B; i5 T$ H2 M% j" U. b     case number of
: y4 e* B1 f7 ?/ C" E/ D4 f     1: begin
$ D4 L/ \+ g5 x          case Column.ID of( v& y4 r8 G6 P- b
          3: begin
& G+ P9 Y9 U2 F, V              if(w1[3]*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then( \8 Z2 q1 B+ c4 X' B2 P7 {
                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5
  V* L) `) y, ^( l) D              else
3 M5 i, P( W2 W+ D5 L8 K) N, C                 Column.width :=w1[3]*8+5;8 j: j( ~. _# m
             end;0 l# T4 o; D0 k
          4: begin' [7 b) {- Z& `% G2 B$ z
              if(w1[4]*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then6 h8 }1 z3 T8 z& c. V3 n" L  W, w" n
                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5  U) |0 G# f6 x  g& o
              else+ n* h4 j# ^" z% M# J; F$ k
                 Column.width :=w1[4]*8+5;
8 Y1 f* j. g! `# R7 `, A; i0 Y             end;& I$ l  n) M9 A( k2 h0 ?
          7: begin
7 A9 l" v- j2 M' d              if(w1[7]*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then1 L' x( ]8 h/ F
                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5
! V3 D) ?, J: R              else
0 c) w5 k( s$ f; U' ]$ Y$ ]                 Column.width :=w1[7]*8+5;1 j- {/ r1 _( `
             end;
) d4 [+ j& J. v8 G: k3 E: C5 |          else
9 f, y; y, `& B: H) O             begin9 r+ t' W! f0 P% Q% \. Y
               first;" p% o) n' S7 G( ?
               while not eof do
9 ~9 g$ A/ y. }. r( M; U4 B               begin1 g  Y8 U# u, o4 P) I/ X" w
                  colwidth := grid.Canvas.TextWidth(Column.Field.AsString);
2 U+ W  B. a7 W7 L$ U4 S. d                  Max:=math.Max(colwidth,Max);
- q: j8 l1 l) g8 [4 Q                  Next;
' ^2 B' X' d; L) f               end;
5 k* l: d# c3 ?/ C  k) k               if (Max &lt; grid.Canvas.TextWidth(Column.Title.Caption)) or (colwidth = 0) then
: Q8 U; M# T, n( w                  Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5
/ d7 D* f3 s7 L; Z. Y               else
' ~$ H! q, [* u1 i8 |( U8 i* M; V                  Column.width := Max+5;4 H' k/ q* W& H' `
             end;/ j- e9 ]8 J% t% g, _7 n' b
          end;
8 f" q: p, V" m, B6 C        end;: k4 p4 ~4 A6 s) j
     2: begin3 ~! b. R1 Z0 T& B0 B8 T
          case Column.ID of8 G" H8 G; C2 N$ {
          4: begin' V( k' _8 q9 W& v9 L- @* p: ]4 z8 @& Z
              if(w2[4]*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then
8 E, o5 Z- T" J6 {                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+59 S! g+ l2 p( a, G
              else
( F/ g# R8 X: `5 b  q% i                 Column.width :=w2[4]*8+5;
  N% L7 Y' Y( v; m4 A' h: H             end;# ^5 _) T; ?+ S- E+ \2 z; w+ n
          5: begin
+ I  Q4 V6 w8 @$ B( I5 D( ^  `              if(w2[5]*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then' T* I7 w" r  M6 s
                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5  k  M0 A( s; `( j
              else0 T( n8 n. r; H$ i! C1 M4 O) b
                 Column.width :=w2[5]*8+5;
- ?; k9 F( {/ x& B5 }) K             end;( H. o1 E# N4 s) x( k* p
          6: begin8 g- f# |% l8 L& c& l. k/ d
              if(w2[6]*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then
* r- e: ~7 W% k* A' k- x7 N/ W                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5- z9 m! t1 z: N! F
              else
8 }( H4 x6 S9 u& {8 m3 n5 y                 Column.width :=w2[6]*8+5;
( C  M7 `; j7 g" h( z1 S             end;+ N8 J- b% ^0 `; c. c' w/ v! z+ X
          else+ x+ M- ~! t6 y9 B( X1 f& K  [
             begin
) [7 f6 g9 n8 r+ g               first;
# R5 [0 \* w5 s1 C9 R               while not eof do9 c- M: B* w; d
               begin
; b" ^& Z5 y+ N# S; }                  colwidth := grid.Canvas.TextWidth(Column.Field.AsString);
- s8 M' F( j5 t                  Max:=math.Max(colwidth,Max);
, k9 z9 |% T+ f) L* I- P- p8 P                  Next;
! l" t  o2 ]$ W) c( \* H5 u7 A7 T               end;
% ]; U9 B  Z" [/ G( L               if (Max &lt; grid.Canvas.TextWidth(Column.Title.Caption)) or (colwidth = 0) then" g( B  n# p8 y1 {
                  Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5  y- }+ r( s5 `5 e
               else5 y7 `9 d. `6 [: ^5 h# [1 P7 M$ K
                  Column.width := Max+5;
7 i  a$ y) c& M, z             end;+ i% {% I7 f/ t
          end;! G& U- C) X  o, @/ Y' @9 `! D
        end;# l7 w8 p1 e& \, ?; e
     end;9 V: @2 q- H+ k1 h$ s" A6 I
  end;% A4 y7 ]0 x, Z( |  x( f
end;</P>/ M7 ]+ X$ j3 t# j: V: D
<>procedure Treckoningform.suiDBGrid2TitleClick(Column: TColumn);* H4 c+ M: {/ l6 w0 y8 C) y0 b& p# N
begin
  _2 L4 `* f! H7 P% P, d  Orderby(suiDBGrid2,Column,2);# Z. Y6 U. S3 d) L  _7 G; x: U- \
end;</P>/ ?; Q5 ^/ G* I1 m. X1 A
<>procedure Treckoningform.suiDBGrid1DrawColumnCell(Sender: TObject;1 G0 b. t5 B/ k& p5 v- H
  const Rect: TRect; DataCol: Integer; Column: TColumn;/ w8 U% u. u" g, ^
  State: TGridDrawState);
. J( m! K; E% {var/ Q9 }, H; y% U
   DrawString : String;; Q( D/ \* ^1 T
   sys:TSysOper;6 Y6 l0 @$ `  s7 |/ n
begin" {2 b& I. Q- N/ p
   if (gdSelected in State)then7 A4 P" x2 s% |$ B4 T
   begin
' Y6 o/ E* A- F5 Q( y2 w: D     suiDBGrid1.Canvas.Brush.Color:=clFuchsia;//使被选中的一行的颜色变成紫红色
2 q" v* y7 N, C2 b   end0 O+ f+ A/ ]3 H5 X1 N# y6 |
   else
1 w$ ?" J) I' h4 k0 _     suiDBGrid1.Canvas.Brush.Color:=clWindow;- m8 @4 V9 J6 Q! o% l9 C  ^. J
   sys:=TSysOper.Create;
( p2 {+ d$ I& E' J   try% I$ b. _5 ]4 k
     if Column.Field.IsNull=false then
5 z+ T1 E: o! M7 z# t     begin7 h4 s( i0 I( @5 W- v2 `
       case DataCol of
- [6 g7 Z# {# i6 Z/ t2 }0 ]       3: begin/ a9 q/ A8 @) p3 g' t5 `
            DrawString:=sys.getSex(Column.Field.CurValue);//得到要显示的字符串。
' T3 M9 h+ v1 z, ]. }+ G5 r            suiDBGrid1.Canvas.TextRect(Rect,Rect.Left,Rect.Top,DrawString);
: c8 _  T8 x! W$ n            w1[3]:=math.max(Length(DrawString),w1[3]);
. q$ l4 A0 y' Q: S1 R7 q          end;
7 [3 @4 O7 h$ S6 t/ R: g6 C* v5 h2 Q       4: begin1 ?% e7 Q! I, |; K$ g4 I
            DrawString:=sys.getLoginMode(Column.Field.CurValue);
/ x6 M; [1 x9 b/ t( H            suiDBGrid1.Canvas.TextRect(Rect,Rect.Left,Rect.Top,DrawString);
6 y- J( f$ C& s! _& [1 f            w1[4]:=math.max(Length(DrawString),w1[4]);3 i; f0 v; X, _( C2 w2 n
          end;
! s2 d6 k8 `7 y' Z: D0 S       7:begin
( f2 s; T* r7 E0 K: |            DrawString:=TimeFormat(Column.Field.CurValue);
) n6 L6 @4 f# Q: W& N4 T            suiDBGrid1.Canvas.TextRect(Rect,Rect.Left,Rect.Top,DrawString);
% N9 X  Q, f! {+ E  z1 q            w1[7]:=math.max(Length(DrawString),w1[7]);
; `/ e- O. x8 ?7 {1 \) |% ^. J' O$ z          end;( [0 n, `% k7 H. f
       else
8 t2 H0 m9 \; p          suiDBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);' U  i$ u8 }; c) R( ^! }9 c
       end;
& a4 ]6 P+ E# Q/ l9 d    end4 X8 q: j. o0 b6 O
    else
8 @/ ~* z6 ]/ Y       suiDBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
( i2 e) [8 [+ ^. `2 U* h% K  finally5 U+ b% Y4 |1 I7 Y' X* \0 v( U
    sys.Free;% X! @" C0 u) t& r( @
  end;! G9 t6 b- ~; q7 Y
end;</P>
& C( }! o5 F# T+ C& T# ^$ M<>上面是操作DBGrid的两个事件的的例子!Orderby函数起到了一个点击标题排序并调整cell的大小使得显示完全的作用,这里在DBGrid的DrawColumnCell事件中加入将一些想将数据库中的内容换一种显示的方法,DrawString就是要显示的字符串,采用suiDBGrid1.Canvas.TextRect函数重画。这里是根据cell的ID号进行的重画,如果DBGrid是不能拖动的不会出问题,如果要实现拖动,还要动态取得cell的ID号!</P>




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