線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2771
推到 Plurk!
推到 Facebook!

DBGrid格式问题

尚未結案
Amanda_Chen
一般會員


發表:25
回覆:82
積分:21
註冊:2003-12-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-01 12:52:48 IP:61.165.xxx.xxx 未訂閱
想将DBGrid的栏宽限定,数据内容超过栏宽时,自动换行。象EXCEL中的格式设置中选定自动换行的功能那样。看到过这种方法的实现,但不知道怎么作出来的,请教各位高手啦。
yachanga
資深會員


發表:24
回覆:335
積分:296
註冊:2003-09-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-22 16:00:08 IP:211.74.xxx.xxx 未訂閱
小弟有一個淺見... 若只是要換行的話, 用 StringGrid 會比較容易.. 做法: 先將數據全部讀出, 放到Array中. 然後將Array用Canvas塞到StringGrid中. 若Array中字句太長則換行, 此時並將列高加大...    以下只用換兩行為範例, 若要換很多行, 可以用迴圈加強.. 希望對你有幫助 ===================================================    var   S: array[0..10,0..10] of String;    //資料庫塞到Array 省略... //假設以下為資料庫塞入結果 procedure TForm1.Button1Click(Sender: TObject); begin  S[1,0]:='說明';// Title   S[1,1]:='這是第一次說明'; //第一筆資料  S[1,2]:='第二次'; // 第二筆資料  S[1,3]:='第三次'; // 第三筆資料  Stringgrid1.ColWidths[0]:=20; //將第一欄欄寬縮短比較好看 end;     //拉出一個StirngGrid, 在StringGrid1DrawCell Method 加上以下code procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;   Rect: TRect; State: TGridDrawState); Var  s1: String;  height: Integer; begin   height:=StringGrid1.RowHeights[0];   s1:= S[Acol,ARow];   if length(s1)<10 then StringGrid1.Canvas.TextOut(Rect.Left 2,Rect.Top 2,s1) else begin StringGrid1.RowHeights[Arow]:= height 15; StringGrid1.Canvas.TextOut(Rect.Left 2,Rect.Top 2,copy(s1,1,10)); StringGrid1.Canvas.TextOut(Rect.Left 2,Rect.Top 17,copy(s1,11,20)); end; end; ~悠遊法國號~
TATSU
版主


發表:50
回覆:135
積分:62
註冊:2003-01-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-22 19:59:21 IP:203.218.xxx.xxx 未訂閱
procedure TForm1.FormShow(Sender: TObject);
var
  DBGridOptions : TDBGridOptions;
begin      DBGrid1.DefaultDrawing := False ;

  //這一段程式碼中,主要設定了 
  //1) default row height
  TStringGrid(DBGrid1).DefaultRowHeight := 70 ;      //2) 還原 heading 的 row height
  TStringGrid(DBGrid1).RowHeights[0] := 20 ;      //3) 如果讓用戶可以自行更改 column 的闊度,整個 grid 
  //的 row height 都會還原,所以都用程式碼 disable 。
  DBGridOptions := DBGrid1.Options ;
  Exclude(DBGridOptions,dgColumnResize) ;
  DBGrid1.Options := DBGridOptions ;    end;    procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  drawRect : TRect ;
  StrValue : String ;
  backColor, fontColor : TColor ;
begin
  if  gdSelected in State then
  begin
    backColor := clNavy ;
    fontColor := clWhite ;
  end
  else
  begin
    backColor := clWhite ;
    fontColor := clBlack ;
  end;      DBGrid1.Canvas.Brush.Color := backColor ;
  DBGrid1.Canvas.FillRect(Rect);      DBGrid1.Canvas.Font.Color := fontColor ;      //預先縮小秀字的框架範圍,秀字時讓字與框架留有空間
  drawRect := Rect ;
  InflateRect(DrawRect, -4, -2) ;      case DataCol of
  0 : strValue := DataSource1.DataSet.fieldByName('PRODUCT_ID').AsString ;
  1 : strValue := DataSource1.DataSet.fieldByName('PRODUCT_DESC').AsString ;
  end;      DrawText(DBGrid1.Canvas.Handle,
           PChar(strValue),
           Length(strValue),
           DrawRect,
           DT_WORDBREAK) ;    end;
這裡使用了 Windows 的 API function DrawText,詳情你可以參閱 API help 檔案,我只用了 DT_WORDBREAK 做分行 (word break/wrap),它還提供了很多設定讓了秀字時改變格式。
Amanda_Chen
一般會員


發表:25
回覆:82
積分:21
註冊:2003-12-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-23 12:03:51 IP:61.165.xxx.xxx 未訂閱
谢谢Yachanga 和TATSU两位大大提供方案,两种方法都可以实现,只是TATSU大大的更灵活一些,无需考虑字串长度,根据栏宽自动折行,是我想要的结果,< >好好学习学习。< >
Amanda_Chen
一般會員


發表:25
回覆:82
積分:21
註冊:2003-12-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-03-23 13:37:59 IP:61.165.xxx.xxx 未訂閱
又一问:如何判断是否折行呢?试了一下DrawText的返回参数不能判断折行信息。可是不想未折行的和折行的一样宽,所以想判断是否折行来确定是否加宽。不知有没有好办法?请教请教
TATSU
版主


發表:50
回覆:135
積分:62
註冊:2003-01-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-03-23 14:05:52 IP:203.218.xxx.xxx 未訂閱
引言: 又一问:如何判断是否折行呢?试了一下DrawText的返回?数不能判断折行信息。可是不想未折行的和折行的一?宽,所以想判断是否折行来确定是否加宽。不知有没有好办法?请教请教 < face="Verdana, Arial, Helvetica"> 你這一個問題好像跟你的原意有少少衝突,我不敢胡亂答你的問題,等我消化了你的意思,再回應你這個問題。
Amanda_Chen
一般會員


發表:25
回覆:82
積分:21
註冊:2003-12-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-03-23 14:42:31 IP:61.165.xxx.xxx 未訂閱
呵呵,应该是我没有讲清楚了。是这样的,如果一行能够显示得下字串,就一行就够了,如果需折行,再将行高设为两行。就象excel中格式设定后实现的那样。
TATSU
版主


發表:50
回覆:135
積分:62
註冊:2003-01-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-03-23 17:27:41 IP:203.218.xxx.xxx 未訂閱
引言: 呵呵,应该是我没有讲清楚了。是这?的,如果一行能{显示得下字串,就一行就{了,如果需折行,再将行高?为?行。就象excel中格式?定后?现的那?。 < face="Verdana, Arial, Helvetica"> 小姐,不要那麼貪心吧! 我明白你的意思,你看看
Amanda_Chen
一般會員


發表:25
回覆:82
積分:21
註冊:2003-12-28

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-03-23 19:25:09 IP:61.165.xxx.xxx 未訂閱
哈哈,我真有做过尝试每一格重画,结果,那个GRID就象动画片一样,不停闪闪闪!也许还有其它方法哩?
TATSU
版主


發表:50
回覆:135
積分:62
註冊:2003-01-16

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-03-23 19:38:27 IP:203.218.xxx.xxx 未訂閱
引言: 哈哈,我真有做过尝试每一格重?,结果,那?GRID就象??片一?,不停闪闪闪!也许还有其它方法哩? < face="Verdana, Arial, Helvetica"> 哈哈哈,跟我預計的相去不遠。 你有多少筆資料要放到
系統時間:2024-06-27 2:46:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!