数学建模社区-数学中国

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

作者: ilikenba    时间: 2004-12-8 15:10
标题: DBGrid的小用法!
<>var0 \; n5 |1 r8 j; G
  W1: array[1..8] of Integer;
2 B$ C& f, I# L& O3 X5 D) E- ?  W2: array[1..8] of Integer;</P>+ a; W+ u& T- b
<>procedure Treckoningform.Orderby(grid: TDBGrid;Column: TColumn;number:Integer);
7 B" w& T  l# J. {var
3 ]7 m( N$ K! A& O) u  colwidth,Max:Integer;
# R" h) a( d- @# Q  Wbegin$ @6 i- }! {1 R: r2 [( m2 g" j7 L
  colwidth:=5;
! l" b8 z/ D8 d7 V  Max:=5;
, J: E/ T  J1 q7 R- {, U( T  if not(Column.Field is TBlobField ) then0 ^# {  o) Y" \9 Q4 M& D) m4 N
    Tadotable(Column.Field.DataSet).indexFieldNames := Column.Field.FieldName
  k% l0 M" M* N! ?8 ?3 I  else
) [  ~2 f$ O- H  begin: T2 l" \7 ?  g( V8 S
    Column.width := max+50;
* u6 @4 I) `$ S7 O, M    exit;' W- ?. o) w8 W! B3 Y+ ?# U! S
  end;
: ]/ }! P+ ^" u7 }  `  with Tadotable(Column.Field.DataSet) do
, |# x1 f! o% e& X6 d  begin: C: i; |2 I* L2 A' f
     case number of
4 l3 @% m5 v1 R; m1 d8 w% p2 z     1: begin9 _- p( ^* O; w, _
          case Column.ID of
" t& D+ h5 n. b" X          3: begin
& h8 J+ @# w2 W2 }1 G              if(w1[3]*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then
8 S, Y; m" T' @$ Y6 D                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5
' }! g' `- l6 m              else
/ I  n7 T8 c* Y4 M                 Column.width :=w1[3]*8+5;! ~) t/ S7 b0 ?( Y5 s( J; u
             end;/ O# t& j& ^0 m! x% K! m
          4: begin9 x" B6 s. F# D' I- @( u+ h
              if(w1[4]*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then
; {; f: b( w: C6 E' m5 A                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5- l- J. d6 z9 h. m2 M
              else
5 V$ v9 S: i* S" I* q& \9 N4 m                 Column.width :=w1[4]*8+5;9 r1 q. N: K& R
             end;
: F$ I' ^* R/ U# ~, ?          7: begin" b) X+ x( J1 U0 Z
              if(w1[7]*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then
1 p! p- \+ V5 ^, [. l; I( f                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5
$ C6 Y; J8 t6 {! J/ F) f* @              else. h$ h8 Z: Y' |. a
                 Column.width :=w1[7]*8+5;
$ z+ H' e$ k1 e; ~# }6 q             end;5 E$ y% e) g9 f4 v0 n
          else
2 z$ r9 L; q) u! O             begin
: Z. J" f0 C! |4 {$ C               first;4 Y; w" L1 m5 p
               while not eof do( y1 a: \3 I9 {) o
               begin3 |5 d2 r* \$ d$ G" [
                  colwidth := grid.Canvas.TextWidth(Column.Field.AsString);
7 ^1 B: @. P" v2 ]# H' q                  Max:=math.Max(colwidth,Max);+ X& K6 M9 a1 P6 X! f1 [
                  Next;
9 p2 f% H6 Q9 P4 P* j/ {, W+ t               end;! B  G9 P9 [( P: Q1 ]7 m
               if (Max &lt; grid.Canvas.TextWidth(Column.Title.Caption)) or (colwidth = 0) then6 P# w% A4 r, C" U
                  Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5
; V; _4 Q( j" H. I% d' [7 ?               else+ @: j. a2 u; f0 o& t
                  Column.width := Max+5;
; A8 K) P9 Y- @; j% [8 S) s             end;9 _: Q* t' j3 k# J* ^& J
          end;
0 |8 G5 v7 u  [" ~+ H0 x9 c4 d        end;, j8 b; d) l" d4 f5 g
     2: begin
3 P/ [3 F2 x' _5 M* _0 R' r          case Column.ID of
5 B% Q3 ?1 b( P4 @9 @; {          4: begin
0 n" [" M& L: P              if(w2[4]*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then
6 K# I: w, H" }8 A( ^% p                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5$ O7 W3 h9 Q4 k
              else
4 p# l2 m! g' R! m8 K                 Column.width :=w2[4]*8+5;
* p( P; E6 J$ m0 K# }             end;& q: d$ s) A4 V
          5: begin7 S4 C7 `3 c! Q) u
              if(w2[5]*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then! A- t9 O2 p1 m! W0 K
                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5; C! E  w2 P) Q& D. J1 @% V& T6 Y) M
              else/ t% ~& Y, `6 e) W/ R$ ~# o. _
                 Column.width :=w2[5]*8+5;+ Y$ ~: n" q; _1 U$ S0 t
             end;7 t* y" ~* q5 U" z6 P! C9 b  J+ V
          6: begin( g# W$ R, o) d- v6 D
              if(w2[6]*8+5)&lt; grid.Canvas.TextWidth(Column.Title.Caption) then% V  }+ s2 t+ t- P0 C  c3 g
                 Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5/ R: _. ?+ b- l: ?
              else
) l# m" c& A( d- v- z1 |$ h- ~6 M                 Column.width :=w2[6]*8+5;6 ]; [8 P5 O% E$ L% {' l2 v
             end;- q4 K' K/ z8 d# f/ U
          else0 P* P6 V( U/ b/ U& U0 t& H" y
             begin
$ _9 @1 }: S2 @, \               first;
& H, s  i6 k2 r4 ?               while not eof do
& S0 I- ^1 p4 U8 j3 P               begin
) g' P6 f7 W2 Y/ ?0 O                  colwidth := grid.Canvas.TextWidth(Column.Field.AsString);
- [5 G/ B/ U- Z                  Max:=math.Max(colwidth,Max);9 D: V. }, H4 _
                  Next;
: q  i6 }# Z- l7 w6 z9 \               end;
5 P$ u+ d" A! [               if (Max &lt; grid.Canvas.TextWidth(Column.Title.Caption)) or (colwidth = 0) then
  q4 p3 Q2 h3 U- W3 U- _                  Column.width := grid.Canvas.TextWidth(Column.Title.Caption)+5
1 k4 C; t  P9 W               else
& k. d$ n2 s4 _& G                  Column.width := Max+5;# x( z& x& z2 k6 H! i& [2 ^
             end;
  J: \& n% I7 d) z: b; f          end;
- H/ M: e' c: `5 I: j& M6 L        end;
" G* ]5 Y% E9 u2 A; G- l! Y+ m9 c     end;
% F! L. Q) k+ u+ G  end;" F9 v. w; d+ i8 e& K
end;</P>
' I. z1 Z& b3 E2 Z- F1 p<>procedure Treckoningform.suiDBGrid2TitleClick(Column: TColumn);1 ~4 [$ {+ d- u
begin, U/ S+ G4 B% |+ N% F
  Orderby(suiDBGrid2,Column,2);0 `, V& g4 _( s( l0 S3 a. J2 o
end;</P>! a# N7 t" ]6 M& Y2 X% t8 i
<>procedure Treckoningform.suiDBGrid1DrawColumnCell(Sender: TObject;1 q0 u0 G+ t- R1 Q# [+ N
  const Rect: TRect; DataCol: Integer; Column: TColumn;  O; I9 z. N% t7 H
  State: TGridDrawState);8 _# B+ D% a% I; l$ y. Y
var
* b' g$ Q9 d$ v: ?0 u$ J) H   DrawString : String;* V1 x9 O5 _$ G. X% Q1 v& K
   sys:TSysOper;
: ^, a  C4 K4 \" b! mbegin
7 ?- e0 U' E3 S) E3 p& M   if (gdSelected in State)then6 f# O6 u6 E8 E7 z  A5 C/ c: x
   begin
% o2 q/ Q6 Z+ _! E2 t     suiDBGrid1.Canvas.Brush.Color:=clFuchsia;//使被选中的一行的颜色变成紫红色- \  ?" Y4 j/ f: f' r  o
   end$ H$ i( U5 }; N- j
   else' j* s1 e9 }# A# z, c
     suiDBGrid1.Canvas.Brush.Color:=clWindow;
; M, c: t1 i; W- G1 ?   sys:=TSysOper.Create;6 x! F% ^- _. {1 ?! F! D7 D
   try5 e% I% `) ~5 ?. m# d7 d: M! C
     if Column.Field.IsNull=false then
