如何讓DBGrid 類似 Excel 能自動作出最適欄寬 |
尚未結案
|
tony115722
一般會員 發表:53 回覆:63 積分:23 註冊:2002-07-09 發送簡訊給我 |
|
terrychen
尊榮會員 發表:90 回覆:794 積分:501 註冊:2003-05-01 發送簡訊給我 |
|
tony115722
一般會員 發表:53 回覆:63 積分:23 註冊:2002-07-09 發送簡訊給我 |
感謝 terrychen :
雖然跟我想做的不太一樣,但是不遠了..只是我有個疑問..
我想做的是如果 title.Width:=30 不過 資料長度卻為 60 ,這時 title.Width 會自動=60
哪..我要怎麼知道資料最長的長度為多少?是不是要一筆一筆去筆對?
這樣子我想筆對的速度很會慢耶..如果是一萬筆資料量的話.
可是 Excel 真的很神奇..他只需要幾秒就可以完成了!!
這是你可能會建議,不如設 title.Width := 該資料欄位的 MaxLength
不過,這樣子就會浪費一些不必要的長度
所以..謝謝還有人有別的方法嗎..除了一筆一筆去筆對長度..謝謝. 初學者出沒注意!!
------
I like DeBug |
Fishman
尊榮會員 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
Hi: 也許可以在 DataSet 中設一個 Calculated Field,
並在的 OnCalcFields 事件中(必須要有 Calculated Field 才會自動觸發該事件),取的各欄位的最大長度
procedure TForm1.QRY_CUSTOMERSCalcFields(DataSet: TDataSet); var I : Integer; begin For I := 0 to DataSet.Fields.Count - 1 DO BEGIN IF Length(DataSet.Fields.Fields[I].AsString) > MaxFieldLen[I] then MaxFieldLen[I] := Length(DataSet.Fields.Fields[I].AsString); END; end;如此即可 Always 得知各欄位之最大長度 ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman |
tony115722
一般會員 發表:53 回覆:63 積分:23 註冊:2002-07-09 發送簡訊給我 |
|
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
引言: 我想做的是如果 title.Width:=30 不過 資料長度卻為 60 ,這時 title.Width 會自動=60那反過來,title.Width:=60 但 資料長度卻為 30,這時 title.Width 要自動=30嗎?也就是欄位寬度會依顯示在畫面上的資料的最大寬度為其寬度 如果 是 則請參考以下元件 SMDBGrid component 該元件有你要的功能,還有其他不少的增強功能 來源:http://www.scalabium.com/smdbgrid.htm 下載:http://www.scalabium.com/download/smdbgrid.zip 範例:http://www.scalabium.com/download/smgrdemo.zip 如果 不是 的話,那就是每個欄位的顯示寬度,只會長大,不會縮小囉!如果你要的功能是如此這般,晚上(23:30左右)我再貼出程式碼 |
tony115722
一般會員 發表:53 回覆:63 積分:23 註冊:2002-07-09 發送簡訊給我 |
|
Fishman
尊榮會員 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
Hi: 昨天已看到你的問題,因有事情,遲至今日才回覆,回去也想了這個問題,解決發法與 Chance36 大大的方法大同小異,主要是應用 Canvas.TextWidth,以下程式供你參考
procedure TForm1.QRY_CUSTOMERSCalcFields(DataSet: TDataSet); var I : Integer; begin For I := 0 to DataSet.Fields.Count - 1 DO BEGIN IF (Canvas.TextWidth(DataSet.Fields.Fields[I].AsString) 4) > MaxFieldLen[I] Then MaxFieldLen[I] := Canvas.TextWidth(DataSet.Fields.Fields[I].AsString) 4; END; end; procedure TForm1.Button32Click(Sender: TObject); var I : Integer; begin For I := 0 to DBGrid1.Columns.Count - 1 DO BEGIN IF DBGrid1.Columns.Items[I].Visible THEN DBGrid1.Columns.Items[I].Width := MaxFieldLen[I] ELSE DBGrid1.Columns.Items[I].Width := 0; END; end;>最大長度>更改為<>最大文字顯示長度> <>< face="Verdana, Arial, Helvetica">引言:也許可以在 DataSet 中設一個 Calculated Field, 並在的 OnCalcFields 事件中(必須要有 Calculated Field 才會自動觸發該事件),取的各欄位的最大長度 ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |