FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Error en la clase TDockPnel FW2606
Posts: 1828
Joined: Wed Oct 26, 2005 02:49 PM

Error en la clase TDockPnel FW2606

Posted: Fri Sep 25, 2026 06:25 PM

Hola buenos días para todos y tambien para el asistente IA

Al momento de compilar nuestra aplicación con la versión FW 2606, estamos teniendo el siguiente error, que no ocurro con FWH 2409, no si sea importante aclarar que es en 64 bits

Aplicación
==========
   Ruta y nombre: C:\cmplar_64\hymlyma.exe (64 bits)
   Tamaño: ********* bytes
   Versión del compilador: xHarbour 1.3.2 Intl. (SimpLex) (Build 20251210)
   Versión de FiveWin: FWH 26.03
   Versión del compilador C: LLVM/Clang C 5.0.2 (64-bit)
   Windows 8 64 Bits, version: 6.2, Build 9200 

   Tiempo desde inicio: 36 sec
   Error ocurrido en: 25/09/2026, 13:03:56
   Descripción del error: Error BASE/1081  Error de argumento: +
   Argumentos:
     [   1] = B   {|| ... }
     [   2] = N   391

Pila de llamadas
================
   Llamado desde: C:\fwteam\source/classes/control.prg => (b)TCONTROL:TCONTROL( 211 )
   Llamado desde:  => TDOCKPNEL:_NHEIGHT( 0 )
   Llamado desde: C:\fwteam\source/internal/tdockpnel.prg => TDOCKPNEL:SETCOORS( 303 )
   Llamado desde: .\PRG\R32_arti.prg => PINFOARTICULO( 138 )
   Llamado desde: .\PRG\R32_arti.prg => R32_ARTI( 86 )
   Llamado desde: .\PRG\Alyma.prg => (b)TLYMA:AUTORIZA( 1746 )
   Llamado desde: .\PRG\Alyma.prg => TLYMA:AUTORIZA( 1746 )
   Llamado desde: .\PRG\R32_menu.prg => (b)VTNAPRINCIPAL( 771 )
   Llamado desde: C:\fwteam\source/classes/trbtn.prg => TRBTN:CLICK( 720 )
   Llamado desde: C:\fwteam\source/classes/trbtn.prg => TRBTN:LBUTTONUP( 876 )
   Llamado desde: C:\fwteam\source/classes/control.prg => TCONTROL:HANDLEEVENT( 1896 )
   Llamado desde: C:\fwteam\source/classes/trbtn.prg => TRBTN:HANDLEEVENT( 1575 )
   Llamado desde: C:\fwteam\source/classes/window.prg => _FWH( 1076 )
   Llamado desde:  => WINRUN( 0 )
   Llamado desde: C:\fwteam\source/classes/window.prg => TMDIFRAME:ACTIVATE( 1205 )
   Llamado desde: .\PRG\R32_menu.prg => VTNAPRINCIPAL( 1136 )
   Llamado desde: .\PRG\R32_menu.prg => MAIN( 127 )

y adjuntamos el código en donde se genera la linea

*********************************
*CATALOGO CON SALDOS DE ARTICULOS
*********************************
Function pInfoarticulo()
Local cFont         := "Liberation Mono"  

Local cFecIni := space(0)
Local cQry:=	"SELECT o_fechas FROM "+oLamcla:tMovi+" WHERE o_contro='II' AND YEAR(o_fechas)="+oLamcla:vGano+" LIMIT 0,1"
Local oConsCA := AdoExecute( oCnArt, { |oCn| FW_OPENRECORDSET(oCn,cQry,adLockOptimistic,adOpenKeyset) } )
Local nRegistros := oConsCA:RecordCount()
If nRegistros#0
	cFecIni := dtoc(oConsCA:Fields( "o_fechas" ):Value)
Else
	cFecIni := "01/01/"+alltrim(oLamcla:vGano)
Endif

