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 就是用于計算文本的矩形寬高哦。
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);
差不多就這些功能。也就是畫個框,再畫個文本。。
文章列表