많은 열이있는 그리드 구성 요소 (DBGrid)가 있습니다. 많은 수의 열 때문에 스크롤 막대가 만들어 지므로 그리드의 일부가 숨겨져 있습니다. 스크롤 막대로 인해 표시되지 않는 부분을 포함하여 DBGrid의 실제 너비가 무엇인지 알아야합니다. 그러나 Width 속성은 구성 요소 자체의 너비 만 제공합니다. 아무 생각 없나요?델파이에서 스크롤 막대를 사용하여 그리드 구성 요소의 실제 너비를 찾는 방법
답변
아마도 도움이 될 수 있습니다. 그리드에 빈 공간이 없도록 마지막 열의 크기를 자동으로 조정하는 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;
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;
데이터 그램 끝에 빈 공간이없는 경우에만 작동합니다. 즉, 열이 모든 공간을 차지하는 경우에만 작동합니다. –
사실 제가 필요한 이유는 바로이 문제입니다. 열 뒤에 빈 공간을 없애고 싶지만 ("DBGrid의 너비"- "열의 너비") –
@Tofig를 찾는 방법을 알아낼 수는 없지만 빈 공간은 열 너비 DBGrid의 너비보다 작습니까? 열의 크기를 조정하여 소유자 (DBGrid) 너비를 모두 사용합니까? – Wodzu
나는 해결책을 찾은 것 같아요. DBgrid의 열 너비와 실제 너비의 차이를 확인하려면 (즉, 마지막 열 뒤의 빈 공간의 너비를 찾으라는 의미입니다.) 왼쪽에 현재 표시된 열을 추적해야합니다 (현재 열은 무엇입니까? 그것은에 스크롤됩니다). OnDrawColumnCell 이벤트를 사용하면 스크롤 할 수있는 열만 그릴 것이기 때문에이를 수행 할 수 있습니다. 그런 다음 가시적 인 모든 열의 너비 합계를 계산하여 DBGrid의 너비에서 뺍니다. 추신 나쁜 영어
예 코드에 대한 죄송합니다 : 여기
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;
여전히 마지막 열 뒤의 빈 공간은 계산하지 않습니다. 사진을 게시 할 수있는 방법이 있습니까? 나를 괴롭히는 빈 공간을 보여줄 것이다. –
나는이 방법을 어디에서 얻을 수 있을지 꽤 이해하지 못했다 : "CalcDrawInfo"? 방금이 코드를 프로그램에 복사하면 컴파일러에서 인식하지 못합니다. –
그 사실을 무시하고 그것이 보호 받았다는 것을 알지 못했습니다. 그것은 실제로 일했다! 고마워요 :) –
나는이 문제가 너무 있지만 델파이 대신 C++ Builder XE를 사용합니다. C++ Builder XE에서이 프로 시저를 사용하는 방법을 제게 설명해 주시겠습니까? 도와주세요, 제발 :( – Andromeda