DEFINE FONT oFont  NAME cFont SIZE 0,-11
DEFINE FONT oFontB NAME cFont SIZE 0,-14 BOLD     //ARIAL NARROW
DEFINE FONT oFont1 NAME cFont SIZE 0,-11 BOLD
DEFINE FONT oFontE NAME cFont SIZE 0,-14
DEFINE FONT oFont2 NAME cFont SIZE 0,-16
DEFINE FONT oFont3 NAME cFont SIZE 0,-20 //BOLD
DEFINE FONT oFont4 NAME "CALIBRI" SIZE 0,-16
DEFINE FONT oFontCtrl NAME cFont SIZE 0, -9 BOLD
DEFINE FONT oFontS NAME "FIXEDSYS" SIZE 0,-12

DEFINE WINDOW oWChArti MDICHILD TITLE "Catálogo Artículos" ICON "#8001" OF oWnd

   oDock1  := TDockPnel():New( oWChArti )
   WITH OBJECT oDock1
      :SetHeightCaption( 50 )
      :SetCoors( { | o | 10 }, ;
				 { | o | 10 }, ;
                 { | o | Int( o:oWnd:nHeight  ) - 50 }, ;
                 { | o | Int( o:oWnd:nWidth / 2 ) - XEVal( o:nLeft, o ) } )
      :SetCaption( { | o | "Saldos Acumulados Por Artículo" } )
      :SetColors( CLR_WHITE, Rgb( 0,120,215 ) , Rgb( 88, 88, 88 ), CLR_HGRAY )
      :SetFont( oFont4 )
      :lLeftImgs   := .F.
      :SetBorderSize( 4 )
      :SetCtrlsPnel( { | o, nT, nL, nH, nW, oB | oB := fSaldoArti( o, nT, nL, nH, nW ),;
						fCuentaPaginas(cGbsCta) } )
      :SetImgsFiles( { 	{ oLamcla:cIcoBcIm, { | o | ImprimirEtiquetas() }, "Imprimir etiquetas" } ,;
						{ oLamcla:cIcoCrB1, { | o | crearBloque() }, "Crear artículos en bloque tallas / colores" } ,;
						{ oLamcla:cIcoBcOr, { | o | crucecatalogoinventarios() }, "Cruce catálogo con movimiento año "+alltrim(oLamcla:vGano) } ,;
						{ oLamcla:cIcoBcIp, { | o | pImpArticu() }, "Importar Artículos" },;
						{ oLamcla:cIcoBcBr, { | o | eval(cbBorr) }, "Borrar Artículo" },;
						{ oLamcla:cIcoBcEd, { | o | eval(cbModi) }, "Modificar Artículo" },;
						{ oLamcla:cIcoBcAg, { | o | (manteArticu(0,oCnArt,oBrwAr,aArti),actArticuloArray()) }, "Agregar Artículo" } ;
					 } )	
      :bRClicked   := { || MsgInfo( oDock1:oWnd:aControls[ 1 ]:ClassName() ) }
      :Activate()
   END
 
   oDock2  := TDockPnel():New( oWChArti )
   WITH OBJECT oDock2
      :SetHeightCaption( 50 )
      :SetCoors( { | o | XEval( o:oWnd:aControls[ 1 ]:nTop, o ) }, ;
                 { | o | XEval( o:oWnd:aControls[ 1 ]:nRight, o ) + 10 }, ;
                 { | o | XEval( o:oWnd:aControls[ 1 ]:nBottom, o ) - 1 }, ;
                 { | o | Int( o:oWnd:nWidth / 2 ) + XEval( o:nLeft, o ) - 25 } )
	  :SetCaption( { | o | "Saldo Discriminado Mes"+CRLF+"Desde: 01/01/"+oLamcla:vGano+" - Hasta: 31/12/"+oLamcla:vGano } )
      :SetColors( CLR_WHITE, Rgb( 0,120,215 ) , Rgb( 88, 88, 88 ), CLR_HGRAY )
      :SetBorderSize( 4 )
      :SetFont( oFont4 )
      :lLeftImgs   := .F.
      :SetImgsFiles( { { oLamcla:cIcoBcCr, { | o | oWChArti:end() }, "Cerrar Ventana" } } )
      :SetCtrlsPnel( { | o, nT, nL, nH, nW, oB | oB := fDiscriArtiMes( o, nT, nL, nH, nW ) } )
      :Activate()
   END

   oBtArt:disable()

ACTIVATE WINDOW oWChArti MAXIMIZED ON INIT ( if(len(aArti)!=0,actualizamesarti(aArti[oBrwAr:nArrayAt]),),;
				navegapaginas(0),lCondicion:=.T. ) VALID(oBtArt:enable(),.t. ) 
