學習筆記 delphi之TStringGrid

2022-01-19 15:08:56 字數 2308 閱讀 1014

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

的需求是顯示乙個類似於word/excel的那種**,可以合併列等。。本來想用dbgrideh去解決,只是試了半天發現不能合併列,我了個去。。然後想到了網頁來處理,但是嘗試了一下馬上就放棄,最後各種搜尋後沒得辦法哦。。想了想就用tstringgrid來試試,畢竟也是個**,可定製性也大的多,好吧。就用它試試。

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

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

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

2、表頭,可以使用fixcol和fixrow的屬性

3、文字換行

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:列寬可調整,在執行時可以通過滑鼠來調整列的寬度

這個我找了半天也沒找到比較簡單好用的方法,最後就用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就會計算出文字顯示的矩形大小了。同樣就得到了寬高。

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);

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

delphi學習筆記 TADOQuery

delphi 資料庫查詢 tadoquery 在乙個程式中你會多次查詢資料庫的,因此在你寫的查詢方法中定義乙個區域性的adoquery就可以了,它返回乙個資料集 recordset。最簡單的應用如下 function getdata recordset 獲取一張表中的全部資料 recordset是一...

Delphi學習筆記四 語句

今天我們來看一下delphi的語句。一 常量宣告語句 和其他語言一樣,常量在宣告時就被賦值,且在程式執行過程中是不可改變的。常量用 表示兩邊的值是相等的。delphi view plain copy const pi 3.14159 answer 342 productname delphi 二 賦...

Delphi 學習筆記 指標篇

取址運算子 var intval integer p integer new p 申請記憶體空間 intval 24 p intval 取變數 intval 的位址賦值給 整形指標,整形指標指向intval的位址 dispose p 釋放記憶體 指標的引用解析操作符 var pint integer...