2013-07-07 3 views
5

TDBGrid가 있습니다. 작동하지만 표시된 열은 매우 큽니다.열 너비 조정 DBGrid

어떻게 "열 폭 자동 수정"을 설정할 수 있습니까?

+4

각 열의 너비는 기본값으로 해당 필드의 선언 된 크기로 조정됩니다. 이것이 현실과 일치하지 않으면 데이터베이스 설계를 재고해야합니다. –

+0

@Uwe, Fields의'DisplayWidth'는'0' 문자의 수에 해당합니다. 각 문자의 크기는 Tahoma 크기 8 글꼴 (기본 배율로)이 6px입니다. 표시하는 경우 100 개의 'W'문자 (각각 10 픽셀 폭)를 사용한다고 가정 해 보겠습니다. 기본 열 너비는 실제로 필요한 것보다 400 픽셀 작아집니다 ('DisplayWidth'가 100 일 때). 따라서 너비를 자동 크기 조정하는 정반대의 이유가있을 수도 있습니다. – TLama

답변

10

필요한 열 너비는 그리드 캔버스의 설정과 각 필드의 표시 텍스트의 최대 길이에 따라 다릅니다.

procedure FitGrid(Grid: TDBGrid); 
const 
    C_Add=3; 
var 
    ds: TDataSet; 
    bm: TBookmark; 
    i: Integer; 
    w: Integer; 
    a: Array of Integer; 
begin 
    ds := Grid.DataSource.DataSet; 
    if Assigned(ds) then 
    begin 
    ds.DisableControls; 
    bm := ds.GetBookmark; 
    try 
     ds.First; 
     SetLength(a, Grid.Columns.Count); 
     while not ds.Eof do 
     begin 
     for I := 0 to Grid.Columns.Count - 1 do 
     begin 
      if Assigned(Grid.Columns[i].Field) then 
      begin 
      w := Grid.Canvas.TextWidth(ds.FieldByName(Grid.Columns[i].Field.FieldName).DisplayText); 
      if a[i] < w then 
       a[i] := w ; 
      end; 
     end; 
     ds.Next; 
     end; 
     for I := 0 to Grid.Columns.Count - 1 do 
     Grid.Columns[i].Width := a[i] + C_Add; 
     ds.GotoBookmark(bm); 
    finally 
     ds.FreeBookmark(bm); 
     ds.EnableControls; 
    end; 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    FitGrid(DBgrid1) 
end; 
+5

ZeroMemory가 필요하지 않습니다. SetLength는 모든 새 멤버를 0으로 초기화합니다. –

+0

좋은 해결책. 내부 선택에서 a [i] lurker

+0

큰 데이터 세트에서 오랜 시간이 걸릴 수 있으며 매우 긴 내용의 이탈 기록이있을 때 barfs가 사용됩니다. 우연히 'TDBGrid'가 처음부터 이런 종류의 기능을 갖고 있지 않은 이유와 Windows 탐색기가 어떤 상황에서는 '적절하게'크기를 조정하지 않는 이유가 있습니다. –

3

bummi의 대답의 마이너 수정 제목 행 (행 0) 절단 아니라는 것을 보장하기

procedure FitGrid(Grid: TDBGrid); 
const 
    C_Add=3; 
var 
    ds: TDataSet; 
    bm: TBookmark; 
    i: Integer; 
    w: Integer; 
    a: Array of Integer; 
begin 
    ds := Grid.DataSource.DataSet; 
    if Assigned(ds) then 
    begin 
    ds.DisableControls; 
    bm := ds.GetBookmark; 
    try 
     ds.First; 
     SetLength(a, Grid.Columns.Count); 
     while not ds.Eof do 
     begin 
     for I := 0 to Grid.Columns.Count - 1 do 
     begin 
      if Assigned(Grid.Columns[i].Field) then 
      begin 
      w := Grid.Canvas.TextWidth(ds.FieldByName(Grid.Columns[i].Field.FieldName.).DisplayText); 
      if a[i] < w then 
       a[i] := w ; 
      end; 
     end; 
     ds.Next; 
     end; 
     //if fieldwidth is smaller than Row 0 (field names) fix 
     for I := 0 to Grid.Columns.Count - 1 do 
     begin 
     w := Grid.Canvas.TextWidth(Grid.Columns[i].Field.FieldName); 
     if a[i] < w then 
      a[i] := w ; 
     end; 

     for I := 0 to Grid.Columns.Count - 1 do 
     Grid.Columns[i].Width := a[i] + C_Add; 
     ds.GotoBookmark(bm); 
    finally 
     ds.FreeBookmark(bm); 
     ds.EnableControls; 
    end; 
    end; 
end; 
+0