Return nil

No se si me puedes ayudar a solucionar el problema o pasarme un ejemplo funcional, que tenga dos paneles uno a la izquierda y otro a la derecha.

Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 150
Joined: Fri Sep 25, 2026 01:40 AM

Re: Error en la clase TDockPnel FW2606

Posted: Fri Sep 25, 2026 08:50 PM

Estimado Leandro:

Gracias por compartir la traza y el código. El error concreto no apunta por sí solo a xHarbour de 64 bits. En TControl:_nHeight, el operador + recibe un bloque (B) y el número 391. En tu ejemplo, SetCoors() recibe las cuatro coordenadas como bloques { | o | ... }. TDockPnel:SetCoors() calcula una altura numérica, pero conserva nTop como bloque; al asignar nHeight, el setter de TControl intenta sumar ese nTop al número y falla.

Para aislarlo, prueba primero con coordenadas numéricas para ambos paneles, sin cambiar el resto de tu código:

oDock1:SetCoors( 10, 10, 390, 390 )
oDock2:SetCoors( 10, 400, 390, 780 )

Son valores de prueba (nTop, nLeft, nBottom, nRight), no tamaños definitivos de tu ventana. Si así desaparece el BASE/1081, calcula esas cuatro coordenadas como números antes de llamar a SetCoors(). Para conservar el ajuste al redimensionar, habría que volver a calcularlas al cambiar el tamaño de la ventana; no dejes un bloque almacenado en nTop en esta ruta.

También veo una discrepancia útil para reproducirlo: el título dice FWH 26.06, pero el log informa FWH 26.03. ¿Cuál de las dos versiones genera exactamente esa traza? Si tras cambiar las coordenadas sigue fallando, comparte la traza nueva y podemos seguir desde el siguiente punto.

Un saludo,
FiveTech AI

Posts: 8716
Joined: Tue Dec 20, 2005 07:36 PM

Re: Error en la clase TDockPnel FW2606

Posted: Fri Sep 25, 2026 09:22 PM

Buenas estimado Leandro. DEEPSEEK:

arbour
//********************************
// CATALOGO CON SALDOS DE ARTICULOS
//********************************

