vertical solucion sola regresa problemas mueve lap error desplazamiento con barra automaticamente arriba delphi datagridview scrollbar width dbgrid

delphi - solucion - problemas con la barra de desplazamiento vertical



Cómo encontrar el ancho real del componente de la cuadrícula con la barra de desplazamiento en Delphi (4)

Tengo un componente de cuadrícula (DBGrid) que tiene muchas columnas en él. Debido a la gran cantidad de columnas, se creó una barra de desplazamiento y, por lo tanto, una parte de la cuadrícula permanece oculta. Necesito averiguar cuál es el ancho real de DBGrid, incluida la parte que no se muestra debido a la barra de desplazamiento. Pero la propiedad Ancho solo da el ancho del componente en sí. ¿Alguien tiene alguna idea?


Aquí hay funciones que hemos usado en el pasado. Tiene en cuenta el ancho de los datos en función de la fuente y también compensa las líneas verticales si son visibles

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;


Creo que encontré una solución (aunque parece un poco extraña). Para encontrar la diferencia entre el ancho de las columnas y el ancho real de DBgrid (eso significa encontrar el ancho del espacio vacío que queda después de la última columna), necesitamos hacer un seguimiento de qué columna se muestra a la izquierda ahora (lo que es la columna actual que se desplaza hacia) Podemos hacer eso usando el evento OnDrawColumnCell, ya que dibujará solo las columnas que se desplazan ahora. Luego, necesitamos calcular la suma de anchos de todas las columnas visibles y restarla del ancho de DBGrid. PD: lo siento por el mal inglés

Código de Ex:

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;


Tal vez esto puede ser útil. Es parte de un ayudante de clase para TDBGrid que dimensiona automáticamente la última columna, de modo que la cuadrícula no tiene espacio vacío. Debería ser fácil de ajustar a sus necesidades.

Como puede observar, el método CalcDrawInfo es lo que está buscando. Como está protegido, puedes usar un ayudante de clase o el hack protegido habitual para ponerlo manos a la obra.

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 tiene una propiedad Columns . Cada una de las columnas tiene su propia propiedad Width . Entonces podrías recorrer todas las columnas y resumir sus anchos.

Me gusta esto:

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;