文章出處

1、說明

最近加入了一個項目組,使用的開發工具是delphi6,想想又要開始搞這個工具有點小憂傷,但沒辦法誰讓咱就是個打雜的尼。。。

的需求是顯示一個類似于Word/excel的那種表格,可以合并列等。。本來想用DBGridEh去解決,只是試了半天發現不能合并列,我了個去。。然后想到了網頁來處理,但是嘗試了一下馬上就放棄,最后各種搜索后沒得辦法哦。。想了想就用TStringGrid來試試,畢竟也是個表格,可定制性也大的多,好吧。就用它試試。

2、技術點

最核心的功能還是由TStringGrid提供,一方面它已經具備了顯示一個二維表格的能力,另一方面提供了靈活的設定來開啟各種自定義的功能,比如是否顯示網格線,行、列是否可以改變大小等。作了基本的設置,加載上數據就能顯示出來。接下來要做的就是讓表格內容顯示的和我預期的一樣。

因為表格需要類似于word中那種表格,主要是合并單元格之類的,樣式方面可以按要求畫就是了。所以主要的技術點:

1、自繪方法,直接就用OnDrawCell事件處理

2、表頭,可以使用FixCol和FixRow的屬性

3、文本換行

3、開發

3.1、屬性設置

DefaultDrawing:設置為False,這樣就不會在OnDrawCell之前進行繪制,否則會先進行父類的繪圖功能,再調用OnDrawCell,由于許多內容我都是自己畫的所以把它設置為False

RowCount:默認的初始行數,必須為大于等于2,否則會把FixedRows清為0,這樣就沒有表格頭了。可以通過這個屬性來增減行數,+1就多一行。

FixedRows:固定的行數,設置為1,因為一行是表格頭

FixedCols:固定的列數,設置1,用一個固定的列可以顯示序號,同時也可以用于鼠標調整行的高度

Options.goVertLine:數據區域的垂直網格線,默認為true,會默認顯示cell的垂直邊框。我在繪圖的時候遇到了些麻煩就把它改成false,自己來畫框

Options.goHorzLine:數據區域的水平風格線。同樣設置為false

Options.goRowSizing:行高可調整,在運行時時可以通過鼠標來調整行高

Options.goColSizing:列寬可調整,在運行時可以通過鼠標來調整列的寬度

3.2、計算每行的文本高度

這個我找了半天也沒找到比較簡單好用的方法,最后就用TLabel這個控件來完成的。有點繞路,但感覺挺實用的。。呵呵。。。。呵呵。。

    label1.Caption := sData;
    StringGrid1.RowHeights[iRow] := Label1.Height + 10;

將文本賦值給label,然后再使用label的高度設置為StringGrid的行高,這樣就能顯示多行的文本了。但有一個問題,AutoSize為true時沒法自動換行,醉了。這個問題后面再找辦法解決吧。

 

后來使用的另一種方法挺好的:

    rect.Left := 0;
    rect.Top := 0;
    rect.Right := 500;
    rect.Bottom := 50;
    iHeight := DrawText(Self.Label1.Canvas.Handle, PChar(sData), Length(sData), rect, DT_WORDBREAK or DT_CALCRECT);

設定一個固定的矩形框,然后使用DrawText方法來繪制一次就能得到高度了,哈哈,不錯的。。這樣就得到了實際的文本高度。

 

DT_CALCRECT 就是用于計算文本的矩形寬高哦。

 

調用上面那句代碼后,cellRect就會計算出文本顯示的矩形大小了。同樣就得到了寬高。

 

3.3、OnDrawCell事件

DrawCell事件里就是對每個單元格的繪圖功能:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);

參數很實用:

ACol,ARow:就是列、行

Rect:就是Cell的矩形

State:指的是當前cell的狀態,選擇、焦點、固定

有了這些內容就可以進行想要的做操作了:

畫邊框:

sg.Canvas.Rectangle(Rect);

畫文本:

DrawText(sg.Canvas.Handle,PChar(sData),Length(sData), Rect, DT_WORDBREAK or DT_VCENTER or DT_LEFT or DT_SINGLELINE);

 

差不多就這些功能。也就是畫個框,再畫個文本。。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()