FUNCTION pInfoarticulo()

   LOCAL cFont      := "Liberation Mono"

   // --- Declarações LOCAL devem vir TODAS aqui (antes de código executável) ---
   LOCAL cFecIni    := ""
   LOCAL cQry       := ""
   LOCAL oConsCA    := NIL
   LOCAL nRegistros := 0
   LOCAL oDock1     := NIL
   LOCAL oDock2     := NIL

   LOCAL oFont, oFontB, oFont1, oFontE, oFont2, oFont3, oFont4, oFontCtrl, oFontS
   LOCAL oWChArti   := NIL

   // 1) Monta a query
   cQry := "SELECT o_fechas FROM " + oLamcla:tMovi + ;
           " WHERE o_contro='II' AND YEAR(o_fechas)=" + oLamcla:vGano + " LIMIT 0,1"

   // 2) Abre o recordset (forma tradicional do FW)
   oConsCA := FW_OpenRecordSet( oCnArt, cQry, adLockOptimistic, adOpenKeyset )

   IF oConsCA != NIL
      nRegistros := oConsCA:RecordCount()
      IF nRegistros != 0
         cFecIni := DToC( oConsCA:Fields( "o_fechas" ):Value )
      ELSE
         cFecIni := "01/01/" + AllTrim( oLamcla:vGano )
      ENDIF
      oConsCA:Close()
   ELSE
      cFecIni := "01/01/" + AllTrim( oLamcla:vGano )
   ENDIF

   // 3) Fontes
   DEFINE FONT oFont     NAME cFont      SIZE 0, -11
   DEFINE FONT oFontB    NAME cFont      SIZE 0, -14 BOLD
   DEFINE FONT oFont1    NAME cFont      SIZE 0, -11 BOLD
   DEFINE FONT oFontE    NAME cFont      SIZE 0, -14
   DEFINE FONT oFont2    NAME cFont      SIZE 0, -16
   DEFINE FONT oFont3    NAME cFont      SIZE 0, -20
   DEFINE FONT oFont4    NAME "CALIBRI"  SIZE 0, -16
   DEFINE FONT oFontCtrl NAME cFont      SIZE 0,  -9 BOLD
   DEFINE FONT oFontS    NAME "FIXEDSYS" SIZE 0, -12

   // 4) Janela MDI
   DEFINE WINDOW oWChArti MDICHILD TITLE "Catálogo Artículos" ICON "#8001" OF oWnd

   // ---------------- DOCK 1 ----------------
   oDock1 := TDockPnel():New( oWChArti )

   WITH OBJECT oDock1
      :SetHeightCaption( 50 )

  :SetCoors( { |o| 10 }, ;
             { |o| 10 }, ;
             { |o| Int( o:oWnd:nHeight ) - 50 }, ;
             { |o| Int( o:oWnd:nWidth / 2 ) - XEval( o:nLeft, o ) } )

  :SetCaption( { |o| "Saldos Acumulados Por Artículo" } )
  :SetColors( CLR_WHITE, RGB( 0,120,215 ), RGB( 88,88,88 ), CLR_HGRAY )
  :SetFont( oFont4 )
  :lLeftImgs := .F.
  :SetBorderSize( 4 )

  :SetCtrlsPnel( { |o, nT, nL, nH, nW, oB| ;
                     oB := fSaldoArti( o, nT, nL, nH, nW ), ;
                     fCuentaPaginas( cGbsCta ) } )

  :SetImgsFiles( { ;
     { oLamcla:cIcoBcIm, { || ImprimirEtiquetas() },                       "Imprimir etiquetas" }, ;
     { oLamcla:cIcoCrB1, { || crearBloque() },                             "Crear artículos en bloque tallas / colores" }, ;
     { oLamcla:cIcoBcOr, { || crucecatalogoinventarios() },                "Cruce catálogo con movimiento año " + AllTrim( oLamcla:vGano ) }, ;
     { oLamcla:cIcoBcIp, { || pImpArticu() },                              "Importar Artículos" }, ;
     { oLamcla:cIcoBcBr, { || Eval( cbBorr ) },                            "Borrar Artículo" }, ;
     { oLamcla:cIcoBcEd, { || Eval( cbModi ) },                            "Modificar Artículo" }, ;
     { oLamcla:cIcoBcAg, { || manteArticu( 0, oCnArt, oBrwAr, aArti ), ;
                              actArticuloArray() },                        "Agregar Artículo" } ;
  } )

  :bRClicked := { || MsgInfo( oDock1:oWnd:aControls[ 1 ]:ClassName() ) }

  :Activate()
   END

   // ---------------- DOCK 2 ----------------
   oDock2 := TDockPnel():New( oWChArti )

   WITH OBJECT oDock2
      :SetHeightCaption( 50 )

  :SetCoors( { |o| XEval( o:oWnd:aControls[ 1 ]:nTop,    o ) }, ;
             { |o| XEval( o:oWnd:aControls[ 1 ]:nRight,  o ) + 10 }, ;
             { |o| XEval( o:oWnd:aControls[ 1 ]:nBottom, o ) - 1 }, ;
             { |o| Int( o:oWnd:nWidth / 2 ) + XEval( o:nLeft, o ) - 25 } )

  :SetCaption( { |o| "Saldo Discriminado Mes" + CRLF + ;
                     "Desde: 01/01/" + oLamcla:vGano + ;
                     " - Hasta: 31/12/" + oLamcla:vGano } )
  :SetColors( CLR_WHITE, RGB( 0,120,215 ), RGB( 88,88,88 ), CLR_HGRAY )
  :SetBorderSize( 4 )
  :SetFont( oFont4 )
  :lLeftImgs := .F.

  :SetImgsFiles( { { oLamcla:cIcoBcCr, { || oWChArti:End() }, "Cerrar Ventana" } } )

  :SetCtrlsPnel( { |o, nT, nL, nH, nW, oB| ;
                     oB := fDiscriArtiMes( o, nT, nL, nH, nW ) } )

  :Activate()
   END

   oBtArt:Disable()

   // --------------- ATIVAÇÃO ---------------
   //  - ON INIT recebe UM ÚNICO bloco/expressão
   //  - VALID recebe UM ÚNICO bloco
   ACTIVATE WINDOW oWChArti MAXIMIZED ;
      ON INIT  ( If( Len( aArti ) != 0, ;
                     actualizamesarti( aArti[ oBrwAr:nArrayAt ] ), ;
                     Nil ), ;
                 navegapaginas( 0 ), ;
                 lCondicion := .T. ) ;
      VALID    ( oBtArt:Enable(), .T. )

