2

多くの列を持つグリッド コンポーネント (DBGrid) があります。列の数が多いため、スクロールバーが作成されたため、グリッドの一部が非表示のままになっています。スクロールバーのために表示されていない部分を含めて、DBGridの実際の幅を調べる必要があります。ただし、Width プロパティはコンポーネント自体の幅のみを提供します。誰でも何か考えがありますか?

4

4 に答える 4

2

TDBGridプロパティを持っていColumnsます。各列には独自のWidthプロパティがあります。したがって、すべての列をループして、それらの幅を合計できます。

このような:

function TotalColumnsWidth(var AGrid: TDBGrid);
var
  i: Integer;
begin
  Result := 0;
  for i := to AGrid.Columns.Count - 1 do
    Result := Result + AGrid.Columns[i].Width;
end;
于 2009-11-11T17:50:26.507 に答える
1

おそらくこれは役に立つかもしれません。これはTDBGridのクラスヘルパーの一部であり、グリッドに空きスペースがないように最後の列のサイズを自動調整します。ニーズに合わせて簡単に調整できる必要があります。

お気づきかもしれませんが、CalcDrawInfoメソッドはあなたが探しているものです。保護されているため、クラスヘルパーまたは通常の保護されたハックを使用して手に入れることができます。

procedure TDbGridHelper.AutoSizeLastColumn;
var
  DrawInfo: TGridDrawInfo;
  ColNo: Integer;
begin
  ColNo := ColCount - 1;
  CalcDrawInfo(DrawInfo);
  if (DrawInfo.Horz.LastFullVisibleCell < ColNo - 1) then Exit;

  if (DrawInfo.Horz.LastFullVisibleCell < ColNo) then
    ColWidths[ColNo] := DrawInfo.Horz.GridBoundary - DrawInfo.Horz.FullVisBoundary
  else
    ColWidths[ColNo] := ColWidths[ColNo] + DrawInfo.Horz.GridExtent - DrawInfo.Horz.FullVisBoundary
end;
于 2009-11-11T21:29:13.613 に答える
0

解決策を見つけたと思います(少し奇妙に思えますが)。DBgrid の列幅と実際の幅の差を見つける (つまり、最後の列の後に残っている空きスペースの幅を見つける) ために、左側に現在どの列が表示されているか (現在の列とは何か) を追跡する必要があります。にスクロールされます)。現在スクロールされている列のみを描画するため、OnDrawColumnCell イベントを使用してこれを行うことができます。次に、表示されているすべての列の幅の合計を計算し、それを DBGrid の幅から差し引く必要があります。PS下手な英語でごめんなさい

例コード:

     For i:=0 to Last do
     if Vis[i] then
     Begin
      Sum:=Sum+DBG.Columns[i].Width;
      Inc(Cnt);
     End;

     if dgColLines in DBG.Options then
     Sum := Sum + Cnt;

  //add indicator column width
    if dgIndicator in DBG.Options then
    Sum := Sum + IndicatorWidth;
    Dif:=DBG.ClientWidth - Sum;
于 2009-11-11T19:02:16.840 に答える
0

過去に使用した関数を以下に示します。フォントに基づいてデータの幅を考慮し、垂直線が表示されている場合はそれを補正します

function GridTextWidth(fntFont : TFont; const sString : OpenString) :
  integer;
var
  f: TForm;
begin
  try
    f:=TForm.Create(nil);
    f.Font:=fntFont;
    result:=f.canvas.textwidth(sstring);
  finally
    f.Free;
    end;
end;




function CalcGridWidth(dbg : TDBGrid { the grid to meaure }): integer; { the "exact" width }
const cMEASURE_CHAR   = '0';
      iEXTRA_COL_PIX  = 4;
      iINDICATOR_WIDE = 11;
var i, iColumns, iColWidth, iTitleWidth, iCharWidth : integer;
begin
  iColumns := 0;
  result   := GetSystemMetrics(SM_CXVSCROLL);

  iCharWidth := GridTextWidth(dbg.font,cMeasure_char);

  with dbg.dataSource.dataSet do begin
    DisableControls;
    for i := 0 to FieldCount - 1 do with Fields[i] do
      if visible then
      begin
        iColWidth := iCharWidth * DisplayWidth;
        if dgTitles in dbg.Options then begin
          ititlewidth:=GridTextWidth(dbg.titlefont,displaylabel);
          if iColWidth < iTitleWidth then
            iColWidth := iTitleWidth;
        end;
        inc(iColumns, 1);
        inc(result, iColWidth + iEXTRA_COL_PIX);
      end;
      EnableControls;
    end;

  if dgIndicator in dbg.Options then
  begin
    inc(iColumns, 1);
    inc(result, iINDICATOR_WIDE);
  end;
  if dgColLines in dbg.Options then
    inc(result, iColumns)
  else
    inc(result, 1);
end;
于 2009-11-11T19:25:44.050 に答える