How to find the actual width of grid component with scrollbar in Delphi

前端 未结 4 439
我寻月下人不归
我寻月下人不归 2020-12-20 03:46

I have a grid component (DBGrid) which has lots of columns on it. Because of large number of columns, a scrollbar was created, and thus some part of grid remains hidden. I n

4条回答
  •  难免孤独
    2020-12-20 04:07

    Here are functions we have used in the past. It takes into account the width of data based on the font and also compensates for vertical lines if they are visible

    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;
    

提交回复
热议问题