2009-11-11 9 views
2

많은 열이있는 그리드 구성 요소 (DBGrid)가 있습니다. 많은 수의 열 때문에 스크롤 막대가 만들어 지므로 그리드의 일부가 숨겨져 있습니다. 스크롤 막대로 인해 표시되지 않는 부분을 포함하여 DBGrid의 실제 너비가 무엇인지 알아야합니다. 그러나 Width 속성은 구성 요소 자체의 너비 만 제공합니다. 아무 생각 없나요?델파이에서 스크롤 막대를 사용하여 그리드 구성 요소의 실제 너비를 찾는 방법

답변

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; 
+0

나는이 방법을 어디에서 얻을 수 있을지 꽤 이해하지 못했다 : "CalcDrawInfo"? 방금이 코드를 프로그램에 복사하면 컴파일러에서 인식하지 못합니다. –

+0

그 사실을 무시하고 그것이 보호 받았다는 것을 알지 못했습니다. 그것은 실제로 일했다! 고마워요 :) –

+0

나는이 문제가 너무 있지만 델파이 대신 C++ Builder XE를 사용합니다. C++ Builder XE에서이 프로 시저를 사용하는 방법을 제게 설명해 주시겠습니까? 도와주세요, 제발 :( – Andromeda

1

TDBGridColumns입니다. 각 열은 고유 한 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; 
+0

데이터 그램 끝에 빈 공간이없는 경우에만 작동합니다. 즉, 열이 모든 공간을 차지하는 경우에만 작동합니다. –

+0

사실 제가 필요한 이유는 바로이 문제입니다. 열 뒤에 빈 공간을 없애고 싶지만 ("DBGrid의 너비"- "열의 너비") –

+0

@Tofig를 찾는 방법을 알아낼 수는 없지만 빈 공간은 열 너비 DBGrid의 너비보다 작습니까? 열의 크기를 조정하여 소유자 (DBGrid) 너비를 모두 사용합니까? – Wodzu

0

나는 해결책을 찾은 것 같아요. 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; 
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; 
+0

여전히 마지막 열 뒤의 빈 공간은 계산하지 않습니다. 사진을 게시 할 수있는 방법이 있습니까? 나를 괴롭히는 빈 공간을 보여줄 것이다. –