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

如何讓DBGrid 類似 Excel 能自動作出最適欄寬

尚未結案
tony115722
一般會員


發表:53
回覆:63
積分:23
註冊:2002-07-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-11 14:22:26 IP:211.22.xxx.xxx 未訂閱
各位同學好: 請問如何讓DBGrid 類似 Excel 能自動作出最適欄寬 謝謝.. 初學者出沒注意!!
------
I like DeBug
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-11 14:50:52 IP:211.22.xxx.xxx 未訂閱
您好: 參考http://delphi.ktop.com.tw/topic.php?TOPIC_ID=44580 ~~應無所住而生其心~~
tony115722
一般會員


發表:53
回覆:63
積分:23
註冊:2002-07-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-02-11 15:30:00 IP:211.22.xxx.xxx 未訂閱
感謝 terrychen : 雖然跟我想做的不太一樣,但是不遠了..只是我有個疑問.. 我想做的是如果 title.Width:=30 不過 資料長度卻為 60 ,這時 title.Width 會自動=60 哪..我要怎麼知道資料最長的長度為多少?是不是要一筆一筆去筆對? 這樣子我想筆對的速度很會慢耶..如果是一萬筆資料量的話. 可是 Excel 真的很神奇..他只需要幾秒就可以完成了!! 這是你可能會建議,不如設 title.Width := 該資料欄位的 MaxLength 不過,這樣子就會浪費一些不必要的長度 所以..謝謝還有人有別的方法嗎..除了一筆一筆去筆對長度..謝謝. 初學者出沒注意!!
------
I like DeBug
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-02-11 16:21:24 IP:210.65.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-02-11 16:48:59 IP:211.22.xxx.xxx 未訂閱
感謝 Fishman : 讚! 可是小弟還有個問題..我發現實際Length(Data) 與 title.width 還是有差距耶..請問如何才能得到最合適的 Width 初學者出沒注意!!
------
I like DeBug
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-02-11 18:03:34 IP:211.20.xxx.xxx 未訂閱
引言: 我想做的是如果 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-02-12 09:23:00 IP:211.22.xxx.xxx 未訂閱
感謝 Chance36 兄: 讚!!這個方法好用... 在不離題的前題下,能不能再容我問個問題.. 相信大家都有用過 Excel ,在欄與欄之間點二下,前面欄的欄寬就會自動調整最大的長度(title.width or data.width)為最適欄寬 問題來了,請問,我要如何做出在欄與欄之間點二下的事件呢? 因為我只會用 TitleClick 而以..謝謝 初學者出沒注意!!
------
I like DeBug
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-02-12 09:23:52 IP:210.65.xxx.xxx 未訂閱
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
系統時間:2024-06-02 12:40:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!