Delphi調整Dbgrid列寬

來源:互聯網
上載者:User
DBGRID列寬怎麼調?
一、設定好你的dbgrid,顯示資料後可做如下動作調節你的列寬:
1.雙擊dbgrid,出現一個編輯框:EDITING DBGRID1.COLUNMS
2.如果是空白的話,點擊第三個表徵圖: Add All Fields
3.選擇需要設定的行,在它的屬性欄,直接設定他了WINDTH值為你想要的.
二、DBGrid自動調整列寬
function DBGridRecordSize(mColumn:TColumn):Boolean;
{   返回記錄資料格列顯示最大寬度是否成功   }
begin
Result := False;
if not Assigned(mColumn.Field) then Exit;
mColumn.Field.Tag := Max(mColumn.Field.Tag,
    TDBGrid(mColumn.Grid).Canvas.TextWidth(mColumn.Field.DisplayText));
Result := True;
end; {   DBGridRecordSize   }function DBGridAutoSize(mDBGrid:TDBGrid; mOffset:Integer = 5):Boolean;
{   返回資料格自動適應寬度是否成功   }
var
I:Integer;
begin
Result := False;
if not Assigned(mDBGrid) then Exit;
if not Assigned(mDBGrid.DataSource) then Exit;
if not Assigned(mDBGrid.DataSource.DataSet) then Exit;
if not mDBGrid.DataSource.DataSet.Active then Exit;
for I := 0 to mDBGrid.Columns.Count - 1 do
begin
    if not mDBGrid.Columns[I].Visible then Continue;
    if Assigned(mDBGrid.Columns[I].Field) then
      mDBGrid.Columns[I].Width := Max(mDBGrid.Columns[I].Field.Tag,
        mDBGrid.Canvas.TextWidth(mDBGrid.Columns[I].Title.Caption)) + mOffset
    else
      mDBGrid.Columns[I].Width :=
        mDBGrid.Canvas.TextWidth(mDBGrid.Columns[I].Title.Caption) + mOffset;
    mDBGrid.Refresh;
end;
Result := True;
end; {   DBGridAutoSize   }
///////原始碼結束///////使用樣本開始procedure TForm1.DBGrid1DrawColumnCell(Sender:TObject; const Rect:TRect;
DataCol:Integer; Column:TColumn; State:TGridDrawState);
begin
DBGridRecordSize(Column);
end;procedure TForm1.Button1Click(Sender:TObject);
begin
DBGridAutoSize(DBGrid1);
end;
///////使用樣本結束
uses Math;
 三、在Delphi中用ini檔案儲存表格列寬