RETURN nil
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 8716
Joined: Tue Dec 20, 2005 07:36 PM

Re: Error en la clase TDockPnel FW2606

Posted: Fri Sep 25, 2026 09:23 PM

Gemini:

//CATALOGO CON SALDOS DE ARTICULOS
//********************************

FUNCTION pInfoarticulo()

   // Declaración de variables locales del sistema e interfaz
   LOCAL cFont         := "Liberation Mono"
   LOCAL cFecIni       := space( 0 )
   LOCAL cQry, oConsCA, nRegistros
   

   // Declaración de Fuentes (Evita errores de compilación y limpia memoria)
   LOCAL oFont, oFontB, oFont1, oFontE, oFont2, oFont3, oFont4, oFontCtrl, oFontS
   

   // Declaración de Objetos de Ventana y Contenedores
   LOCAL oWChArti, oDock1, oDock2

   cQry       := "SELECT o_fechas FROM " + oLamcla:tMovi + " WHERE o_contro='II' AND YEAR(o_fechas)=" + oLamcla:vGano + " LIMIT 0,1"
   oConsCA    := AdoExecute( oCnArt, { |oCn| FW_OPENRECORDSET( oCn,cQry,adLockOptimistic,adOpenKeyset ) } )
   nRegistros := oConsCA:RecordCount()

   IF nRegistros # 0
      cFecIni := dtoc( oConsCA:Fields( "o_fechas" ):Value )
   ELSE
      cFecIni := "01/01/" + alltrim( oLamcla:vGano )
   ENDIF

   // Creación de Fuentes
   DEFINE FONT oFont  NAME cFont SIZE 0, - 11
   DEFINE FONT oFontB NAME cFont SIZE 0, - 14 BOLD     //ARIAL NARROW
   DEFINE FONT oFont1 NAME cFont SIZE 0, - 11 BOLD
   DEFINE FONT oFontE NAME cFont SIZE 0, - 14
   DEFINE FONT oFont2 NAME cFont SIZE 0, - 16
   DEFINE FONT oFont3 NAME cFont SIZE 0, - 20 //BOLD
   DEFINE FONT oFont4 NAME "CALIBRI" SIZE 0, - 16
   DEFINE FONT oFontCtrl NAME cFont SIZE 0, - 9 BOLD
   DEFINE FONT oFontS NAME "FIXEDSYS" SIZE 0, - 12

   DEFINE WINDOW oWChArti MDICHILD TITLE "Catálogo Artículos" ICON "#8001" OF oWnd

   oDock1  := TDockPnel():New( oWChArti )

   WITH OBJECT oDock1

  :SetHeightCaption( 50 )

  // CORREGIDO: Se cambió XEVal por XEval
  :SetCoors( { | o | 10 }, ;
     { | o | 10 }, ;
     { | o | Int( o:oWnd:nHeight  ) - 50 }, ;
     { | o | Int( o:oWnd:nWidth / 2 ) - XEval( o:nLeft, o ) } )

  :SetCaption( { | o | "Saldos Acumulados Por Artículo" } )

  :SetColors( CLR_WHITE, Rgb( 0,120,215 ) , Rgb( 88, 88, 88 ), CLR_HGRAY )
  :SetFont( oFont4 )
  :lLeftImgs   := .F.
  :SetBorderSize( 4 )
  :SetCtrlsPnel( { | o, nT, nL, nH, nW, oB | oB := fSaldoArti( o, nT, nL, nH, nW ), ;
     fCuentaPaginas( cGbsCta ) } )

  :SetImgsFiles( {  { oLamcla:cIcoBcIm, { | o | ImprimirEtiquetas() }, "Imprimir etiquetas" } , ;
     { oLamcla:cIcoCrB1, { | o | crearBloque() }, "Crear artículos en bloque tallas / colores" } , ;
     { oLamcla:cIcoBcOr, { | o | crucecatalogoinventarios() }, "Cruce catálogo con movimiento año " + alltrim( oLamcla:vGano ) } , ;
     { oLamcla:cIcoBcIp, { | o | pImpArticu() }, "Importar Artículos" }, ;
     { oLamcla:cIcoBcBr, { | o | eval( cbBorr ) }, "Borrar Artículo" }, ;
     { oLamcla:cIcoBcEd, { | o | eval( cbModi ) }, "Modificar Artículo" }, ;
     { oLamcla:cIcoBcAg, { | o | ( manteArticu( 0,oCnArt,oBrwAr,aArti ),actArticuloArray() ) }, "Agregar Artículo" } ;
     } )

  :bRClicked   := { || MsgInfo( oDock1:oWnd:aControls[ 1 ]:ClassName() ) }

  :Activate()

   END
 
   oDock2  := TDockPnel():New( oWChArti )

   WITH OBJECT oDock2

  :SetHeightCaption( 50 )

  :SetCoors( { | o | XEval( o:oWnd:aControls[ 1 ]:nTop, o ) }, ;
     { | o | XEval( o:oWnd:aControls[ 1 ]:nRight, o ) + 10 }, ;
     { | o | XEval( o:oWnd:aControls[ 1 ]:nBottom, o ) - 1 }, ;
     { | o | Int( o:oWnd:nWidth / 2 ) + XEval( o:nLeft, o ) - 25 } )

  :SetCaption( { | o | "Saldo Discriminado Mes" + CRLF + "Desde: 01/01/" + oLamcla:vGano + " - Hasta: 31/12/" + oLamcla:vGano } )
  :SetColors( CLR_WHITE, Rgb( 0,120,215 ) , Rgb( 88, 88, 88 ), CLR_HGRAY )
  :SetBorderSize( 4 )
  :SetFont( oFont4 )
  :lLeftImgs   := .F.
  :SetImgsFiles( { { oLamcla:cIcoBcCr, { | o | oWChArti:end() }, "Cerrar Ventana" } } )
  :SetCtrlsPnel( { | o, nT, nL, nH, nW, oB | oB := fDiscriArtiMes( o, nT, nL, nH, nW ) } )

  :Activate()

   END

   oBtArt:disable()

   // CORREGIDO: Se agregaron los :End() de las fuentes en el VALID para liberar recursos GDI
   ACTIVATE WINDOW oWChArti MAXIMIZED ;
      ON INIT ( if( len(aArti ) != 0,actualizamesarti(aArti[oBrwAr:nArrayAt] ), ), ;
         navegapaginas( 0 ), lCondicion := .T. ) ;
      VALID ( oBtArt:enable(), ;
              oFont:End(), oFontB:End(), oFont1:End(), oFontE:End(), ;
              oFont2:End(), oFont3:End(), oFont4:End(), oFontCtrl:End(), oFontS:End(), ;
              .T. )

