Delphi中實現DBGrid列寬度自動調整

2021-05-26 06:38:38 字數 2677 閱讀 4574

發現一些erp的軟體的查詢,查詢出來結果之後,有的字段列寬過大,這時候要通過右鍵--初始化**設定 這樣的方式來調整**的列寬。這樣操作讓人覺得麻煩,突然在網上看到這樣的一篇文章,記下來備用。

大多數程式設計的愛好者選擇並使用delphi來編寫軟體,都是被其中豐富而功能強大的vcl控制項所吸引。delphi自帶的資料感知(data-aware)控制項,更是成為開發mis軟體的程式設計師之首選。在那麼多資料感知控制項中,tdbgrid由於其使用方便、顯示資訊量大成為最引人注目的一員,大量的國內外軟體中都出現了它的身影。或許是由於使用的人多了,對於它的期望也會更高,永遠追求無限趨向於完美境界的程式設計師不會放過每乙個能夠改良tdbgrid的機會。

經常使用tdbgrid的使用者都知道,它沒有提供這樣的一種選擇,使得我們能夠讓它的每一列與所要顯示的資料的寬度相匹配。使得使用者需要在程式執行時,手工對每一列進行調整,在下次執行這個程式時又得再做一遍同樣的工作(圖1)。

在進行修改後,我們可以得到乙個更加智慧型化的tdbgrid,如果tdbgrid中所有列的寬度加起來大於它本身的寬度,那麼智慧型化的tdbgrid將會在它所含的最後一列的右邊留出空白(見圖2);反之如果tdbgrid中所有列的寬度加起來小於它本身的寬度,則會在它的下部顯示乙個水平滾動條,使用者就可以左右拖動該滾動條,顯示更多想要的內容。

解決方案:

在本文中我將提供乙個簡便的過程(procedure)來解決上面的問題,它能夠在程式執行時自動固定tdbgrid中所顯示列的寬度。

首先,在tform的oncreate事件中新增下面的**:

procedure tform1.formcreate(sender: tobject);

begin

//在tag屬性中設定需要自動調整的列的最小寬度(固定值)

//這裡將列寬值設為40px

table1.fieldbyname('firstname').tag := 40;

//這裡設定乙個變化的值

//該值是做過運算的列標題的寬度值

table1.fieldbyname('lastname').tag := 4 + canvas.textwidth( table1.fieldbyname('lastname').displayname);

end;

其次,最關鍵的乙個過程(procedure),就是用它來控制列的寬度:

procedure fixdbgridcolumnswidth(const dbgrid: tdbgrid);

vari : integer;

totwidth : integer;//定義整個寬度

varwidth : integer;//定義變化的寬度

resizablecolumncount : integer;//定義變化寬度列的總數

acolumn : tcolumn;

begin

//在重新調整前所有列的寬度

totwidth := 0;

varwidth := 0;

//有多少列需要自動調整

resizablecolumncount := 0;

for i := 0 to -1 + dbgrid.columns.count do

begin

totwidth := totwidth + dbgrid.columns[i].width;

if dbgrid.columns[i].field.tag <> 0 then

inc(resizablecolumncount);

end;

//為每個列分隔線增加1px

if dgcollines in dbgrid.options then

totwidth := totwidth + dbgrid.columns.count;

if dgindicator in dbgrid.options then

totwidth := totwidth + indicatorwidth;

varwidth := dbgrid.clientwidth - totwidth;

//平均分配變化寬度的值

//給所有需要自動調整的列

if resizablecolumncount > 0 then

varwidth := varwidth div resizablecolumncount;

for i := 0 to -1 + dbgrid.columns.count do

begin

acolumn := dbgrid.columns[i];

if acolumn.field.tag <> 0 then

begin

acolumn.width := acolumn.width + varwidth;

if acolumn.width < acolumn.field.tag then

acolumn.width := acolumn.field.tag;

end;

end;

end;

最後,應用這乙個函式:

procedure tform1.formresize(sender: tobject);

begin

fixdbgridcolumnswidth(dbgrid1);

end;

上面乙個簡單的函式解決了經常會碰到的關於資料列的問題,遇到問題時多多開動腦筋,而不要一味的去找第三方控制項,這樣長期堅持下去就會真正提高自己的水平,才會從一名程式泥水匠變成真正的軟體設計師。

delphi中的DBGRid滑鼠滾動事件

procedure onmousewheel var msg tmsg var handled boolean begin if msg.message wm mousewheel then begin if msg.wparam 0 then begin if dbgrid.focused the...

Delphi 7 中DBGrid的排序。

procedure tfrmtracereport.dbgrid1titleclick column tcolumn var sortfield,fieldtitle string begin sortfield column.field.fieldname fieldtitle column.ti...

在Delphi中如何動態更改DBGrid的顏色

dbgrid控制項是乙個有許多使用者介面的顯示資料庫的控制項,以下的程式告訴您如何根據顯示的內容改變字型的顯示顏色。例如,如果乙個城市的人口大於200萬,我們就讓它顯示為藍色。使用的控制項事件為dbgrid.ondrawcolumecell.procedure tform1.dbgrid1drawc...