多くの列を持つグリッド コンポーネント (DBGrid) があります。列の数が多いため、スクロールバーが作成されたため、グリッドの一部が非表示のままになっています。スクロールバーのために表示されていない部分を含めて、DBGridの実際の幅を調べる必要があります。ただし、Width プロパティはコンポーネント自体の幅のみを提供します。誰でも何か考えがありますか?
4 に答える
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;
おそらくこれは役に立つかもしれません。これは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;
解決策を見つけたと思います(少し奇妙に思えますが)。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;
過去に使用した関数を以下に示します。フォントに基づいてデータの幅を考慮し、垂直線が表示されている場合はそれを補正します
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;