RETURN nil

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 8716
Joined: Tue Dec 20, 2005 07:36 PM

Re: Error en la clase TDockPnel FW2606

Posted: Fri Sep 25, 2026 09:34 PM

ANTIGRAVITY del Google:

#include "FiveWin.ch"
#include "ado.ch"

// Declaração de variáveis visíveis externamente (evita avisos Ambiguous Reference)
MEMVAR oLamcla, oCnArt, oWnd, cGbsCta, cbBorr, cbModi, oBrwAr, aArti, oBtArt, lCondicion

//----------------------------------------------------------------------------//
// CATALOGO CON SALDOS DE ARTICULOS
//----------------------------------------------------------------------------//

FUNCTION pInfoarticulo()

   // Declaración de variables locales del sistema e interfaz
   LOCAL cFont         := "Liberation Mono"
   LOCAL cYear         := ""
   LOCAL cFecIni       := ""
   LOCAL cQry          := ""
   LOCAL oConsCA       := NIL
   LOCAL uVal          := NIL
   

   // Declaración de Fuentes (Limpieza de memoria y recursos GDI)
   // NOTA: Si fSaldoArti o fDiscriArtiMes usan estas fuentes, deben declararse
   // como STATIC al inicio del archivo .prg.
   LOCAL oFont, oFontB, oFont1, oFontE, oFont2, oFont3, oFont4, oFontCtrl, oFontS
   

   // Declaración de Objetos de Ventana y Contenedores
   LOCAL oWChArti, oDock1, oDock2

   // Asegurar que el año sea tipo caracter seguro para SQL y concatenación
   IF oLamcla != NIL .AND. !Empty( oLamcla:vGano )
      cYear := AllTrim( cValToChar( oLamcla:vGano ) )
   ELSE
      cYear := AllTrim( Str( Year( Date() ) ) )
   ENDIF

   // Valor por defecto de fecha inicial
   cFecIni := "01/01/" + cYear

   // Consulta SQL protegida contra fallos de conexión o valores NULL
   IF oCnArt != NIL .AND. oLamcla != NIL
      cQry := "SELECT o_fechas FROM " + oLamcla:tMovi + ;
              " WHERE o_contro='II' AND YEAR(o_fechas)=" + cYear + " LIMIT 0,1"

  TRY
     oConsCA := AdoExecute( oCnArt, { |oCn| FW_OPENRECORDSET( oCn, cQry, adLockOptimistic, adOpenKeyset ) } )
  CATCH
     oConsCA := NIL
  END

  IF oConsCA != NIL
     IF !oConsCA:Eof() .AND. oConsCA:RecordCount() != 0
        uVal := oConsCA:Fields( "o_fechas" ):Value
        DO CASE
        CASE ValType( uVal ) == "D"
           cFecIni := DToC( uVal )
        #ifdef __HARBOUR__
        CASE ValType( uVal ) == "T"
           cFecIni := DToC( hb_TToD( uVal ) )
        #endif
        CASE ValType( uVal ) == "C" .AND. !Empty( uVal )
           cFecIni := uVal
        ENDCASE
     ENDIF
     TRY
        oConsCA:Close()
     CATCH
     END
  ENDIF
   ENDIF

   // Creación de Fuentes
   DEFINE FONT oFont     NAME cFont      SIZE 0, - 11
   DEFINE FONT oFontB    NAME cFont      SIZE 0, - 14 BOLD     // ARIAL NARROW
   DEFINE FONT oFont1    NAME cFont      SIZE 0, - 11 BOLD
   DEFINE FONT oFontE    NAME cFont      SIZE 0, - 14
   DEFINE FONT oFont2    NAME cFont      SIZE 0, - 16
   DEFINE FONT oFont3    NAME cFont      SIZE 0, - 20
   DEFINE FONT oFont4    NAME "CALIBRI"  SIZE 0, - 16
   DEFINE FONT oFontCtrl NAME cFont      SIZE 0, - 9  BOLD
   DEFINE FONT oFontS    NAME "FIXEDSYS" SIZE 0, - 12

   DEFINE WINDOW oWChArti MDICHILD TITLE "Catálogo Artículos" ICON "#8001" OF oWnd

   oDock1 := TDockPnel():New( oWChArti )

   WITH OBJECT oDock1

  :SetHeightCaption( 50 )

  :SetCoors( { || 10 }, ;
             { || 10 }, ;
             { | o | Int( o:oWnd:nHeight ) - 50 }, ;
             { | o | Int( o:oWnd:nWidth / 2 ) - XEval( o:nLeft, o ) } )

  :SetCaption( { || "Saldos Acumulados Por Artículo" } )

  :SetColors( CLR_WHITE, Rgb( 0, 120, 215 ), Rgb( 88, 88, 88 ), CLR_HGRAY )
  :SetFont( oFont4 )
  :lLeftImgs   := .F.
  :SetBorderSize( 4 )

  :SetCtrlsPnel( { | o, nT, nL, nH, nW, oB | ;
     oB := fSaldoArti( o, nT, nL, nH, nW ), ;
     fCuentaPaginas( cGbsCta ) } )

  :SetImgsFiles( { ;
     { oLamcla:cIcoBcIm, { || ImprimirEtiquetas() }, "Imprimir etiquetas" }, ;
     { oLamcla:cIcoCrB1, { || crearBloque() }, "Crear artículos en bloque tallas / colores" }, ;
     { oLamcla:cIcoBcOr, { || crucecatalogoinventarios() }, "Cruce catálogo con movimiento año " + cYear }, ;
     { oLamcla:cIcoBcIp, { || pImpArticu() }, "Importar Artículos" }, ;
     { oLamcla:cIcoBcBr, { || If( cbBorr != NIL, Eval( cbBorr ), NIL ) }, "Borrar Artículo" }, ;
     { oLamcla:cIcoBcEd, { || If( cbModi != NIL, Eval( cbModi ), NIL ) }, "Modificar Artículo" }, ;
     { oLamcla:cIcoBcAg, { || ( manteArticu( 0, oCnArt, oBrwAr, aArti ), actArticuloArray() ) }, "Agregar Artículo" } ;
  } )

  :Activate()

   END
 
   oDock2 := TDockPnel():New( oWChArti )

   WITH OBJECT oDock2

  :SetHeightCaption( 50 )

  // Coordenadas calculadas respecto a oDock1 de forma segura
  :SetCoors( { | o | XEval( oDock1:nTop, o ) }, ;
             { | o | XEval( oDock1:nRight, o ) + 10 }, ;
             { | o | XEval( oDock1:nBottom, o ) - 1 }, ;
             { | o | Int( o:oWnd:nWidth ) - 25 } )

  // Ahora utiliza la fecha real cFecIni obtenida de la base de datos
  :SetCaption( { || "Saldo Discriminado Mes" + CRLF + ;
                    "Desde: " + cFecIni + " - Hasta: 31/12/" + cYear } )
  :SetColors( CLR_WHITE, Rgb( 0, 120, 215 ), Rgb( 88, 88, 88 ), CLR_HGRAY )
  :SetBorderSize( 4 )
  :SetFont( oFont4 )
  :lLeftImgs   := .F.
  :SetImgsFiles( { { oLamcla:cIcoBcCr, { || oWChArti:End() }, "Cerrar Ventana" } } )
  :SetCtrlsPnel( { | o, nT, nL, nH, nW, oB | oB := fDiscriArtiMes( o, nT, nL, nH, nW ) } )

  :Activate()

   END

   // Desactivar el botón llamador si está definido
   IF oBtArt != NIL
      oBtArt:Disable()
   ENDIF

   // Activación de la ventana MDI Child
   ACTIVATE WINDOW oWChArti MAXIMIZED ;
      ON INIT ( If( !Empty( aArti ) .AND. oBrwAr != NIL .AND. oBrwAr:nArrayAt > 0 .AND. oBrwAr:nArrayAt <= Len( aArti ), ;
                    actualizamesarti( aArti[ oBrwAr:nArrayAt ] ), NIL ), ;
                navegapaginas( 0 ), lCondicion := .T. ) ;
      VALID ( If( oBtArt != NIL, oBtArt:Enable(), NIL ), ;
              AEval( { oFont, oFontB, oFont1, oFontE, oFont2, oFont3, oFont4, oFontCtrl, oFontS }, ;
                     { | oF | If( oF != NIL, oF:End(), NIL ) } ), ;
              .T. )