" N# T1 y6 W- `7 {  s2 A     begin
& R* k3 C/ V4 C  |, i# K       case DataCol of0 V2 u1 J' I$ K# g* q3 s
       3: begin
0 e: b( [* Q" {& H5 A' X: d            DrawString:=sys.getSex(Column.Field.CurValue);//得到要显示的字符串。
, Q3 }1 x5 o4 [0 D+ l            suiDBGrid1.Canvas.TextRect(Rect,Rect.Left,Rect.Top,DrawString);. }3 j, Z8 |& i$ T6 }$ o
            w1[3]:=math.max(Length(DrawString),w1[3]);
. G* o2 N' F) t( S, m9 c          end;5 v; X- l% t  o8 W& V& I# P" Z6 G/ M
       4: begin
3 K  i; b/ b9 A# O1 |4 K            DrawString:=sys.getLoginMode(Column.Field.CurValue);
( `5 s; \1 Y1 p+ s, ~            suiDBGrid1.Canvas.TextRect(Rect,Rect.Left,Rect.Top,DrawString);+ Y' j9 ^% M8 \/ B1 f5 I3 ]" s: Q
            w1[4]:=math.max(Length(DrawString),w1[4]);2 c+ G7 A+ N! y3 L
          end;6 Y4 l9 m8 C, {/ H- x8 C
       7:begin3 [# E( _: D: C9 k/ j5 `( I9 l
            DrawString:=TimeFormat(Column.Field.CurValue);# b0 R: s& D0 _- k7 t
            suiDBGrid1.Canvas.TextRect(Rect,Rect.Left,Rect.Top,DrawString);8 N% v$ r) x" k* A
            w1[7]:=math.max(Length(DrawString),w1[7]);
, \2 k1 ?# D& {+ @1 G          end;
1 `8 U/ b! V+ K- d) u7 w       else
  s) E* M9 j& x4 A1 V6 a          suiDBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
  D, L9 l* e- k4 J       end;
( O+ O8 W- ~6 b$ o' \. N8 V. I9 A    end2 c" S6 X' A, _$ M  E5 P
    else
. O8 Z$ G" N! w' I6 m; X+ C       suiDBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);& w) |- q/ {( H% a. H* i  ~) J
  finally
' _/ }0 S% r! Z9 j8 B% U5 S    sys.Free;' d' R- u) [: d
  end;
9 _" ^# f- T$ Z1 Hend;</P>
9 r% G$ L) I( |6 O, l0 \0 {+ q! ~/ Y& a<>上面是操作DBGrid的两个事件的的例子!Orderby函数起到了一个点击标题排序并调整cell的大小使得显示完全的作用,这里在DBGrid的DrawColumnCell事件中加入将一些想将数据库中的内容换一种显示的方法,DrawString就是要显示的字符串,采用suiDBGrid1.Canvas.TextRect函数重画。这里是根据cell的ID号进行的重画,如果DBGrid是不能拖动的不会出问题,如果要实现拖动,还要动态取得cell的ID号!</P>




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