数学建模社区-数学中国

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

作者: ilikenba    时间: 2004-12-8 15:10
标题: DBGrid的小用法!
<>var' F; s- Z  N4 A6 e2 @7 Z& W. @
  W1: array[1..8] of Integer;- G* N7 w. |; ~# G
  W2: array[1..8] of Integer;</P>
$ X" M% t" I5 K& H* w<>procedure Treckoningform.Orderby(grid: TDBGrid;Column: TColumn;number:Integer);
; O' A/ d% U+ z. avar
3 q+ x# z+ }( ?% W& L$ m9 I  colwidth,Max:Integer;) r- K9 l7 t+ |$ q- p; p, c+ o
begin
0 i9 O; `/ }7 B8 h0 G4 d  colwidth:=5;, P/ O0 C  D1 K6 h+ d) P0 f
  Max:=5;2 L% @1 d; G2 @6 v
  if not(Column.Field is TBlobField ) then+ ?8 \+ l1 s* k2 S% g
    Tadotable(Column.Field.DataSet).indexFieldNames := Column.Field.FieldName
2 g8 T% C  ~* T' |2 }2 k! I  else
5 }* F; |8 h* B( y  begin  u2 T! k. {& w! J! E
    Column.width := max+50;" P7 g/ n7 Z) [: D( Q6 ^: A. N
    exit;
9 R! U* G1 T+ [  end;2 j9 V5 T$ G+ \0 o% Y
  with Tadotable(Column.Field.DataSet) do
" Z7 x" x; W( }" X2 p  begin2 N4 n( V0 k6 O8 ~* {" {. D' g
     case number of- ^! B# P8 ]' d+ K$ J3 R9 e3 G7 b
     1: begin. x) R8 \  |# c
          case Column.ID of& M* w9 u9 z; }! a' E( s
          3: begin
/ |" h; J/ u5 X& A0 \$ h              if(w1[3]*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then
+ H( w2 ]. S3 l* r# j, D) H                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+56 p: w% W% _  i5 S6 J
              else" D; V9 P- h- K* M/ ?  X  M
                 Column.width :=w1[3]*8+5;8 ?% U# V0 _, K9 t8 H5 A
             end;) i, E4 u! a- T  _1 v. |
          4: begin
! h! Y4 p. ?) p$ n( ^' F4 y* H              if(w1[4]*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then
# T& C& D: s/ c8 {' M, k! z* G                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5
/ ^9 ~% N" O6 m  V              else9 W0 K5 ]/ v9 s- q
                 Column.width :=w1[4]*8+5;$ u- A" v3 a9 J$ n+ x1 v% {  U
             end;' l& }& E: z8 }/ Y  E, _- b
          7: begin
9 L9 c. }1 Q6 L$ `  k% j+ w" v              if(w1[7]*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then, G+ o1 |" W7 D# P3 B1 G+ I- s. W# ~
                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5
" `# `; S& E6 H4 F              else3 k& |! d  X/ ~6 f$ \# p  m
                 Column.width :=w1[7]*8+5;8 U' Y6 O" s+ k8 F& |% q* K
             end;4 Z2 g; M: y: q  u! I+ Y  @2 g
          else& W. ^' F' ]( _8 ^
             begin
6 ^/ z: d0 r( l" J1 B9 y% c3 q               first;
/ p2 D; J2 Z" w5 z, y# A: G               while not eof do
2 m# I, L2 D8 Y/ S& m               begin! w. R" U0 }/ ]4 Y6 a' t* F
                  colwidth := grid.Canvas.TextWidth(Column.Field.AsString);5 v6 X) R2 c" V- E/ Y3 P" K
                  Max:=math.Max(colwidth,Max);) @' U' `4 L+ \0 J* f& N
                  Next;. `! _: a+ D' Z+ M2 C' S
               end;/ o" [. ?! h3 e& |3 k' t$ e- v" n% i1 E3 u
               if (Max &lt; grid.Canvas.TextWidth(Column.Title.Caption)) or (colwidth = 0) then( L8 f% p- f+ x& h4 Y1 x9 {
                  Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5
: X8 b4 Q! ]3 T8 ?& W# s               else/ D9 t. u4 V5 l
                  Column.width := Max+5;+ k4 D8 ?# p) }" l: V  ]3 V
             end;
3 o. T+ W3 ~$ a3 R) R, I          end;) n- v& G! n6 ?$ y$ e
        end;