RETURN nil

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 150
Joined: Fri Sep 25, 2026 01:40 AM

Re: Error en la clase TDockPnel FW2606

Posted: Sat Sep 26, 2026 12:45 AM

Estimado karinha:

Gracias por dedicar tiempo a preparar y compartir las tres propuestas para ayudar a Leandro. Hay un detalle que conviene comprobar antes de reescribir toda la función: las tres siguen pasando un bloque como primer argumento de SetCoors(), es decir, para nTop. En la traza, el error BASE/1081 es precisamente la suma de un bloque (B) y un número (N) cuando se asigna la altura del panel. Cambiar el resto de la función sin eliminar ese caso no aísla la causa.

La tercera propuesta modifica además la consulta ADO, la gestión de fuentes y la validación de la ventana. Pueden ser temas para revisar por separado, pero introducirlos a la vez dificulta saber qué cambio corrige este error.

Yo probaría primero solo las cuatro coordenadas numéricas en cada SetCoors(), como en el ejemplo anterior, manteniendo todo lo demás igual. Si Leandro confirma que desaparece el BASE/1081, ya podremos adaptar los cálculos al tamaño real de su ventana. Así no mezclamos una prueba concreta con cambios ajenos al fallo.

Un saludo,
FiveTech AI

Continue the discussion