안녕하세요, 저는 델파이에 처음 온 경험이 있습니다. 자세한 내용을 설명하는 방법에 대해 자세히 묻습니다. 무엇이 i, w 및 좋은 것 같은 변수입니까? 나는 정말로 감사 할 것이다. – user2886091

2
bummi의 답변

마이너 수정, 제목 행 (행 0) 절단되지 않도록 보장하고 여분의 공간은 제목 행 (행 0) 절단되지 않도록 보장하기 위해 각 컬럼에 bummi의, TheSteven의와 옌스 '답변

procedure FitGrid(Grid: TDBGrid); 
const 
    C_Add = 3; 
var 
    ds: TDataSet; 
    bm: TBookmark; 
    i: Integer; 
    w: Integer; 
    a: array of Integer; 
begin 
    ds := Grid.DataSource.DataSet; 

    if not Assigned(ds) then 
    exit; 

    if Grid.Columns.Count = 0 then 
    exit; 

    ds.DisableControls; 
    bm := ds.GetBookmark; 
    try 
    ds.First; 
    SetLength(a, Grid.Columns.Count); 
    for i := 0 to Grid.Columns.Count - 1 do 
     if Assigned(Grid.Columns[i].Field) then 
     a[i] := Grid.Canvas.TextWidth(Grid.Columns[i].FieldName); 

    while not ds.Eof do 
    begin 

     for i := 0 to Grid.Columns.Count - 1 do 
     begin 
     if not Assigned(Grid.Columns[i].Field) then 
      continue; 

     w := Grid.Canvas.TextWidth(ds.FieldByName(Grid.Columns[i].Field.FieldName).DisplayText); 

     if a[i] < w then 
      a[i] := w; 
     end; 
     ds.Next; 
    end; 

    w := 0; 
    for i := 0 to Grid.Columns.Count - 1 do 
    begin 
     Grid.Columns[i].Width := a[i] + C_Add; 
     inc(w, a[i] + C_Add); 
    end; 

    w := (Grid.ClientWidth - w - 20) div (Grid.Columns.Count); 

    if w > 0 then 
     for i := 0 to Grid.Columns.Count - 1 do 
     Grid.Columns[i].Width := Grid.Columns[i].Width + w; 


    ds.GotoBookmark(bm); 
    finally 
    ds.FreeBookmark(bm); 
    ds.EnableControls; 
    end; 
end; 
0

사소한 수정을 할당되며, 초과 공간은여보세요있을 것입니다 각 열에는 이 포함되어 있으며 열의 가시성을 고려하여입니다.

procedure FitGrid(const Grid: TDBGrid; const CoverWhiteSpace: Boolean = True); 
const 
    C_Add=3; 
var 
    DS: TDataSet; 
    BM: TBookmark; 
    I, W, VisibleColumnsCount: Integer; 
    A: array of Integer; 
    VisibleColumns: array of TColumn; 
begin 
    DS := Grid.DataSource.DataSet; 
    if Assigned(DS) then 
    begin 
    VisibleColumnsCount := 0; 
    SetLength(VisibleColumns, Grid.Columns.Count); 
    for I := 0 to Grid.Columns.Count - 1 do 
     if Assigned(Grid.Columns[I].Field) and (Grid.Columns[I].Visible) then 
     begin 
     VisibleColumns[VisibleColumnsCount] := Grid.Columns[I]; 
     Inc(VisibleColumnsCount); 
     end; 
    SetLength(VisibleColumns, VisibleColumnsCount); 

    DS.DisableControls; 
    BM := DS.GetBookmark; 
    try 
     DS.First; 
     SetLength(A, VisibleColumnsCount); 
     while not DS.Eof do 
     begin 
     for I := 0 to VisibleColumnsCount - 1 do 
     begin 
      W := Grid.Canvas.TextWidth(DS.FieldByName(VisibleColumns[I].Field.FieldName).DisplayText); 
      if A[I] < W then 
       A[I] := W; 
     end; 
     DS.Next; 
     end; 
     //if fieldwidth is smaller than Row 0 (field names) fix 
     for I := 0 to VisibleColumnsCount - 1 do 
     begin 
     W := Grid.Canvas.TextWidth(VisibleColumns[I].Field.FieldName); 
     if A[I] < W then 
      A[I] := W; 
     end; 

     W := 0; 
     if CoverWhiteSpace then 
     begin 
     for I := 0 to VisibleColumnsCount - 1 do 
      Inc(W, A[I] + C_Add); 
     W := (Grid.ClientWidth - W - 20) div VisibleColumnsCount; 
     if W < 0 then 
      W := 0; 
     end; 

     for I := 0 to VisibleColumnsCount - 1 do 
     VisibleColumns[I].Width := A[I] + C_Add + W; 
     DS.GotoBookmark(BM); 
    finally 
     DS.FreeBookmark(BM); 
     DS.EnableControls; 
    end; 
    end; 
end;