8 w) T* j0 `8 _. {* g     2: begin0 w* X* \8 [4 d% C6 B( g
          case Column.ID of
6 E7 }! ?' W9 c4 _          4: begin
* ^# s: z& K3 O# a              if(w2[4]*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then
) c' a4 ^2 x8 Q2 d                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5
0 a2 S; w, Z  X2 s5 G! S4 V4 ?              else
& _8 X/ k. a2 Y                 Column.width :=w2[4]*8+5;& ]4 e3 u5 N  Y: w9 k. d8 y
             end;: \3 b" ]7 F+ |4 }0 J6 u5 [
          5: begin
& l: E9 T# w9 k! N! o              if(w2[5]*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then  }" z7 }  W. W" M: S/ B
                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5) c; p/ Y# h& D# E
              else
, ^  P$ Q/ o, ]* Q2 S. O( U& y, t                 Column.width :=w2[5]*8+5;* m/ o" y1 t. ~& U
             end;
/ K+ A; K+ T4 \) j          6: begin, Y0 t+ X, D+ R( Q# F9 _9 |$ u
              if(w2[6]*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then
/ \3 n7 `3 E: D/ u                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+52 C1 Q% h* t" c! ]
              else5 R5 j: d  h) n
                 Column.width :=w2[6]*8+5;4 b0 v/ _7 W# E! e2 g/ M; c* Q
             end;
) e- N0 s  v; V          else: }3 a" _" L6 Z3 u: ]% ]
             begin0 v/ q5 y4 w. c- Q9 {3 ~; p
               first;
! C$ t! s& H# p  I               while not eof do
8 `( L! {% H  a               begin8 v, q9 K6 U9 T+ Y$ I4 {; _
                  colwidth := grid.Canvas.TextWidth(Column.Field.AsString);
. H- K1 a9 W* Z, P                  Max:=math.Max(colwidth,Max);
, ?1 N# c9 f* I- y                  Next;2 A" m* E$ F& y/ V) J5 }3 w
               end;
; P+ w' ]# E8 P; W9 Y               if (Max &lt; grid.Canvas.TextWidth(Column.Title.Caption)) or (colwidth = 0) then
1 `! Y3 r+ Y3 p                  Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+50 ?$ }8 Y. e9 B; w! [9 \
               else
. A. {1 W3 i8 l                  Column.width := Max+5;# @8 f, C/ I* W2 G8 h
             end;
' R! {8 y! ]' O- G, K3 k7 F          end;5 {8 k# {. S& b$ \
        end;3 X4 o# g4 i+ x& l& r4 ]4 c( |9 B8 R
     end;
. }$ q1 P' [8 Q$ M: {  end;( k4 K4 v% [% K% K. K3 P
end;</P>
" P; v* Y. @. S<>procedure Treckoningform.suiDBGrid2TitleClick(Column: TColumn);$ e8 s' F- Y/ n. t5 F. t1 H
begin& k* r  _1 e* B% n5 P) d) n
  Orderby(suiDBGrid2,Column,2);
