Página 1 de 1

Error en TBrowseMod AdjustColWidth()

Publicado: Sab Jul 12, 2025 3:28 am
por Israel Solis
Equipo Xailer:

Existe un error en el método AdjustColWidth() en la clase tBrowseMod... Puedes reproducirlo con "\Samples\Modern\Browses\ArrayBrowse\ArrayBrowse.xpj"

Ejecuta y haz DOBLE CLIC en la división de la columna Married (columna que muestra imagen) para que se autoajuste el ancho...

Código: Seleccionar todo

  /* Este codigo se movió mas abajo, aqui marcaba error
   IF oItem:oGridCol:lDataImageUsed
      nMax += ::oImageList:nWidth
   ENDIF*/

   nData += ( ::oDataGrid:nMargin * 2 )
   nMax  := Max( nHeader, nData )
   nMax  := Min( nMax, ::nClientWidth - 50 )

   // El codigo se movio aqui..
   IF oItem:oGridCol:lDataImageUsed
      nMax += ::oImageList:nWidth
   ENDIF

Re: Error en TBrowseMod AdjustColWidth()

Publicado: Lun Jul 14, 2025 4:59 pm
por ignacio
Muchas gracias,

Visto el error. No obstante, la solución no es correcta porque el ancho de la imagen cuando hay imagen en los datos debe afectar sólo al cálculo del ancho de ese apartado y no al total. Adjunto solución más correcta:

Código: Seleccionar todo

METHOD AdjustColWidth( oCol, lCalc ) CLASS xBrowseMod

   LOCAL oItem, oFont
   LOCAL aRow
   LOCAL xValue
   LOCAL cPicture
   LOCAL nDataCol, nWidth, nHeader, nData, nMax, nImg
   LOCAL lImgData

   DEFAULT lCalc TO .F.

   oFont := ::oFont

   IF oCol:IsKindOf( "TBrwColMod" )
      oItem := oCol:oHeaderCol
   ELSE
      oItem := oCol
   ENDIF

   WITH OBJECT oItem:oGridCol
      nDataCol := :nDataCol
      cPicture := :cPicture
      IF :nImage > 0
         nImg := ::oImageList:nWidth
      ELSE
         nImg := 0
      ENDIF
      lImgData := :lDataImageUsed
   END WITH

   nHeader := oFont:GetTextWidth( oItem:cHeader, Self )
   nHeader += ( ::oDataGrid:nMargin * 2 ) + nImg
   nHeader := MulDiv( nHeader, 120, 100 )
   nData   := 0

   FOR EACH aRow IN ::aGridData
      xValue := aRow[ nDataCol ]
      IF !Empty( xValue )
         nWidth := oFont:GetTextWidth( Transform( xValue, cPicture ), Self )
         IF nWidth > nData
            nData := nWidth
         ENDIF
      ENDIF
   NEXT

   nData += ( ::oDataGrid:nMargin * 2 ) + IIF( lImgData, nImg, 0 )
   nMax  := Max( nHeader, nData )
   nMax  := Min( nMax, ::nClientWidth - 50 )

   IF !lCalc
      oItem:oGridCol:nWidth := nMax
   ENDIF

RETURN nMax