用Delphi做資料庫系統開發,免不了要在許多地方輸出查詢結果,而顯示查詢結果最經常使用的控制項之一當屬TDBGrid。但TDBGrid控制項預設的顯示列寬是與資料庫中對應欄位的最大寬度相關的。例如,如果資料庫中有一個“聯絡地址”欄位,類型為varchar(200),那麼查詢結果是顯示方式是很不友好的!因為這一列會非常寬。而且,多數情況下,各列的寬度都不是設計者或使用者們想要的,這一點想必做系統開發的人都會認同。曾經,我的解決辦法是,在每個查詢操作之後 ,再調用一個自訂過程來分別設定各個表格的各列寬度,而這些寬度也是在設計階段,邊設計邊調試確定的。這樣做不僅麻煩,而且需要做大量的重複工作,非常不方便。並且這樣做是非常死板的:程式固定了表格各列的寬度!實際上是設計者固定了!如果能提供一個初始預設值,並由使用者自己設定,那當然是最好不過了。因此,更為高效的一個解決辦法是利用ini檔案儲存體各個表格各列的寬度。但為了讀取和儲存方便,各段中的節名最好使用數位形式,這樣就可以通過一個迴圈語句實現了。之所以用ini檔案,一是因為ini檔案讀寫非常方便,二是在讀取時需指定一個失敗時的傳回值。當然還可以使用StringList儲存設定到其他文字檔中,所謂羅蔔青菜各有所愛。通常需要使用表格的地方不只三兩個,那最好就將各個表格的列寬設定儲存在同一個ini檔案中,通過段名來區分各個表格。下面講一下我自己的具體實現方法。流程定義:建立一表單,在介面中引用DBGrids。定義兩個過程SetColumnWidth和SaveColumnWidth,分別用於從/向ini檔案讀取/儲存表格列寬。兩個過程均需要三個參數,分別接受傳入的TDBGrid,ini檔案中的段名和包含路徑的ini檔案名稱;其中段名用於區分不同的表。兩個過程分別如下:-------------------------------------------------------------------------------procedure TGridForm.SetColumnWidth(const Grid:TDBGrid;section,fname:string);
var
i:integer;
inifile:TIniFile; //調入檔案並根據ini檔案內容指定DBGrid1的列寬度
begin
if FileExists(fname) then //若檔案存在
begin
try
inifile:=TIniFile.Create(fname);
for i :=0 to Grid.Columns.Count-1 do
Grid.Columns[i].Width:=inifile.ReadInteger(section,inttostr(i),150);
finally //讀取失敗時返回150作預設值,可根據實際情況設寫
inifile.Free; //翻譯
end;
end;
end;-------------------------------------------------------------------------------procedure TGridForm.SaveColumnWidth(const grid:TDBGrid;section,fname:string);
var
i:integer;
inifile:TIniFile; //表單關閉時記錄DBGrid1的列寬度
begin
try
inifile:=TIniFile.Create(fname);
for i:=0 to Grid.Columns.Count-1 do
inifile.WriteInteger(section,inttostr(i),Grid.Columns[i].Width);
//寫入各列的寬度,以表格名為段名,以數字為節名,從0開始
//寫入當前列寬
finally
inifile.Free;
end;
end;-------------------------------------------------------------------------------而為了通用性,這個單元裡通常只編寫一些通過的或只供內部調用的過程/函數,用於被外部調用。例如表單名設定為GridForm,單元檔案儲存為GridUnit,這樣,在需要調用上述通過過程的表單,只需在其引用列表中添加GridUnit,在引用時傳入相應的參數即可。調用:在查詢資料庫後調用設定列寬的過程,不管查詢返回行數是否為0,因為返回0行(沒有返回)時,DBGrid的表格標題會有查詢的返回標題:GridForm.SetColumnWidth(DBGrid1,'庫存',ExtractFilePath(Application.ExeName)+'GridWidth.ini');在主調表單的關閉事件中儲存當前列寬GridForm.SaveColumnWidth(DBGrid1,'庫存',ExtractFilePath(Application.ExeName)+'GridWidth.ini');其中第二個參數指定在讀取/儲存的列寬為“庫存”表的,第三個參數指定ini檔案為應用程式所在目錄下的GrdiWidth.ini檔案,是通過應用程式目錄來尋找或儲存此ini檔案的,而最好不要使用絕對路徑。這樣,某個表格第一次顯示資料時,仍然是預設的情況,因為此時ini檔案裡還沒儲存有該表格的列寬設定。手動調整,關閉表單後,下次再開啟此表單,列寬就會被設定為上次手動調整的格式了,因為上次的調整結果已經儲存到ini檔案裡了。下面看一看此ini檔案裡都有哪些內容:-------------------------------------------------------------------------------[員工]
0=96
1=184
2=65
3=112
4=124
5=124
6=123
7=108
[業務清單]
0=64
1=184
2=304
3=82
4=64
5=6004
[部門]
0=75
1=138
2=184
3=127
[使用者]
0=184
1=85
2=110
3=177
[供應商]
0=106
1=82
2=82
3=42
4=123
5=123
6=130
7=122
8=141
......-------------------------------------------------------------------------------末了,還要說一點:通常儲存設定的檔案是在目前的目錄下,另建一個子目錄來儲存,但這樣在讀取時需要判斷此子目錄是否存在,若不存在則先建立之,特別是儲存,否則可能會出錯。  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.