; a7 }( y1 @* T3 T& E9 wend;</P>3 c& N: e. v2 {1 ?% X  g
<>procedure Treckoningform.suiDBGrid1DrawColumnCell(Sender: TObject;
. S) x2 _' e: [& j5 U8 s9 H9 Q  const Rect: TRect; DataCol: Integer; Column: TColumn;: r; e. r$ t$ S3 W5 _% b2 V% P
  State: TGridDrawState);5 m  p0 I! P( w+ _. B' ?: U
var
) L/ q  b( l" r) ^- A2 B, G   DrawString : String;
4 w  W) D1 u8 J5 C: A   sys:TSysOper;: d- S5 y3 |0 C# f+ X* f0 N2 F
begin
. e# i4 |" U4 _8 i; i   if (gdSelected in State)then% A  V5 P* f, u+ S( {! T% n6 Z0 Y
   begin
, R+ u& t6 \4 `) ?$ z! i& b     suiDBGrid1.Canvas.Brush.Color:=clFuchsia;//使被选中的一行的颜色变成紫红色' Z% U" }1 z+ {" N
   end
* }2 s9 E! {3 B6 u$ n( ]# t8 H" F   else
# S4 B1 j8 I1 A5 _  M1 V6 U( q     suiDBGrid1.Canvas.Brush.Color:=clWindow;4 m/ L$ j! K, x2 d+ N7 m/ c
   sys:=TSysOper.Create;: v" G, w7 \) G3 N: w! M
   try
2 l" b# y6 G7 u, m' y& y9 [     if Column.Field.IsNull=false then! L3 }! z+ }4 u$ @, P/ R
     begin
1 {5 G$ w3 m6 J' h! b5 j       case DataCol of3 H. I$ R& J4 q; G
       3: begin
) l& k' Q6 r6 j            DrawString:=sys.getSex(Column.Field.CurValue);//得到要显示的字符串。8 u% [* E6 c1 \5 r. P* _
            suiDBGrid1.Canvas.TextRect(Rect,Rect.Left,Rect.Top,DrawString);! ~. g7 z7 U. {+ F
            w1[3]:=math.max(Length(DrawString),w1[3]);3 h: |, x5 v8 K/ S% h3 L" W( d
          end;
& q7 l4 ~+ Y# D" y# u& N$ a       4: begin) G4 l, h: N% K9 `6 I' E" I
            DrawString:=sys.getLoginMode(Column.Field.CurValue);. Y1 ~3 a+ t3 g8 g. J& Z
            suiDBGrid1.Canvas.TextRect(Rect,Rect.Left,Rect.Top,DrawString);
9 W" J8 x& B) |0 I" q            w1[4]:=math.max(Length(DrawString),w1[4]);; o: f3 i1 Y! m$ F
          end;
* K8 i! F5 K% `0 j1 i       7:begin* g0 Q7 M" C, z  {7 y' |: A0 j9 L
            DrawString:=TimeFormat(Column.Field.CurValue);
( [8 u9 U/ Z2 z( h0 Q7 k# C            suiDBGrid1.Canvas.TextRect(Rect,Rect.Left,Rect.Top,DrawString);! F  l$ h: b' `. J- N  `
            w1[7]:=math.max(Length(DrawString),w1[7]);- G% G; T  L6 f+ q5 M
          end;& A! x+ w) b+ |  f# o$ {* ^- G' A6 D
       else( G2 {7 S! |5 W( `* X6 I! ^
          suiDBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);" e, H5 E! t9 a2 C/ e
       end;  A) ?; }. @; U6 y- X& R
    end
7 ]# N% I6 k# \" c" X3 G    else7 ?5 D& E1 `2 t4 s+ Y
       suiDBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);; ?$ x  w( g( i
  finally
; \$ a, x8 E4 {/ e! A5 v5 _    sys.Free;6 s# N" x# w5 Z
  end;
+ ?2 Q4 l: c* K* L+ v: k1 v% F7 G8 aend;</P>  N/ p" C4 b/ {1 r2 e
<>上面是操作DBGrid的两个事件的的例子!Orderby函数起到了一个点击标题排序并调整cell的大小使得显示完全的作用,这里在DBGrid的DrawColumnCell事件中加入将一些想将数据库中的内容换一种显示的方法,DrawString就是要显示的字符串,采用suiDBGrid1.Canvas.TextRect函数重画。这里是根据cell的ID号进行的重画,如果DBGrid是不能拖动的不会出问题,如果要实现拖动,还要动态取得cell的ID号!</P>




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