程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi中實現DBGrid列寬度自動調整

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

編輯:Delphi

  大多數程序設計的愛好者選擇並使用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);
var
 i : 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;

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved