<![CDATA[HMGforum.com]]> http://mail.hmgforum.com Mon, 14 Sep 2026 23:14:52 +0000 Smartfeed extension for phpBB http://mail.hmgforum.com/styles/prosilver/theme/images/site_logo.svg <![CDATA[HMGforum.com]]> http://mail.hmgforum.com en-gb Mon, 14 Sep 2026 23:14:52 +0000 60 <![CDATA[HMG General Help :: HMG 3.6 + TMySQLServer() :: Author edufloriv]]> http://mail.hmgforum.com/viewtopic.php?f=5&t=7769&p=72399#p72399
Recién intente compilar un sistema con hmg 3.6 y al parecer todo iba bien pero encontré este error:
hmg36.png
¿ Significar que ya no hay soporte para TMySqlServer() ?

Gracias anticipadas y saludos a todos.

Attachments


hmg36.png (87.55 KiB)

]]>
no_email@example.com (edufloriv) http://mail.hmgforum.com/viewtopic.php?f=5&t=7769&p=72399#p72399 Wed, 19 Aug 2026 11:53:37 +0000 http://mail.hmgforum.com/viewtopic.php?f=5&t=7769&p=72399#p72399
<![CDATA[HMG General Help :: Re: HMG 3.6 + TMySQLServer() :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=5&t=7769&p=72401#p72401
edufloriv wrote: Wed Aug 19, 2026 11:53 am Saludos amigos,

Recién intente compilar un sistema con hmg 3.6 y al parecer todo iba bien pero encontré este error:

hmg36.png

¿ Significar que ya no hay soporte para TMySqlServer() ?

Gracias anticipadas y saludos a todos.
Hola Edu:
recien compilo TMySqlServer desde el contrib de harbour,
tuve que instalar MariaDb 12.3.2

Code: Select all

C:\core\contrib\hbmysql>set HB_WITH_MYSQL=C:\MariaDB\include\mysql

C:\core\contrib\hbmysql>buildsystem hbmysql.hbp
[INFO] BuildSystem
[BUILD] C:\WorkSpace\harbour64\bin\hbmk2.exe hbmysql.hbp
hbmk2: Procesando opciones de entorno: -comp=mingw64
hbmk2: Dependencia 'mysql' encontrada: C:\MariaDB\include\mysql
hbmk2[hbmysql]: Advertencia: Fuentes de Biblioteca de importación no se
                encontraron.
hbmk2: Harbour: Compilando módulos...
Harbour 3.2.1dev (r2607071005)
Copyright (c) 1999-2025, https://harbour.github.io/
Compiling 'hbmysql.hbx'...
Lines 63, Functions/Procedures 1
Generating C source output to '.hbmk\win\mingw64\hbmysql.c'... Done.
Compiling 'tmysql.prg'...
Lines 2477, Functions/Procedures 54
Generating C source output to '.hbmk\win\mingw64\tmysql.c'... Done.
Compiling 'tsqlbrw.prg'...
Lines 1674, Functions/Procedures 9
Generating C source output to '.hbmk\win\mingw64\tsqlbrw.c'... Done.
hbmk2: Compilando...
hbmk2: Creando librería estática... libhbmysql.a
[INFO] Build session: 20260819-145748-212653965468152
[INFO] Build log: C:\WorkSpace\logs\build\20260819-145748-212653965468152\raw.log
[INFO] Build completed.

C:\core\contrib\hbmysql>
]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=5&t=7769&p=72401#p72401 Wed, 19 Aug 2026 16:38:08 +0000 http://mail.hmgforum.com/viewtopic.php?f=5&t=7769&p=72401#p72401
<![CDATA[HMG General Help :: Re: HMG 3.6 + TMySQLServer() :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=5&t=7769&p=72402#p72402 Te dejo la libreria ya compilada, recuerda que use MariaDB para compilar el Contrib de hbmysql

recuerda que debes agregar Mingw64\bin y Habour64\bin al PATH

yo uso una nueva herramienta de compilacion de mi entorno de desarrollo ( Workspace)
hbmysql.rar
debes agregar las librerias estaticas a HMG o tu proyecto.
Captura de pantalla 2026-08-19 160418.png

Code: Select all

C:\Users\danie>cd C:\core\contrib\hbmysql

C:\core\contrib\hbmysql>set path=%path%;c:\Workspace\bin

C:\core\contrib\hbmysql>set HB_WITH_MYSQL=CC:\MariaDB\include\mysql

C:\core\contrib\hbmysql>buildsystem hbmysql.hbp
[INFO] BuildSystem
[BUILD] C:\WorkSpace\harbour64\bin\hbmk2.exe hbmysql.hbp
hbmk2: Procesando opciones de entorno: -comp=mingw64
hbmk2: Dependencia 'mysql' encontrada: C:\MariaDB\include\mysql
hbmk2: Encontrado archivo .lib con formto COFF con el mismo nombre, se recurre
       a usar éste en lugar de la .dll.
hbmk2: Biblioteca de importación creada: liblibmariadb.a <=
       C:\MariaDB\lib\libmariadb.lib
hbmk2: Creando librería estática... libhbmysql.a
[INFO] Build session: 20260819-160327-212653969407261
[INFO] Build log: C:\WorkSpace\logs\build\20260819-160327-212653969407261\raw.log
[INFO] Build completed.

Attachments

hbmysql.rar (50.58 KiB)

Captura de pantalla 2026-08-19 160418.png (45.48 KiB)

]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=5&t=7769&p=72402#p72402 Wed, 19 Aug 2026 19:12:00 +0000 http://mail.hmgforum.com/viewtopic.php?f=5&t=7769&p=72402#p72402
<![CDATA[HMG General Help :: Re: HMG 3.6 + TMySQLServer() :: Reply by edufloriv]]> http://mail.hmgforum.com/viewtopic.php?f=5&t=7769&p=72404#p72404 no_email@example.com (edufloriv) http://mail.hmgforum.com/viewtopic.php?f=5&t=7769&p=72404#p72404 Wed, 19 Aug 2026 23:20:10 +0000 http://mail.hmgforum.com/viewtopic.php?f=5&t=7769&p=72404#p72404 <![CDATA[HMG General Help :: Re: hmg application in service mode, possible? :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=5&t=2666&p=72403#p72403 ya tengo la version modificada del ejemplo TalkServer con API REST, despues publico el codigo

Attachments


Captura de pantalla 2026-08-19 183728.png (90.14 KiB)


Captura de pantalla 2026-08-19 183627.png (12.65 KiB)


Captura de pantalla 2026-08-19 184116.png (66.3 KiB)

]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=5&t=2666&p=72403#p72403 Wed, 19 Aug 2026 21:38:32 +0000 http://mail.hmgforum.com/viewtopic.php?f=5&t=2666&p=72403#p72403
<![CDATA[HMG General Help :: Re: hmg application in service mode, possible? :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=5&t=2666&p=72405#p72405 todavia tengo un error ya fue solucionado pero fue introducido de nuevo :roll:
Captura de pantalla 2026-08-20 183132.png
Captura de pantalla 2026-08-20 183720.png

Attachments


Captura de pantalla 2026-08-20 183132.png (74.8 KiB)


Captura de pantalla 2026-08-20 183720.png (29.36 KiB)

]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=5&t=2666&p=72405#p72405 Thu, 20 Aug 2026 21:34:04 +0000 http://mail.hmgforum.com/viewtopic.php?f=5&t=2666&p=72405#p72405
<![CDATA[HMG General Help :: Re: hmg application in service mode, possible? :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=5&t=2666&p=72410#p72410 https://hmgforum.com/viewtopic.php?t=77 ... 32fe095050]]> no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=5&t=2666&p=72410#p72410 Mon, 24 Aug 2026 19:06:30 +0000 http://mail.hmgforum.com/viewtopic.php?f=5&t=2666&p=72410#p72410 <![CDATA[HMG General Help :: Agregar libreria BosTaurus a build HMG 3.5 :: Author edufloriv]]> http://mail.hmgforum.com/viewtopic.php?f=5&t=7774&p=72437#p72437
Según la documentación de BosTaurus de HMG 3.5 no se requiere ningún parametro al compilar para usar la libreria BosTaurus que todo ya esta incluido en hmg.ch, pero cuando compilo:
hbmk2: Error: Función(es) referenciada, no encontrada, pero desconocida:
BT_BITMAPTEXTWIDTH(), BT_BITMAPTEXTHEIGHT()
Solo necesito esas dos funciones de la librería de momento. Alguna idea o información de si algo cambió. Gracias anticipadas y saludos.

----------------------------------------------------------------------------------------------------------------------
According to the HMG 3.5 BosTaurus documentation, no compilation parameters are required to use the BosTaurus library since everything is already included in `hmg.ch`; however, when I compile:
hbmk2: Error: Referenced function(s) not found:
BT_BITMAPTEXTWIDTH(), BT_BITMAPTEXTHEIGHT()
I only need those two functions from the library for the time being. Any ideas or information on whether something has changed? Thanks in advance.]]>
no_email@example.com (edufloriv) http://mail.hmgforum.com/viewtopic.php?f=5&t=7774&p=72437#p72437 Sun, 06 Sep 2026 21:08:08 +0000 http://mail.hmgforum.com/viewtopic.php?f=5&t=7774&p=72437#p72437
<![CDATA[HMG General Help :: Re: Agregar libreria BosTaurus a build HMG 3.5 :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=5&t=7774&p=72438#p72438
dame la funcion completa donde quiere impementar esas funciones para decirte que esta pasando]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=5&t=7774&p=72438#p72438 Mon, 07 Sep 2026 03:52:05 +0000 http://mail.hmgforum.com/viewtopic.php?f=5&t=7774&p=72438#p72438
<![CDATA[HMG General Help :: Actualización del Ejecutable. :: Author mjaviergutierrez]]> http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72446#p72446 Dejo una inquietud, que no sé si ya ha sido tratada, por que no sé como buscarla.
Tengo un sistema instalado en 5 PC's y cada vez que hago una modificación , tengo que reemplazar el .exe en todas las PC's , con lo que eso implica : coordinar para que me pasen el remoto, esperar, que esta la PC esta apagada, suspendida , etc.
Que metodo / forma utilizan para actualizar sus sistemas en las PC 's de los clientes ?
Saludos !]]>
no_email@example.com (mjaviergutierrez) http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72446#p72446 Tue, 08 Sep 2026 17:55:35 +0000 http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72446#p72446
<![CDATA[HMG General Help :: Re: Actualización del Ejecutable. :: Reply by serge_girard]]> http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72449#p72449 Works perfectly! At home I give 'order' to install new EXE (or some other file) and client will then autoload.
Let me know if I can help.

Serge]]>
no_email@example.com (serge_girard) http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72449#p72449 Wed, 09 Sep 2026 06:07:01 +0000 http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72449#p72449
<![CDATA[HMG General Help :: Re: Actualización del Ejecutable. :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72450#p72450
mjaviergutierrez wrote: Tue Sep 08, 2026 5:55 pm Hola Colegas !
Dejo una inquietud, que no sé si ya ha sido tratada, por que no sé como buscarla.
Tengo un sistema instalado en 5 PC's y cada vez que hago una modificación , tengo que reemplazar el .exe en todas las PC's , con lo que eso implica : coordinar para que me pasen el remoto, esperar, que esta la PC esta apagada, suspendida , etc.
Que metodo / forma utilizan para actualizar sus sistemas en las PC 's de los clientes ?
Saludos !
tienes un dominio ? para darte la forma de actualizar tu app en los clientes]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72450#p72450 Wed, 09 Sep 2026 13:44:06 +0000 http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72450#p72450
<![CDATA[HMG General Help :: Re: Actualización del Ejecutable. :: Reply by mjaviergutierrez]]> http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72451#p72451 serge : si, por favor.
daniel : no Daniel, no tengo ..... perdón]]>
no_email@example.com (mjaviergutierrez) http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72451#p72451 Wed, 09 Sep 2026 13:57:20 +0000 http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72451#p72451
<![CDATA[HMG General Help :: Re: Actualización del Ejecutable. :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72452#p72452
mjaviergutierrez wrote: Wed Sep 09, 2026 1:57 pm Buen día !
daniel : no Daniel, no tengo ..... perdón
puedes crear un enlace a tu dominio propio mediante NO-IP , en tu modem de fibra agregegarlo, poner un pendrive con tu app en el modem y gestionarlo como un servidor FTP

dentro del modem : DDNS Function
agrega tu cuenta noIP

en la parte avanzada usa Rules-Forward o Port Forwarding para redirigir la WAN a tu internal Host (192.168.1.1)

entonces despues ftp:\\tu-NOIP.ddns.net:21 :)]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72452#p72452 Thu, 10 Sep 2026 12:02:31 +0000 http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72452#p72452
<![CDATA[HMG General Help :: Re: Actualización del Ejecutable. :: Reply by mjaviergutierrez]]> http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72453#p72453 Lo voy probando, muchas gracias !]]> no_email@example.com (mjaviergutierrez) http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72453#p72453 Wed, 09 Sep 2026 16:30:56 +0000 http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72453#p72453 <![CDATA[HMG General Help :: Re: Actualización del Ejecutable. :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72454#p72454
mjaviergutierrez wrote: Wed Sep 09, 2026 4:30 pm Ok, Daniel
Lo voy probando, muchas gracias !
estoy creando una app con update y rollback , control de version, con SHA-256 para validar el contenido de zip]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72454#p72454 Thu, 10 Sep 2026 02:16:40 +0000 http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72454#p72454
<![CDATA[HMG General Help :: Re: Actualización del Ejecutable. :: Reply by serge_girard]]> http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72455#p72455 no_email@example.com (serge_girard) http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72455#p72455 Thu, 10 Sep 2026 06:56:12 +0000 http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72455#p72455 <![CDATA[HMG General Help :: Re: Actualización del Ejecutable. :: Reply by serge_girard]]> http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72456#p72456 no_email@example.com (serge_girard) http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72456#p72456 Thu, 10 Sep 2026 07:18:30 +0000 http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72456#p72456 <![CDATA[HMG General Help :: Re: Actualización del Ejecutable. :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72459#p72459
mjaviergutierrez wrote: Tue Sep 08, 2026 5:55 pm Hola Colegas !
Dejo una inquietud, que no sé si ya ha sido tratada, por que no sé como buscarla.
Tengo un sistema instalado en 5 PC's y cada vez que hago una modificación , tengo que reemplazar el .exe en todas las PC's , con lo que eso implica : coordinar para que me pasen el remoto, esperar, que esta la PC esta apagada, suspendida , etc.
Que metodo / forma utilizan para actualizar sus sistemas en las PC 's de los clientes ?
Saludos !
Hola Javier:
estoy haciendo un UniversalUpdater.
hay que integrar un modulo en la aplicacion que se fija que en algun lugar (web) esta una nueva version de tu app y que hay disponible una actualizacion.
al cerrar la app lanza UniversalUpdater y te app se actualiza segun lo hacen las aplicaciones comerciales.. ahora estoy usando un server FTP en modo local (mi red en 192.168.100.17)
ya obtengo el archivo json ...
apenas lo tenga disponible y probado lo subo para integrar en as app creadas :)]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72459#p72459 Sat, 12 Sep 2026 02:05:21 +0000 http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72459#p72459
<![CDATA[HMG General Help :: Re: Actualización del Ejecutable. :: Reply by mol]]> http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72462#p72462 Now I'm using my simple module for checking version of app installed in user's computer with version number placed on my web server.
If there is new version, client is asked for downloading and installing new one. I'm using InnoSetup to create installation file.]]>
no_email@example.com (mol) http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72462#p72462 Sun, 13 Sep 2026 19:55:11 +0000 http://mail.hmgforum.com/viewtopic.php?f=5&t=7776&p=72462#p72462
<![CDATA[Issues and Discussions related to Harbour :: hb_UnzipFile() :: Author danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=35&t=7777&p=72457#p72457
Estaba haciendo una app para actualizar las aplicaciones , dentro de la app estoy usando hb_UnzipFile() yhb_ZipFile()
pero al descomprimir tenia muchos problemas y no podia recuperar el contenido real.
revise la documentacion Harbour de los contrib (hbziparc.hbc , hbmzip.hbc) y encontre la falla en ziparc.prg
un bug silencioso que devolvia .T.

para ello les doy la correccion , solo compilar y colocar la libreria en su lugar ( en mi caso C:\WorkSpace\harbour64\lib\win\mingw64\libhbziparc.a)

Attachments

hbziparc.rar (9.56 KiB)
]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=35&t=7777&p=72457#p72457 Thu, 10 Sep 2026 21:07:41 +0000 http://mail.hmgforum.com/viewtopic.php?f=35&t=7777&p=72457#p72457
<![CDATA[Issues and Discussions related to Harbour :: Re: hb_UnzipFile() :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=35&t=7777&p=72458#p72458

Code: Select all

FUNCTION hb_UnzipFile( cFileName, bUpdate, lWithPath, cPassword, cPath, acFiles, bProgress )

   LOCAL lRetVal := .T.

   LOCAL hUnzip
   LOCAL nErr
   LOCAL nPos
   LOCAL cZipName
   LOCAL lExtract

   LOCAL hHandle
   LOCAL nSize
   LOCAL nRead
   LOCAL nLen
   LOCAL dDate
   LOCAL cTime
   LOCAL cBuffer := Space( t_nReadBuffer )
   LOCAL cTarget
   LOCAL cDir

   IF hb_defaultValue( lWithPath, .F. ) .AND. ! hb_DirExists( cPath ) .AND. ! Zip_MakeDirTree( cPath )
      lRetVal := .F.
   ENDIF

   IF Empty( cPassword )
      cPassword := NIL
   ENDIF

   IF Set( _SET_DEFEXTENSIONS )
      cFileName := hb_FNameExtSetDef( cFileName, ".zip" )
   ENDIF

   IF Empty( hUnzip := hb_unzipOpen( cFileName ) )
      lRetVal := .F.
   ELSE
      IF HB_ISNUMERIC( acFiles ) .OR. HB_ISSTRING( acFiles )
         acFiles := { acFiles }
      ENDIF

      IF Empty( cPath )
         cPath := hb_FNameDir( cFileName )
      ENDIF

      cPath := hb_DirSepAdd( cPath )

      nPos := 0
      nErr := hb_unzipFileFirst( hUnzip )
      DO WHILE nErr == 0

         nPos++

         IF hb_unzipFileInfo( hUnzip, @cZipName, @dDate, @cTime,,,, @nSize ) == 0

            lExtract := Empty( acFiles ) .OR. ;
               AScan( acFiles, nPos ) > 0 .OR. ;
               AScan( acFiles, {| cMask | hb_FileMatch( cZipName, cMask ) } ) > 0

            IF lExtract

               cTarget := cPath + cZipName

               IF Right( cZipName, 1 ) == "/" .OR. Right( cZipName, 1 ) == "\"

                  /* FIX (3): entrada de directorio → crear el directorio,
                     no intentar FCreate() sobre un nombre con separador final */

                  IF ! Zip_MakeDirTree( cTarget )
                     lRetVal := .F.
                  ENDIF

               ELSE

                  /* FIX (1)+(2): crear TODOS los directorios intermedios
                     antes de FCreate(), y NO silenciar el fallo */

                  cDir := hb_FNameDir( cTarget )
                  IF ! Empty( cDir ) .AND. ! Zip_MakeDirTree( cDir )
                     lRetVal := .F.
                  ELSEIF ( hHandle := FCreate( cTarget ) ) == F_ERROR
                     lRetVal := .F.
                  ELSE

                     IF hb_unzipFileOpen( hUnzip, cPassword ) != UNZ_OK
                        lRetVal := .F.
                        FClose( hHandle )
                        EXIT
                     ENDIF

                     nRead := 0
                     DO WHILE ( nLen := hb_unzipFileRead( hUnzip, @cBuffer, hb_BLen( cBuffer ) ) ) > 0

                        /* FIX (4): verificar la escritura */

                        IF FWrite( hHandle, cBuffer, nLen ) != nLen
                           lRetVal := .F.
                        ENDIF

                        IF HB_ISEVALITEM( bProgress )
                           nRead += nLen
                           Eval( bProgress, nRead, nSize )
                        ENDIF
                     ENDDO

                     hb_unzipFileClose( hUnzip )
                     FClose( hHandle )

                     hb_FSetDateTime( cTarget, dDate, cTime )

                     IF HB_ISEVALITEM( bUpdate )
                        Eval( bUpdate, cZipName, nPos )
                     ENDIF
                  ENDIF
               ENDIF
            ENDIF
         ENDIF

         nErr := hb_unzipFileNext( hUnzip )
      ENDDO

      hb_unzipClose( hUnzip )
   ENDIF

   RETURN lRetVal

STATIC FUNCTION Zip_MakeDirTree( cDir )

   IF Empty( cDir )
      RETURN .F.
   ENDIF

   IF hb_DirExists( cDir )
      RETURN .T.
   ENDIF

   /* hb_DirBuild() crea el árbol completo, nivel por nivel */

   hb_DirBuild( cDir )

   RETURN hb_DirExists( cDir )
Funcion Original :

Code: Select all

FUNCTION hb_UnzipFile( cFileName, bUpdate, lWithPath, cPassword, cPath, acFiles, bProgress )

   LOCAL lRetVal := .T.

   LOCAL hUnzip
   LOCAL nErr
   LOCAL nPos
   LOCAL cZipName
   LOCAL lExtract

   LOCAL hHandle
   LOCAL nSize
   LOCAL nRead
   LOCAL nLen
   LOCAL dDate
   LOCAL cTime
   LOCAL cBuffer := Space( t_nReadBuffer )

   IF hb_defaultValue( lWithPath, .F. ) .AND. ! hb_DirExists( cPath ) .AND. hb_DirCreate( cPath ) != 0
      lRetVal := .F.
   ENDIF

   IF Empty( cPassword )
      cPassword := NIL
   ENDIF

   IF Set( _SET_DEFEXTENSIONS )
      cFileName := hb_FNameExtSetDef( cFileName, ".zip" )
   ENDIF

   IF Empty( hUnzip := hb_unzipOpen( cFileName ) )
      lRetVal := .F.
   ELSE
      IF HB_ISNUMERIC( acFiles ) .OR. ;
         HB_ISSTRING( acFiles )
         acFiles := { acFiles }
      ENDIF

      IF Empty( cPath )
         cPath := hb_FNameDir( cFileName )
      ENDIF

      cPath := hb_DirSepAdd( cPath )

      nPos := 0
      nErr := hb_unzipFileFirst( hUnzip )
      DO WHILE nErr == 0

         nPos++

         IF hb_unzipFileInfo( hUnzip, @cZipName, @dDate, @cTime,,,, @nSize ) == 0

            /* NOTE: As opposed to original hbziparch we don't do a second match without path. */
            lExtract := Empty( acFiles ) .OR. ;
               AScan( acFiles, nPos ) > 0 .OR. ;
               AScan( acFiles, {| cMask | hb_FileMatch( cZipName, cMask ) } ) > 0

            IF lExtract .AND. ( hHandle := FCreate( cPath + cZipName ) ) != F_ERROR

               IF hb_unzipFileOpen( hUnzip, cPassword ) != UNZ_OK
                  lRetVal := .F.
                  EXIT
               ENDIF

               nRead := 0
               DO WHILE ( nLen := hb_unzipFileRead( hUnzip, @cBuffer, hb_BLen( cBuffer ) ) ) > 0
                  IF HB_ISEVALITEM( bProgress )
                     nRead += nLen
                     Eval( bProgress, nRead, nSize )
                  ENDIF
                  FWrite( hHandle, cBuffer, nLen )
               ENDDO

               hb_unzipFileClose( hUnzip )
               FClose( hHandle )

               hb_FSetDateTime( cPath + cZipName, dDate, cTime )

               IF HB_ISEVALITEM( bUpdate )
                  Eval( bUpdate, cZipName, nPos )
               ENDIF
            ENDIF
         ENDIF

         nErr := hb_unzipFileNext( hUnzip )
      ENDDO

      hb_unzipClose( hUnzip )
   ENDIF

   RETURN lRetVal
]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=35&t=7777&p=72458#p72458 Thu, 10 Sep 2026 21:14:02 +0000 http://mail.hmgforum.com/viewtopic.php?f=35&t=7777&p=72458#p72458
<![CDATA[Issues and Discussions related to Harbour :: How to create VFP databases outside of VFP :: Author HGAutomator]]> http://mail.hmgforum.com/viewtopic.php?f=35&t=7775&p=72441#p72441
Did anyone develop an RDD or a procedure that can create VFP databases and take advantage of long field names? And then open the VFP database in order to query the tables?

I really hate using VFPs debugger, and prefer to work in Harbour, except for VFP's dot prompt.]]>
no_email@example.com (HGAutomator) http://mail.hmgforum.com/viewtopic.php?f=35&t=7775&p=72441#p72441 Tue, 08 Sep 2026 14:51:27 +0000 http://mail.hmgforum.com/viewtopic.php?f=35&t=7775&p=72441#p72441
<![CDATA[Issues and Discussions related to Harbour :: Re: How to create VFP databases outside of VFP :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=35&t=7775&p=72442#p72442
Para trabajar con nombres de campo largos y contenedores de base de datos (.dbc) de Visual FoxPro, existen dos formas de encararlo: usando el RDD DBFCDX con emulación de tablas VFP o creando un RDD/Wrapper personalizado.


Opción 1: La solución nativa existente (RDD DBFCDX de Harbour)

Harbour permite trabajar con tablas de VFP usando el RDD DBFCDX indicando que use el formato de tipo VFP (HB_SET_CHARSET / SET (_SET_DBFLOCKSCHEME)). Sin embargo, las tablas .dbf sueltas de VFP con campos largos dependen de un diccionario contenedor .dbc (el encabezado de la tabla apuntará al archivo .dbc).

Para manejar nombres largos directamente en Harbour sin lidiar con el .dbc en bajo nivel, el RDD nativo permite mapear campos largos mediante alias o tablas asociadas.
Opción 2: Cómo diseñar un RDD para VFP con Campos Largos (VFP.DBC)

Si quieres entender cómo se implementa un RDD nativo en Harbour para soportar la lectura de un .dbc (que en el fondo no es más que otra tabla .dbf que actúa como diccionario de datos) y permitir sintaxis estilo VFP, la estructura conceptual es la siguiente:

Lectura del .dbc (Diccionario de Datos): El .dbc almacena la relación entre el nombre largo del campo y el nombre corto (10 caracteres) guardado en la cabecera real del .dbf.

Capa RDD / Mapeador: Al ejecutar un SELECT o USE, el RDD personalizado intercepta los nombres de campo largos, consulta la estructura del .dbc y los traduce al nombre físico real en el .dbf.

Ejemplo conceptual de cómo definir el RDD en Harbour (en C y Harbour):]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=35&t=7775&p=72442#p72442 Tue, 08 Sep 2026 16:12:10 +0000 http://mail.hmgforum.com/viewtopic.php?f=35&t=7775&p=72442#p72442
<![CDATA[Issues and Discussions related to Harbour :: Re: How to create VFP databases outside of VFP :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=35&t=7775&p=72443#p72443

Code: Select all

// Ejemplo de inicialización y uso del driver personalizado en Harbour

REQUEST DBFCDX

PROCEDURE Main()
   LOCAL aStruct
   
   // Registrar el driver si estás extendiendo DBFCDX
   // Set ( _SET_DEFAULT_RDD, "VFPLET" )

   // 1. Crear una tabla estilo VFP con campos largos usando la API de Harbour
   aStruct := { ;
      { "CODIGO_CLIENTE_PRINCIPAL", "C", 10, 0 }, ;
      { "NOMBRE_COMPLETO_DEL_USUARIO", "C", 50, 0 }, ;
      { "FECHA_ULTIMA_TRANSACCION", "D",  8, 0 }  ;
   }

   // Creación usando la función extendida de Harbour que soporta diccionarios
   hb_dbCreate( "clientes_vfp.dbf", aStruct, "DBFCDX" )

   ? "Tabla creada con éxito con nombres de campo de más de 10 caracteres."
RETURN
]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=35&t=7775&p=72443#p72443 Tue, 08 Sep 2026 16:12:38 +0000 http://mail.hmgforum.com/viewtopic.php?f=35&t=7775&p=72443#p72443
<![CDATA[Issues and Discussions related to Harbour :: Re: How to create VFP databases outside of VFP :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=35&t=7775&p=72444#p72444
Si deseas evitar compilar C para un RDD complejo, puedes crear un "Virtual RDD" mediante la clase TDatabase o la directiva #command para simular la sintaxis de puntos de VFP y la traducción de nombres:

Code: Select all

#include "hbclass.ch"

// Simulación de lectura de tabla VFP con mapeo de campos largos
CLASS VfpTable
   DATA cDbcPath
   DATA cTable
   DATA aFieldMap INIT {=>}  // Hash: NombreLargo -> NombreCorto

   METHOD New( cDbc, cTable )
   METHOD Open()
   METHOD FieldGet( cLongName )
   METHOD FieldPut( cLongName, xVal )
ENDCLASS

METHOD New( cDbc, cTable ) CLASS VfpTable
   ::cDbcPath := cDbc
   ::cTable   := cTable
   
   // Ejemplo: Mapeo manual o extraído dinámicamente del archivo .dbc
   ::aFieldMap["NOMBRE_COMPLETO_CLIENTE"] := "NOMB_CLI"
   ::aFieldMap["CODIGO_IDENTIFICACION"]   := "COD_ID"
RETURN Self

METHOD Open() CLASS VfpTable
   USE ( ::cTable ) VIA "DBFCDX" SHARED
RETURN NIL

METHOD FieldGet( cLongName ) CLASS VfpTable
   LOCAL cShortName := ::aFieldMap[ Upper( cLongName ) ]
   RETURN FieldGet( FieldPos( cShortName ) )

METHOD FieldPut( cLongName, xVal ) CLASS VfpTable
   LOCAL cShortName := ::aFieldMap[ Upper( cLongName ) ]
   RETURN FieldPut( FieldPos( cShortName ), xVal )
]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=35&t=7775&p=72444#p72444 Tue, 08 Sep 2026 16:13:10 +0000 http://mail.hmgforum.com/viewtopic.php?f=35&t=7775&p=72444#p72444
<![CDATA[Issues and Discussions related to Harbour :: Re: How to create VFP databases outside of VFP :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=35&t=7775&p=72445#p72445
ayuda.png
Resumen de Recomendaciones

Si quieres trabajar con .dbf / .cdx directamente: Utiliza el RDD nativo DBFCDX de Harbour. Soporta bloqueos de VFP, tipos de datos como Currency, DateTime, Double y campos Integer auto-incrementables.

Si necesitas soporte de .dbc nativo de VFP: Te conviene compilar o usar wrappers como hbvfp o la librería sdbu, los cuales parsean las tablas contenedoras de FoxPro directamente desde C y traducen la estructura al RDD en tiempo de ejecución.

Attachments


ayuda.png (37.69 KiB)

]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=35&t=7775&p=72445#p72445 Tue, 08 Sep 2026 16:14:00 +0000 http://mail.hmgforum.com/viewtopic.php?f=35&t=7775&p=72445#p72445
<![CDATA[Issues and Discussions related to Harbour :: Re: How to create VFP databases outside of VFP :: Reply by HGAutomator]]> http://mail.hmgforum.com/viewtopic.php?f=35&t=7775&p=72447#p72447
Thanks for trying, Dan.]]>
no_email@example.com (HGAutomator) http://mail.hmgforum.com/viewtopic.php?f=35&t=7775&p=72447#p72447 Tue, 08 Sep 2026 22:26:12 +0000 http://mail.hmgforum.com/viewtopic.php?f=35&t=7775&p=72447#p72447
<![CDATA[Issues and Discussions related to Harbour :: Re: How to create VFP databases outside of VFP :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=35&t=7775&p=72448#p72448
HGAutomator wrote: Tue Sep 08, 2026 10:26 pm Thanks anyway, but this doesn't allow us to create vfp .dbc containers and connect them to tables. This is just a custom data dictionary, which I already have.

Thanks for trying, Dan.
Harbour no soporta DBC.

se podría implementar un pequeño RDD/capa Harbour para el DBC.
El .DBC de VFP no es magia. Es un formato estructurado que contiene metadatos que describen las tablas y sus propiedades.

trabaje muy poco con forxpro hasta VFP9]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=35&t=7775&p=72448#p72448 Wed, 09 Sep 2026 00:19:26 +0000 http://mail.hmgforum.com/viewtopic.php?f=35&t=7775&p=72448#p72448
<![CDATA[Issues and Discussions related to Harbour :: Re: How to create VFP databases outside of VFP :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=35&t=7775&p=72463#p72463 con mi amigo fallecido hace mucho habiamos hecho una app en VFP9 para una empresa de zapatos la cual funciono mucho tiempo, la app
original quedo en una computadora que no tuve mas accesso asi que busque ejemplos en la web hasta que encontre una muy interesante.
esta en el .rar que comparto.

estan los fuentes + los ejecutable , como la mayoria no tiene instalado VFP9 adjunto el rutime que hay que instalar para ejecutar la app ya compiladas de VFP9 ( VFP9SP0RT.exe )
ejecutar despues :

Code: Select all

C:\Proyectos\Sample\ClientServerVFP\ThreeTierSPT\threetier.exe
Menu : Tables Customers o Employes

como ver los datos de DBC desde CMD

Code: Select all

cd C:\Proyectos\Sample
read C:\Proyectos\Sample\ClientServerVFP\ThreeTierSPT
pronto adjuntare la ampliacion para el RDD de Harbour :)

Sample :
Sample.rar
Informacion tecnica VFP9 : https://www.yaldex.com/fox_pro_tutorial ... ef2926.htm

Otro sitio interesante para comprender mas sobre VFP8 : https://www.vfphelp.com/help/html/ea7bf ... 09398f.htm

Attachments

Sample.rar (14402.71 KiB)
]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=35&t=7775&p=72463#p72463 Mon, 14 Sep 2026 00:47:20 +0000 http://mail.hmgforum.com/viewtopic.php?f=35&t=7775&p=72463#p72463
<![CDATA[General :: Demo Agenda + JSON + DOM :: Author danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7768&p=72392#p72392
El Hash hDOM (que representa un Document Object Model en formato Hash) en nuestro código Harbour se puede describir como un árbol de datos dinámico, estructurado y centralizado en memoria. A diferencia de una tabla tradicional DBF o SQL, no tiene un esquema rígido; es un contenedor jerárquico tipo Map/Dictionary (clave-valor) que imita la estructura de un documento JSON o DOM web.

The hDOM Hash (representing a Document Object Model in Hash format) in our Harbour code can be described as a dynamic, structured, and centralized in-memory data tree.

Unlike a traditional DBF table or SQL database, it does not have a rigid schema; it is a hierarchical Key-Value Map/Dictionary that mirrors the structure of a JSON document or a web DOM.

Key Characteristics / Características Principales
1. Hierarchical & Nested / Jerárquico y Anidado

It is a Hash of Hashes. The root (hDOM) contains primary nodes such as "agenda", which in turn contains sub-nodes like "contactos" or individual properties like "ultimo_id".

Code: Select all

// Level 1: Root -> Level 2: Module -> Level 3: Collection or Attribute
hDOM["agenda"]["ultimo_id"] := 3
2. Direct Indexed Access (O(1)) / Acceso Directo e Indexado

Espero les guste esta forma de trabajar como a mi

Unlike traditional Arrays that are traversed using numeric indexes (1, 2, 3), elements in the hDOM Hash are accessed via a unique string key (e.g., "1", "2", "3"). This enables instant contact lookups using hb_HHasKey() without looping through the entire dataset.
3. In-Memory Representation of JSON / Representación Viva de JSON

The hDOM object is the in-memory "digital twin" of the agenda.json file:

Serialization (Memory ➔ Disk): HB_ToJSON(hDOM) converts the hDOM tree into a clean, formatted JSON string.

Deserialization (Disk ➔ Memory): hb_jsonDecode(cText, @hResult) reads the raw file and reconstructs the exact Hash object structure in memory.]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7768&p=72392#p72392 Tue, 18 Aug 2026 04:33:03 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7768&p=72392#p72392
<![CDATA[General :: Re: Demo Agenda + JSON + DOM :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7768&p=72393#p72393 Captura de pantalla 2026-08-18 014528.pngImage

Why is this a great architecture for Harbour?

Highly Scalable: If you want to store "configuration", "users", or "logs" in the same JSON file tomorrow, you simply attach new branches to hDOM:

Code: Select all

hDOM["configuration"] := { "theme" => "dark", "language" => "EN" }
Storage Independent: It does not rely on local database engines (DBF/NTX/CDX); it is 100% portable and ready to interact natively with REST APIs or Web/Mobile applications using JSON.

Attachments


Captura de pantalla 2026-08-18 014528.png (14.26 KiB)

]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7768&p=72393#p72393 Tue, 18 Aug 2026 04:46:16 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7768&p=72393#p72393
<![CDATA[General :: Re: Demo Agenda + JSON + DOM :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7768&p=72394#p72394

Code: Select all

#include "fileio.ch"

PROCEDURE Main()

   // Configuración de codepage para acentos en consola
   // Codepage setting for accented characters in console
   hb_cdpSelect( "UTF8" )

   // Declaramos la variable global/pública
   // Declare global/public variable
   PUBLIC hDOM
   hDOM := {=>}

   // Inicializamos el contenedor principal de la agenda
   // Initialize main agenda container
   hDOM["agenda"] := {=>}
   hDOM["agenda"]["contactos"] := {=>}
   hDOM["agenda"]["ultimo_id"] := 0

   ? "=== AGENDA EN HARBOUR / HARBOUR AGENDA ===" [cite: 2]
   ?

   // 1. Cargar contactos de ejemplo / Load sample contacts [cite: 3]
   AgregarContacto("Juan Pérez",   "11-4444-5555", "juan@email.com")
   AgregarContacto("María Gómez",  "11-6666-7777", "maria@email.com")
   AgregarContacto("Carlos López", "11-8888-9999", "carlos@email.com")

   // 2. Listar contactos / List contacts
   ListarContactos()

   // 3. Buscar contacto por ID / Search contact by ID
   BuscarContacto(2)

   // 4. Exportar la estructura completa a un archivo JSON
   // Export the full structure to a JSON file
   ?
   ? "========================================" [cite: 4]
   ? "   Export the full structure to a JSON file / Exportar la estructura completa a un archivo JSON"
   ? "========================================" [cite: 5]
   GuardarAgendaJSON("agenda.json")

   // 5. Cargar y deserializar desde el archivo JSON
   // Load and deserialize from the JSON file
   ?
   ? "========================================" [cite: 6]
   ? "  Load and deserialize from the JSON file / Cargar y deserializar desde el archivo JSON"
   ? "========================================" [cite: 7]
   CargarAgendaJSON("agenda.json")

RETURN

// ----------------------------------------------------------------------
// Función para agregar un nuevo contacto al Hash Map
// Function to add a new contact to the Hash Map
// ----------------------------------------------------------------------
FUNCTION AgregarContacto( cNombre, cTelefono, cEmail )
   LOCAL nNuevoId
   LOCAL cIdKey
   LOCAL hNuevoContacto

   hDOM["agenda"]["ultimo_id"]++
   nNuevoId := hDOM["agenda"]["ultimo_id"]
   cIdKey   := LTrim(Str(nNuevoId))

   hNuevoContacto := {=>}
   hNuevoContacto["id"]    := nNuevoId
   hNuevoContacto["name"]  := cNombre
   hNuevoContacto["phone"] := cTelefono
   hNuevoContacto["email"] := cEmail

   hDOM["agenda"]["contactos"][ cIdKey ] := hNuevoContacto

   ? "--> Contacto agregado con éxito! / Contact added successfully! ID: " + cIdKey [cite: 8]
RETURN Nil

// ----------------------------------------------------------------------
// Función para recorrer y listar los contactos
// Function to iterate through and list contacts
// ----------------------------------------------------------------------
FUNCTION ListarContactos()
   LOCAL cIdKey
   LOCAL hContacto

   ?
   ? "========================================" [cite: 9]
   ? "   LISTA DE CONTACTOS / CONTACT LIST" [cite: 9]
   ? "========================================" [cite: 10]

   FOR EACH cIdKey IN hDOM["agenda"]["contactos"]:Keys
      hContacto := hDOM["agenda"]["contactos"][ cIdKey ]

      ? "ID       : " + LTrim(Str(hContacto["id"])) [cite: 11]
      ? "Name     : " + hContacto["name"] [cite: 12]
      ? "Tel      : " + hContacto["phone"] [cite: 13]
      ? "Email    : " + hContacto["email"] [cite: 14]
      ? "----------------------------------------" [cite: 15]
   NEXT
RETURN Nil

// ----------------------------------------------------------------------
// Función para consultar un contacto por su ID
// Function to query a contact by ID
// ----------------------------------------------------------------------
FUNCTION BuscarContacto( nId )
   LOCAL cIdKey := LTrim(Str(nId))
   LOCAL hContacto

   ?
   IF hb_HHasKey( hDOM["agenda"]["contactos"], cIdKey ) [cite: 16]
      hContacto := hDOM["agenda"]["contactos"][ cIdKey ]
      ? ">>> BÚSQUEDA DEL CONTACTO / CONTACT SEARCH ID " + cIdKey + ":" [cite: 17]
      ? "Encontrado / Found: " + hContacto["name"] + " | Tel: " + hContacto["phone"] [cite: 18]
   ELSE
      ? "El contacto con ID " + cIdKey + " no existe. / Contact ID does not exist." [cite: 19]
   ENDIF [cite: 20]
RETURN Nil

// ----------------------------------------------------------------------
// Función para serializar hDOM y guardarlo en archivo .json
// Function to serialize hDOM and save it into a .json file
// ----------------------------------------------------------------------
FUNCTION GuardarAgendaJSON( cNombreArchivo )
   LOCAL cJsonTexto := ""

   cJsonTexto := HB_ToJSON( hDOM )

   IF Empty( cJsonTexto )
      ? "--> Error: La cadena JSON está vacía. / Error: JSON string is empty." [cite: 21]
      RETURN .F.
   ENDIF

   // hb_MemoWrit escribe el buffer directamente a disco sin lidiar con pointers de C
   // hb_MemoWrit writes the buffer directly to disk without dealing with C pointers
   IF hb_MemoWrit( cNombreArchivo, cJsonTexto )
      ? "--> Agenda guardada en JSON con éxito / Agenda successfully saved to JSON: " + cNombreArchivo [cite: 22]
      RETURN .T.
   ELSE
      ? "--> Error al escribir el archivo en disco. / Error writing file to disk." [cite: 23]
   ENDIF
RETURN .F.

// ----------------------------------------------------------------------
// Función para leer el archivo .json y reconstruir hDOM
// Function to read the .json file and rebuild hDOM
// ----------------------------------------------------------------------
FUNCTION CargarAgendaJSON( cNombreArchivo )
   LOCAL cContenido := ""
   LOCAL hResultado := {=>}

   IF !hb_FileExists( cNombreArchivo )
      ? "--> No se encontró el archivo JSON / JSON file not found: " + cNombreArchivo [cite: 25]
      RETURN hResultado
   ENDIF

   cContenido := hb_MemoRead( cNombreArchivo )

   IF !Empty( cContenido )
      hb_jsonDecode( cContenido, @hResultado )

      IF !Empty( hResultado )
         ? "--> Archivo JSON leído y reconstruido correctamente. / JSON file read and rebuilt successfully." [cite: 26]
         ? "--> Total contactos en JSON / Total contacts in JSON: " + LTrim(Str(Len(hResultado["agenda"]["contactos"])))
      ELSE
         ? "--> El contenido del archivo JSON no pudo procesarse. / JSON file content could not be processed." [cite: 27]
      ENDIF
   ELSE
      ? "--> El archivo JSON está vacío. / JSON file is empty." [cite: 28]
   ENDIF

RETURN hResultado

// ----------------------------------------------------------------------
// Serializador JSON en Harbour Puro
// Pure Harbour JSON Serializer
// ----------------------------------------------------------------------
FUNCTION HB_ToJSON( xVal, nIndent )
   LOCAL cType := ValType( xVal )
   LOCAL cJson := ""
   LOCAL cKey, i, nLen
   LOCAL cPad := ""

   IF nIndent == Nil
      nIndent := 0
   ENDIF
   cPad := Space( nIndent * 2 )

   DO CASE
   CASE cType == "H" // Hash Map / Diccionario (Dictionary)
      cJson := "{" + hb_eol()
      nLen := Len( xVal )
      i := 0
      FOR EACH cKey IN xVal:Keys
         i++
         cJson += cPad + "  " + '"' + hb_ValToStr( cKey ) + '": ' + HB_ToJSON( xVal[ cKey ], nIndent + 1 )
         IF i < nLen
            cJson += ","
         ENDIF
         cJson += hb_eol() [cite: 30]
      NEXT
      cJson += cPad + "}"

   CASE cType == "A" // Array / Lista (List)
      cJson := "[" + hb_eol()
      nLen := Len( xVal )
      FOR i := 1 TO nLen
         cJson += cPad + "  " + HB_ToJSON( xVal[ i ], nIndent + 1 )
         IF i < nLen
            cJson += "," [cite: 31]
         ENDIF
         cJson += hb_eol()
      NEXT
      cJson += cPad + "]"

   CASE cType == "C" // Cadena de texto / String
      cJson := '"' + StrTran( StrTran( xVal, "\", "\\" ), '"', '\"' ) + '"'

   CASE cType == "N" // Número / Number
      cJson := LTrim( Str( xVal ) )

   CASE cType == "L" // Booleano / Boolean
      cJson := IIF( xVal, "true", "false" ) [cite: 32]

   OTHERWISE
      cJson := "null"
   ENDCASE

RETURN cJson
]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7768&p=72394#p72394 Tue, 18 Aug 2026 04:39:57 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7768&p=72394#p72394
<![CDATA[General :: Re: Demo Agenda + JSON + DOM :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7768&p=72395#p72395 CMD.png
Workspace.png

Attachments


Workspace.png (84.96 KiB)


CMD.png (32.12 KiB)

Agenda.rar (10.53 KiB)
]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7768&p=72395#p72395 Tue, 18 Aug 2026 04:40:28 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7768&p=72395#p72395
<![CDATA[General :: Re: Demo Agenda + JSON + DOM :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7768&p=72396#p72396

Code: Select all

/*
 * Agenda de Contatos (2)
 * Humberto Fornazier - Março/2003
 * hfornazier@brfree.com.br
 *
 * HMG - Harbour Win32 GUI library - Release 60
 * Copyright 2002 Roberto Lopez <mail.box.hmg@gmail.com>
 * http://www.hmgforum.com//
 *
 * Refactored to work with JSON instead of DBF files
 * Refactorizado para trabajar con JSON en lugar de archivos DBF
*/

#include "hmg.ch"

#define BLUE { 0, 0, 128 }

PROCEDURE Main()
   LOCAL i
   // Codepage setting for console and GUI / Configuración de codepage
   hb_cdpSelect( "UTF8" )

   // Public global variable for memory DOM / Variable global pública para hDOM
   PUBLIC hDOM
   hDOM := {=>}

   // Initialize or load JSON agenda / Inicializar o cargar la agenda JSON
   CargarAgendaJSON( "agenda.json" )

   PRIVATE lNovo := .F.

   DEFINE WINDOW Form_1 ;
      AT 0,0 ;
      WIDTH 480 ; 
      HEIGHT 470 ;
      TITLE "Agenda de Contactos / Contacts Agenda" ;
      MAIN ;
      NOMAXIMIZE ;
      NOSIZE ;
      ON RELEASE GuardarAgendaJSON( "agenda.json" ) ;
      BACKCOLOR BLUE

      // Index column (A-Z search) / Columna de índice (Búsqueda A-Z)
      @ 010,415 GRID GIndice OF Form_1 ;
         WIDTH 48 HEIGHT 360 ;
         HEADERS {""} WIDTHS { 28 } ;
         FONT "Arial" SIZE 09 BOLD ;
         TOOLTIP "Click on desired letter / Click en la letra deseada" ;
         ON CLICK Pesquisa_Agenda()

      // Main contacts Grid / Grilla principal de contactos
      @ 010,010 GRID Grid_Agenda ;
         WIDTH 398 ;
         HEIGHT 360 ;
         HEADERS {"Código / Code", "Nome / Name"} ;
         WIDTHS { 80, 290 } ;
         FONT "Arial" SIZE 09 ;
         ON DBLCLICK Novo_Registro( .F. )

      // Action Buttons / Botones de acción
      @ 385,010 BUTTON Btn_Novo OF Form_1 ;
         CAPTION '&Novo / New' ;
         ACTION Novo_Registro( .T. ) ;
         WIDTH 120 HEIGHT 27 ;
         FONT "Arial" SIZE 09 ;
         TOOLTIP "New Record / Novo Registro" ;
         FLAT

      @ 385,165 BUTTON Btn_Imprimir OF Form_1 ;
         CAPTION '&Imprimir / Print' ;
         ACTION Imprimir() ;
         WIDTH 120 HEIGHT 27 ;
         FONT "Arial" SIZE 09 ;
         TOOLTIP "Print Contacts / Imprimir Contatos" ;
         FLAT
              
      @ 385,318 BUTTON Btn_Sair OF Form_1 ;
         CAPTION '&Sair / Exit' ;
         ACTION Form_1.Release ;
         WIDTH 120 HEIGHT 27 ;
         FONT "Arial" SIZE 09 ;
         TOOLTIP "Exit System / Finalizar Sistema" ;
         FLAT

   END WINDOW

   // Populate A-Z index grid / Poblar el índice A-Z

   FOR i := 1 TO 26
      ADD ITEM { CHR( i + 64 ) } TO GIndice OF Form_1   
   NEXT
   MODIFY CONTROL GIndice OF Form_1 VALUE 1

   Pesquisa_Agenda()

   CENTER WINDOW Form_1
   ACTIVATE WINDOW Form_1
RETURN

// ----------------------------------------------------------------------
// Filter contacts by selected letter in hDOM
// Filtrar contactos en hDOM según la letra seleccionada
// ----------------------------------------------------------------------
FUNCTION Pesquisa_Agenda() 
   LOCAL cPesq := ValorDaColuna( "GIndice", "Form_1", 1 )
   LOCAL cIdKey, hContacto, cNome

   cPesq := IIf( Empty( cPesq ), "A", Upper( cPesq ) )   

   DELETE ITEM ALL FROM Grid_Agenda OF Form_1

   IF hb_HHasKey( hDOM, "agenda" ) .AND. hb_HHasKey( hDOM["agenda"], "contactos" )
      FOR EACH cIdKey IN hDOM["agenda"]["contactos"]:Keys
         hContacto := hDOM["agenda"]["contactos"][ cIdKey ]
         cNome     := Upper( hb_HGetDef( hContacto, "name", "" ) )

         IF Left( cNome, 1 ) == cPesq
            ADD ITEM { cIdKey, hContacto["name"] } TO Grid_Agenda OF Form_1
         ENDIF
      NEXT
   ENDIF
RETURN Nil

// ----------------------------------------------------------------------
// Open New / Edit Contact Form
// Abrir Formulario de Nuevo / Editar Contacto
// ----------------------------------------------------------------------
FUNCTION Novo_Registro( lNovo_Registro )
   LOCAL cCodigo   := ""
   LOCAL cNome     := ""
   LOCAL cFone1    := ""
   LOCAL cEmail    := ""
   LOCAL hContacto

   Form_1.Btn_Novo.Enabled := .F.
   Form_1.Btn_Sair.Enabled := .F.     

   lNovo := lNovo_Registro

   IF !lNovo     
      cCodigo := ValorDaColuna( "Grid_Agenda", "Form_1", 1 )
      
      IF Empty( cCodigo ) .OR. !hb_HHasKey( hDOM["agenda"]["contactos"], cCodigo )
         MsgSTOP( "Record " + cCodigo + " not found! / Registro " + cCodigo + " no localizado!", "Agenda" )
         Form_1.Btn_Novo.Enabled := .T.
         Form_1.Btn_Sair.Enabled := .T.
         RETURN Nil
      ENDIF

      hContacto := hDOM["agenda"]["contactos"][ cCodigo ]
      cNome  := AllTrim( hb_HGetDef( hContacto, "name", "" ) )
      cFone1 := AllTrim( hb_HGetDef( hContacto, "phone", "" ) )
      cEmail := AllTrim( hb_HGetDef( hContacto, "email", "" ) )
   ENDIF   

   DEFINE WINDOW Form_2 ;
      AT 0,0 ;
      WIDTH 490 HEIGHT 230 ;
      TITLE "Agenda - " + IIf( lNovo, "New Record / Nuevo Registro", "Editing / Editando " + cCodigo ) ;
      MODAL NOSIZE ;
      ON RELEASE {|| Form_1.Btn_Novo.Enabled := .T., Form_1.Btn_Sair.Enabled := .T., Pesquisa_Agenda(), Form_1.Grid_Agenda.SetFocus() } ;
      BACKCOLOR WHITE

      @ 10,10 LABEL Label_Codigo VALUE 'Código / Code' WIDTH 140 HEIGHT 25 FONT 'Arial' SIZE 09 BACKCOLOR WHITE FONTCOLOR BLUE BOLD
      @ 40,10 LABEL Label_Nome   VALUE 'Nome / Name'     WIDTH 140 HEIGHT 25 FONT 'Arial' SIZE 09 BACKCOLOR WHITE FONTCOLOR BLUE BOLD
      @ 70,10 LABEL Label_Fone1  VALUE 'Fone / Phone'     WIDTH 140 HEIGHT 25 FONT 'Arial' SIZE 09 BACKCOLOR WHITE FONTCOLOR BLUE BOLD
      @ 100,10 LABEL Label_Email VALUE 'e-mail'           WIDTH 140 HEIGHT 25 FONT 'Arial' SIZE 09 BACKCOLOR WHITE FONTCOLOR BLUE BOLD

      @ 10,120 TEXTBOX T_Codigo VALUE cCodigo WIDTH 60 TOOLTIP 'Code / Código'
      @ 40,120 TEXTBOX T_Nome OF Form_2 WIDTH 330 VALUE cNome TOOLTIP 'Name / Nombre' MAXLENGTH 40 ON ENTER Form_2.T_Fone1.SetFocus
      @ 70,120 TEXTBOX T_Fone1 OF Form_2 WIDTH 180 VALUE cFone1 TOOLTIP 'Phone / Teléfono' MAXLENGTH 20 ON ENTER Form_2.T_Email.SetFocus
      @ 100,120 TEXTBOX T_Email OF Form_2 WIDTH 330 VALUE cEmail TOOLTIP 'E-mail' MAXLENGTH 40 LOWERCASE ON ENTER Form_2.Btn_Salvar.SetFocus

      @ 150,40 BUTTON Btn_Salvar OF Form_2 CAPTION '&Salvar / Save' ACTION Salvar_Registro() WIDTH 120 HEIGHT 27 FONT "Arial" SIZE 09 FLAT
      @ 150,180 BUTTON Btn_Excluir OF Form_2 CAPTION '&Deletar / Delete' ACTION Excluir_Registro() WIDTH 120 HEIGHT 27 FONT "Arial" SIZE 09 FLAT
      @ 150,320 BUTTON Btn_Cancelar OF Form_2 CAPTION '&Cancelar / Cancel' ACTION Form_2.Release WIDTH 120 HEIGHT 27 FONT "Arial" SIZE 09 FLAT

   END WINDOW

   Form_2.T_Codigo.Enabled := .F.

   IF lNovo
      Form_2.Btn_Excluir.Enabled := .F.
   ENDIF

   CENTER WINDOW Form_2
   ACTIVATE WINDOW Form_2
RETURN Nil

// ----------------------------------------------------------------------
// Save contact to hDOM memory structure
// Guardar contacto en la estructura hDOM en memoria
// ----------------------------------------------------------------------
FUNCTION Salvar_Registro()
   LOCAL cCodigo := ""
   LOCAL hNovoContacto

   IF Empty( Form_2.T_Nome.Value )
      MsgINFO( "Name not specified! / Nome não foi Informado!!", "Agenda" )
      Form_2.T_Nome.SetFocus
      RETURN Nil
   ENDIF       

   IF lNovo     
      hDOM["agenda"]["ultimo_id"]++
      cCodigo := LTrim( Str( hDOM["agenda"]["ultimo_id"] ) )
   ELSE
      cCodigo := Form_2.T_Codigo.Value
   ENDIF

   hNovoContacto := {=>}
   hNovoContacto["id"]    := Val( cCodigo )
   hNovoContacto["name"]  := Form_2.T_Nome.Value
   hNovoContacto["phone"] := Form_2.T_Fone1.Value
   hNovoContacto["email"] := Form_2.T_Email.Value

   // Save/Update in hDOM Hash Map
   hDOM["agenda"]["contactos"][ cCodigo ] := hNovoContacto

   // Save directly to JSON disk file
   GuardarAgendaJSON( "agenda.json" )

   MsgINFO( "Record " + IIf( lNovo, "Saved / Incluído", "Updated / Alterado!" ), "Agenda" )
   
   PosicionaIndice( Upper( Left( Form_2.T_Nome.Value, 1 ) ) )
   Form_2.Release
RETURN Nil

// ----------------------------------------------------------------------
// Delete contact from hDOM and update JSON
// Eliminar contacto de hDOM y actualizar JSON
// ----------------------------------------------------------------------
FUNCTION Excluir_Registro()                     
   LOCAL cCodigo := Form_2.T_Codigo.Value

   IF MsgOkCancel( "Confirm record deletion? / Confirma Exclusão do Registro??", "Delete / Excluir" )
      IF hb_HHasKey( hDOM["agenda"]["contactos"], cCodigo )
         // Delete key from Hash Map
         hb_HDel( hDOM["agenda"]["contactos"], cCodigo )
         
         // Update JSON file
         GuardarAgendaJSON( "agenda.json" )
         
         MsgINFO( "Record deleted! / Registro Excluído!!", "Agenda" )   
         Form_2.Release
      ENDIF
   ENDIF
RETURN Nil

// ----------------------------------------------------------------------
// Load JSON or initialize default hDOM structure
// Cargar JSON o inicializar estructura hDOM por defecto
// ----------------------------------------------------------------------
FUNCTION CargarAgendaJSON( cNombreArchivo )
   LOCAL cContenido := ""
   LOCAL hResultado := {=>}

   IF hb_FileExists( cNombreArchivo )
      cContenido := hb_MemoRead( cNombreArchivo )
      IF !Empty( cContenido )
         hb_jsonDecode( cContenido, @hResultado )
         IF !Empty( hResultado )
            hDOM := hResultado
            RETURN hDOM
         ENDIF
      ENDIF
   ENDIF

   // Default structure if file does not exist / Estructura por defecto si no existe
   hDOM := {=>}
   hDOM["agenda"] := {=>}
   hDOM["agenda"]["contactos"] := {=>}
   hDOM["agenda"]["ultimo_id"] := 0
RETURN hDOM

// ----------------------------------------------------------------------
// Save hDOM structure to JSON file
// Guardar estructura hDOM a archivo JSON
// ----------------------------------------------------------------------
FUNCTION GuardarAgendaJSON( cNombreArchivo )
   LOCAL cJsonTexto := HB_ToJSON( hDOM )

   IF !Empty( cJsonTexto )
      RETURN hb_MemoWrit( cNombreArchivo, cJsonTexto )
   ENDIF
RETURN .F.

// ----------------------------------------------------------------------
// JSON Pure Harbour Serializer / Serializador JSON en Harbour Puro
// ----------------------------------------------------------------------
FUNCTION HB_ToJSON( xVal, nIndent )
   LOCAL cType := ValType( xVal )
   LOCAL cJson := ""
   LOCAL cKey, i, nLen
   LOCAL cPad := ""

   IF nIndent == Nil
      nIndent := 0
   ENDIF
   cPad := Space( nIndent * 2 )

   DO CASE
   CASE cType == "H"
      cJson := "{" + hb_eol()
      nLen := Len( xVal )
      i := 0
      FOR EACH cKey IN xVal:Keys
         i++
         cJson += cPad + "  " + '"' + hb_ValToStr( cKey ) + '": ' + HB_ToJSON( xVal[ cKey ], nIndent + 1 )
         IF i < nLen
            cJson += ","
         ENDIF
         cJson += hb_eol()
      NEXT
      cJson += cPad + "}"

   CASE cType == "A"
      cJson := "[" + hb_eol()
      nLen := Len( xVal )
      FOR i := 1 TO nLen
         cJson += cPad + "  " + HB_ToJSON( xVal[ i ], nIndent + 1 )
         IF i < nLen
            cJson += ","
         ENDIF
         cJson += hb_eol()
      NEXT
      cJson += cPad + "]"

   CASE cType == "C"
      cJson := '"' + StrTran( StrTran( xVal, "\", "\\" ), '"', '\"' ) + '"'

   CASE cType == "N"
      cJson := LTrim( Str( xVal ) )

   CASE cType == "L"
      cJson := IIF( xVal, "true", "false" )

   OTHERWISE
      cJson := "null"
   ENDCASE

RETURN cJson

// ----------------------------------------------------------------------
// Helper functions for Grid navigation and Indexing
// Funciones auxiliares para la grilla e índices
// ----------------------------------------------------------------------
FUNCTION ValorDaColuna( ControlName, ParentForm, nCol )
   LOCAL aRet := {}
   IF GetControlType( ControlName, ParentForm ) != "GRID"
      RETURN ""
   ENDIF   
   nCol := IIf( nCol == Nil .OR. nCol == 0, 1, nCol )
   aRet := GetProperty( ParentForm, ControlName, 'Item', GetProperty( ParentForm, ControlName, 'Value' ) )
   IF ValType( aRet ) == "A" .AND. Len( aRet ) >= nCol
      RETURN aRet[ nCol ]
   ENDIF
RETURN ""

FUNCTION PosicionaIndice( cLetra )
   LOCAL i := 0
   FOR i := 1 TO 26
      IF CHR( i + 64 ) == cLetra
         MODIFY CONTROL GIndice OF Form_1 VALUE i
      ENDIF
   NEXT
   Form_1.GIndice.SetFocus
RETURN Nil

FUNCTION Imprimir()
   LOCAL cLetra := ValorDaColuna( "GIndice", "Form_1", 1 )
   LOCAL cTxt := "=== CONTACTS LIST / LISTA DE CONTACTOS (" + cLetra + ") ===" + hb_eol() + hb_eol()
   LOCAL cIdKey, hContacto

   IF hb_HHasKey( hDOM, "agenda" ) .AND. hb_HHasKey( hDOM["agenda"], "contactos" )
      FOR EACH cIdKey IN hDOM["agenda"]["contactos"]:Keys
         hContacto := hDOM["agenda"]["contactos"][ cIdKey ]
         IF Upper( Left( hContacto["name"], 1 ) ) == cLetra
            cTxt += "ID: " + cIdKey + " | " + hContacto["name"] + " | Tel: " + hContacto["phone"] + hb_eol()
         ENDIF
      NEXT
   ENDIF

   MsgInfo( cTxt, "Print Preview / Vista de Impresión" )
RETURN Nil
]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7768&p=72396#p72396 Tue, 18 Aug 2026 05:05:56 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7768&p=72396#p72396
<![CDATA[General :: Re: Demo Agenda + JSON + DOM :: Reply by serge_girard]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7768&p=72397#p72397 no_email@example.com (serge_girard) http://mail.hmgforum.com/viewtopic.php?f=24&t=7768&p=72397#p72397 Tue, 18 Aug 2026 06:41:34 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7768&p=72397#p72397 <![CDATA[General :: Re: Demo Agenda + JSON + DOM :: Reply by ASESORMIX]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7768&p=72398#p72398 no_email@example.com (ASESORMIX) http://mail.hmgforum.com/viewtopic.php?f=24&t=7768&p=72398#p72398 Tue, 18 Aug 2026 11:08:05 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7768&p=72398#p72398 <![CDATA[General :: Re: Demo Agenda + JSON + DOM :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7768&p=72400#p72400
Hice una limpieza en el codigo y dejo el ejemplo funcional

descomprimir en : C:\hmg.3.6\SAMPLES\Applications

Attachments

AGENDA_2.rar (18.04 KiB)
]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7768&p=72400#p72400 Wed, 19 Aug 2026 14:48:13 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7768&p=72400#p72400
<![CDATA[General :: DisabledBackColor + DisabledFontColor :: Author edufloriv]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7771&p=72411#p72411
Nunca habia usado estos atributos de TextBox (es decir para usarlos dinamicamente solo fijos) y vi en la documentación de HMG que era posible cambiarlos así que agregue esto a una procedure:
disabledBackColor_prg.png
Pero al compilar me indica este error:
disabledBackColor_consola.png
Lo indica como error de sintaxis como si el atributo no existiera ? Cualquier comentario agradecido de antemano. Saludos y un abrazo. Compile con HMG 3.5 (32).

Attachments


disabledBackColor_prg.png (191.35 KiB)


disabledBackColor_consola.png (39.52 KiB)

]]>
no_email@example.com (edufloriv) http://mail.hmgforum.com/viewtopic.php?f=24&t=7771&p=72411#p72411 Tue, 25 Aug 2026 03:15:01 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7771&p=72411#p72411
<![CDATA[General :: Re: DisabledBackColor + DisabledFontColor :: Reply by serge_girard]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7771&p=72412#p72412
I think it is 'Available at control definition only'....

Code: Select all

   @ 244 ,50 EDITBOX M_Archivo ;
         WIDTH 215 ; 
         HEIGHT 45 ;
         FONT "Calibri" SIZE 10 ;
         BOLD ;
         VALUE '' ;
         BACKCOLOR {218,229,243} ;
         DISABLEDBACKCOLOR {218,229,243} ; 
         DISABLEDFONTCOLOR {0,   0,  128} ; 
         MAXLENGTH 250 ;
         NOHSCROLL ;
         READONLY ;
         TOOLTIP ""
]]>
no_email@example.com (serge_girard) http://mail.hmgforum.com/viewtopic.php?f=24&t=7771&p=72412#p72412 Tue, 25 Aug 2026 06:17:04 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7771&p=72412#p72412
<![CDATA[General :: Re: DisabledBackColor + DisabledFontColor :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7771&p=72413#p72413

Code: Select all

Procedure CambiarColores()

   // 1. Asignar los colores para estado deshabilitado mediante SetProperty
   // Fondo deshabilitado: Gris claro {220, 220, 220}
   SetProperty ( "Form_1", "Text_1", "DISABLEDBACKCOLOR", { 220, 220, 220 } )
   
   // Texto deshabilitado: Rojo {255, 0, 0}
   SetProperty ( "Form_1", "Text_1", "DISABLEDFONTCOLOR", { 255, 0, 0 } )

   // 2. Deshabilitar el control para que se apliquen los colores
   SetProperty ( "Form_1", "Text_1", "ENABLED", .F. )

Return
o en forma directa:

Code: Select all

Form_1.Text_1.DisabledBackColor := { 220, 220, 220 }
Form_1.Text_1.DisabledFontColor := { 255, 0, 0 }
Form_1.Text_1.Enabled := .F.
Los cambios se harán visibles únicamente cuando el control pase a estar deshabilitado (ENABLED := .F.).]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7771&p=72413#p72413 Tue, 25 Aug 2026 16:06:53 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7771&p=72413#p72413
<![CDATA[General :: RESTalk REST + JSON + DOM :: Author danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7770&p=72406#p72406 les dejo una version REST API + JSON + DOM basado en la app
*********************************************************************************
* Simple Server for test with NETIO
*
* Created by : Paulo Sérgio Durço - 23/10/2009 8:30 Hrs
*
* Thanks Master Roberto Lopez for your great work.
*********************************************************************************

Attachments


WEB.png (32.19 KiB)


API Chat.png (22.23 KiB)


API info.png (25.33 KiB)


TalkClient.png (36.94 KiB)

]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7770&p=72406#p72406 Fri, 21 Aug 2026 01:49:05 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7770&p=72406#p72406
<![CDATA[General :: Re: RESTalk REST + JSON + DOM :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7770&p=72407#p72407
1- Salida
2. Descubridor UDP del SERVER

compilar con Build64 , si necesitan ayuda voy a generar el build.bat dentro de la carpeta]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7770&p=72407#p72407 Fri, 21 Aug 2026 01:53:10 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7770&p=72407#p72407
<![CDATA[General :: Re: RESTalk REST + JSON + DOM :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7770&p=72408#p72408 http://127.0.0.1:8080/api/info
http://127.0.0.1:8080/api/chat
http://localhost:8080/

RAR .........................

Attachments

RESTalk.rar (45.96 KiB)
]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7770&p=72408#p72408 Fri, 21 Aug 2026 01:53:43 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7770&p=72408#p72408
<![CDATA[General :: Re: RESTalk REST + JSON + DOM :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7770&p=72409#p72409

Code: Select all

Build.bat
para RESTalk

Code: Select all

@ECHO OFF
SETLOCAL
SET Temp1=%~dp0
SET Temp3=%Temp1%&SET Pos=0

:Loop
SET /a Pos+=1
ECHO %Temp3%|FINDSTR /b /c:"SAMPLES" >NUL
IF ERRORLEVEL 1 (
SET Temp3=%Temp3:~1%
IF DEFINED Temp3 GOTO Loop
SET Pos=0
)

SETLOCAL EnableDelayedExpansion
SET "Temp2=%Temp1%"
SET /a Pos=Pos-2
SET Temp1=!Temp2:~0,%Pos%!

IF "%1"=="" GOTO WithOutParam
SET MainFile="%1"
GOTO WithParam

:WithOutParam
:: Compilación secuencial en orden estricto: Servidor y luego Cliente
IF "%NoRun%"=="" (
    ECHO Building TalkServer.hbp...
    CALL %Temp1%\build64.bat TalkServer.hbp
    ECHO.
    ECHO Building TalkClient.hbp...
    CALL %Temp1%\build64.bat TalkClient.hbp
) ELSE (
    ECHO Building TalkServer.hbp ^(NoRun^)...
    CALL %Temp1%\build64.bat /n TalkServer.hbp
    ECHO.
    ECHO Building TalkClient.hbp ^(NoRun^)...
    CALL %Temp1%\build64.bat /n TalkClient.hbp
)
GOTO End

:WithParam
IF "%NoRun%"=="" CALL %Temp1%\Build.bat %MainFile%
IF NOT "%NoRun%"=="" CALL %Temp1%\Build.bat /n %MainFile%

:End
el .Rar descomprimir en

Code: Select all

C:\hmg.3.6\SAMPLES\Advanced
]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7770&p=72409#p72409 Fri, 21 Aug 2026 02:02:50 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7770&p=72409#p72409
<![CDATA[General :: Re: RESTalk REST + JSON + DOM :: Reply by Steed]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7770&p=72414#p72414 no_email@example.com (Steed) http://mail.hmgforum.com/viewtopic.php?f=24&t=7770&p=72414#p72414 Thu, 27 Aug 2026 02:20:54 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7770&p=72414#p72414 <![CDATA[General :: Mica DWM Microsoft :: Author danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7773&p=72427#p72427
Mica Demo for Harbour/HMG — Bringing Windows 11 Materials to Win32 GUI Apps
What is Mica?
Mica is a Windows 11 material introduced with the Fluent design language.
It's an opaque dynamic material: the Desktop Window Manager (DWM) samples the user's desktop wallpaper and theme color once,
and paints the window's background with a subtle, tinted version of it. Unlike Acrylic (which is a translucent, real-time blur of whatever is currently behind the window),
Mica doesn't blur live content — it's cheaper to render, avoids the blur-behind-window overhead, and gives apps a "rooted in the desktop" feel while keeping window content perfectly readable on top.

Windows 11 exposes these system materials to regular Win32 apps through a single attribute:

DwmSetWindowAttribute(hWnd, DWMWA_SYSTEMBACKDROP_TYPE /* 38 */, &value, sizeof(value));
// value: 1 = None, 2 = Mica (main window), 3 = Acrylic (transient window), 4 = Mica Alt (tabbed)

The catch: making it actually show up
Setting the attribute alone does nothing visible for a classic GDI application, because your window paints an opaque background over the material. Two tricks make it work:

1. Extend the DWM frame across the entire client area:

MARGINS mar = { -1, -1, -1, -1 };
DwmExtendFrameIntoClientArea(hWnd, &mar);

With the sheet-of-glass frame covering the whole client, any pixel your app paints with plain GDI ends up with alpha 0 — invisible. Pixels painted black become fully transparent and let the system material show through. So the window background is simply FillRect(..., BLACK_BRUSH).

2. Alpha-corrected drawing for everything else. Since GDI never writes the alpha channel, text and colored fills drawn with TextOut/FillRect vanish over the material. The fix: render into a 32-bpp DIB, fix/premultiply the alpha channel by hand, and blit with AlphaBlend (which respects per-pixel alpha):

BlitFillAlpha() — solid fill with alpha 255 for borders, hover states and button highlights.
DrawTextAlpha() — draws white text into a DIB, uses per-pixel luminance as the alpha mask, premultiplies with the target color, then AlphaBlends it. Result: crisp antialiased text visible over Mica.

What this example does
The demo (C and Harbour/HMG versions) is a live playground for these techniques:

Switch None / Mica / Acrylic at runtime.
Toggle immersive dark mode (DWMWA_USE_IMMERSIVE_DARK_MODE) for dark/light title bars.
Custom title bar on a caption-less window: centered caption, Segoe MDL2 Assets glyphs for minimize/close (\uE921 / \uE8BB), red hover on close, dragging via WM_NCHITTEST → HTCAPTION, double-click to maximize, resize via kept WS_THICKFRAME, rounded corners via DWMWA_WINDOW_CORNER_PREFERENCE.
Owner-drawn buttons whose text survives the material thanks to the alpha helpers.


The Harbour/HMG port
The HMG version proves the pattern drops into an existing Win32 framework without replacing it:

The .prg defines a plain HMG MAIN NOCAPTION window.
A small C bridge (MicaBridge.c) subclasses the HMG window with SetWindowSubclass — the same pattern used by our Flyout engine — and takes over WM_ERASEBKGND (black), WM_PAINT (custom title bar), WM_NCHITTEST, hover tracking, and button creation/drawing.
Buttons report clicks back to Harbour through a codeblock: Mica_SetOnCommand( {|nId| ...} ).

Two practical gotchas worth documenting for the forum:

WM_DRAWITEM passes the DRAWITEMSTRUCT* in lParam, not wParam (wParam is the control's HWND). Casting wParam silently reads garbage — and crashes (0xC000041D) once you actually use it.
Create the subclass before the child buttons, or their first WM_DRAWITEM goes to the original window procedure and they never paint.
The golden rule this demo establishes: over a system material, anything drawn with plain GDI is invisible — only alpha-corrected blits are visible, and black means "let the material through".

Source :

Attachments

MicaDemoHB.rar (9.78 KiB)
]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7773&p=72427#p72427 Fri, 04 Sep 2026 20:15:09 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7773&p=72427#p72427
<![CDATA[General :: Re: Mica DWM Microsoft :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7773&p=72428#p72428

Attachments


Captura de pantalla 2026-09-04 171604.png (52.06 KiB)

]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7773&p=72428#p72428 Fri, 04 Sep 2026 20:17:18 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7773&p=72428#p72428
<![CDATA[General :: Re: VisionEngine Library :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7742&p=72430#p72430 Visionengine se convirtio en VisionEngineMT por Multitreath (multi hilos en el motor Zbar) como Zbar es muy viejo (data de 2012) decidi usar ZXing, asi que elimime todo rastro de Zbar del ejemplo.
como no encuentro mi camara web homebrew (echo en casa) sacada de una vieja notebook, decidi implementar que se pueda tambien decodificar desde una imagen el codebar o codigo de barras.
quien tenga la amabilidad de compilar el ejemplo y probarla con su webcam se los agradeceria.

Hello everyone, today my current job leaves me some free time to review my sample apps.
VisionEngine became VisionEngineMT due to Multithreading (multithreading in the Zbar engine). Since Zbar is very old (dating from 2012), I decided to use ZXing, so I removed all traces of Zbar from the example.
Since I can't find my homebrew webcam (made from an old laptop), I decided to implement the ability to decode barcodes from images.
I would be grateful to anyone who would be kind enough to compile the example and test it with their webcam.

Attachments


VisionEngine.png (15.48 KiB)

]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7742&p=72430#p72430 Sat, 05 Sep 2026 14:56:24 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7742&p=72430#p72430
<![CDATA[General :: Re: VisionEngine Library :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7742&p=72431#p72431
Source Code:

Attachments

VisionEngineMT.rar (1472.41 KiB)
]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7742&p=72431#p72431 Sat, 05 Sep 2026 14:59:01 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7742&p=72431#p72431
<![CDATA[General :: Modern MenuFlyout :: Author danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7772&p=72423#p72423
Flyout is a modern pop-up side menu control for Win32/HMG windows—think of the "hamburger menu" slider panel from Fluent/Windows 11 apps, but implemented in pure C on top of the classic Win32 API.]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7772&p=72423#p72423 Fri, 04 Sep 2026 04:13:20 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7772&p=72423#p72423
<![CDATA[General :: Re: Modern MenuFlyout :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7772&p=72424#p72424

Attachments

MenuFlyout.rar (167.81 KiB)

Captura de pantalla 2026-09-04 005857.png (172.3 KiB)

]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7772&p=72424#p72424 Fri, 04 Sep 2026 04:16:54 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7772&p=72424#p72424
<![CDATA[General :: Re: Modern MenuFlyout :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7772&p=72425#p72425

Code: Select all

SetupFlyout( GetFormHandle("MainWin") ) 

Attachments


Captura de pantalla 2026-09-04 011956.png (165.2 KiB)

]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7772&p=72425#p72425 Fri, 04 Sep 2026 04:22:32 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7772&p=72425#p72425
<![CDATA[General :: Re: Modern MenuFlyout :: Reply by serge_girard]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7772&p=72426#p72426
Serge]]>
no_email@example.com (serge_girard) http://mail.hmgforum.com/viewtopic.php?f=24&t=7772&p=72426#p72426 Fri, 04 Sep 2026 07:11:20 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7772&p=72426#p72426
<![CDATA[General :: Re: Modern MenuFlyout :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7772&p=72429#p72429
MenuFlyout con tema Oscuro y claro !!!

Attachments

MenuFlyout.rar (168.68 KiB)
]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7772&p=72429#p72429 Sat, 05 Sep 2026 00:17:04 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7772&p=72429#p72429
<![CDATA[General :: Re: Modern MenuFlyout :: Reply by mol]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7772&p=72433#p72433 I'm thinking how to use it in my apps...]]> no_email@example.com (mol) http://mail.hmgforum.com/viewtopic.php?f=24&t=7772&p=72433#p72433 Sat, 05 Sep 2026 19:36:05 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7772&p=72433#p72433 <![CDATA[General :: Re: Modern MenuFlyout :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7772&p=72434#p72434
mol wrote: Sat Sep 05, 2026 7:36 pm Super work!
I'm thinking how to use it in my apps...
Usalo, es Libre!!!! como HMG]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7772&p=72434#p72434 Sat, 05 Sep 2026 21:38:03 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7772&p=72434#p72434
<![CDATA[General :: Re: News menu :: Reply by mol]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7765&p=72435#p72435

Code: Select all

Harbour 3.2.0dev (r2304211101)
Copyright (c) 1999-2023, https://harbour.github.io/
In file included from D:/hmg36/harbour64/include/hbdefs.h:52,
                 from D:/hmg36/harbour64/include/hbvmpub.h:50,
                 from C:/Users/Marek/AppData/Local/Temp/hbmk_yltb6h.dir/menubuttons.c:7:
D:/hmg36/mingw64/x86_64-w64-mingw32/include/stdlib.h: In function 'llabs':
D:/hmg36/mingw64/x86_64-w64-mingw32/include/stdlib.h:735:3: internal compiler error: Illegal instruction
  735 |   __MINGW_EXTENSION __CRT_INLINE long long __cdecl llabs(long long _j) { return (_j >= 0 ? _j : -_j); }
      |   ^~~~~~~~~~~~~~~~~
libbacktrace could not find executable to open
Please submit a full bug report, with preprocessed source (by using -freport-bug).
See <https://gcc.gnu.org/bugs/> for instructions.
In file included from D:/hmg36/harbour64/include/hbdefs.h:52,
                 from D:/hmg36/harbour64/include/hbvmpub.h:50,
                 from D:/hmg36/harbour64/include/hbapi.h:55,
                 from C:/Users/Marek/AppData/Local/Temp/hbmk_rse47r.c:4:
D:/hmg36/mingw64/x86_64-w64-mingw32/include/stdlib.h: In function 'llabs':
D:/hmg36/mingw64/x86_64-w64-mingw32/include/stdlib.h:735:3: internal compiler error: Illegal instruction
  735 |   __MINGW_EXTENSION __CRT_INLINE long long __cdecl llabs(long long _j) { return (_j >= 0 ? _j : -_j); }
      |   ^~~~~~~~~~~~~~~~~
libbacktrace could not find executable to open
Please submit a full bug report, with preprocessed source (by using -freport-bug).
See <https://gcc.gnu.org/bugs/> for instructions.
hbmk2: Error: Running C/C++ compiler. 1
gcc.exe -c -O3  -W -Wall -pipe -ID:/hmg36/harbour64/include -Id:/projekty/testy/menubuttons -ID:/hmg36/include C:/Users/Marek/AppData/Local/Temp/hbmk_yltb6h.dir/menubuttons.c C:/Users/Marek/AppData/Local/Temp/hbmk_rse47r.c

]]>
no_email@example.com (mol) http://mail.hmgforum.com/viewtopic.php?f=24&t=7765&p=72435#p72435 Sun, 06 Sep 2026 19:00:01 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7765&p=72435#p72435
<![CDATA[General :: Re: News menu :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7765&p=72436#p72436
mol wrote: Sun Sep 06, 2026 7:00 pm I can't compile

Code: Select all

Harbour 3.2.0dev (r2304211101)
Copyright (c) 1999-2023, https://harbour.github.io/
In file included from D:/hmg36/harbour64/include/hbdefs.h:52,
                 from D:/hmg36/harbour64/include/hbvmpub.h:50,
                 from C:/Users/Marek/AppData/Local/Temp/hbmk_yltb6h.dir/menubuttons.c:7:
D:/hmg36/mingw64/x86_64-w64-mingw32/include/stdlib.h: In function 'llabs':
D:/hmg36/mingw64/x86_64-w64-mingw32/include/stdlib.h:735:3: internal compiler error: Illegal instruction
  735 |   __MINGW_EXTENSION __CRT_INLINE long long __cdecl llabs(long long _j) { return (_j >= 0 ? _j : -_j); }
      |   ^~~~~~~~~~~~~~~~~
libbacktrace could not find executable to open
Please submit a full bug report, with preprocessed source (by using -freport-bug).
See <https://gcc.gnu.org/bugs/> for instructions.
In file included from D:/hmg36/harbour64/include/hbdefs.h:52,
                 from D:/hmg36/harbour64/include/hbvmpub.h:50,
                 from D:/hmg36/harbour64/include/hbapi.h:55,
                 from C:/Users/Marek/AppData/Local/Temp/hbmk_rse47r.c:4:
D:/hmg36/mingw64/x86_64-w64-mingw32/include/stdlib.h: In function 'llabs':
D:/hmg36/mingw64/x86_64-w64-mingw32/include/stdlib.h:735:3: internal compiler error: Illegal instruction
  735 |   __MINGW_EXTENSION __CRT_INLINE long long __cdecl llabs(long long _j) { return (_j >= 0 ? _j : -_j); }
      |   ^~~~~~~~~~~~~~~~~
libbacktrace could not find executable to open
Please submit a full bug report, with preprocessed source (by using -freport-bug).
See <https://gcc.gnu.org/bugs/> for instructions.
hbmk2: Error: Running C/C++ compiler. 1
gcc.exe -c -O3  -W -Wall -pipe -ID:/hmg36/harbour64/include -Id:/projekty/testy/menubuttons -ID:/hmg36/include C:/Users/Marek/AppData/Local/Temp/hbmk_yltb6h.dir/menubuttons.c C:/Users/Marek/AppData/Local/Temp/hbmk_rse47r.c

para responderte correctamente tengo que tener tu build.bat porque veo que esos errores no son de HMG, ni de harbour.. es gcc]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7765&p=72436#p72436 Sun, 06 Sep 2026 19:53:07 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7765&p=72436#p72436
<![CDATA[General :: Re: News menu :: Reply by mol]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7765&p=72439#p72439 no_email@example.com (mol) http://mail.hmgforum.com/viewtopic.php?f=24&t=7765&p=72439#p72439 Mon, 07 Sep 2026 09:58:49 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7765&p=72439#p72439 <![CDATA[General :: Re: Workspace - development environment :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72391#p72391 https://t.me/HMGWorkspace

en nuevo entorno de desarrollo esta casi funcional y necesito que prueben con sus ejemplos, se recomienda crear una carpeta EJ: C:\Projects
probar ahi las aperturas de xxx.hbp

pueden compilar , hacer debug de sus proyectos, sean en modo GUI o harbour puro.

In the new development environment, it's almost functional, and I need you to test it with your examples. It's recommended to create a folder, e.g., C:\Projects, and test opening xxx.hbp there.

You can compile and debug your projects, whether in GUI mode or pure harbor mode.

estaré respondiendo dudas en el grupo // I will be answering questions in the group.

Attachments


Captura de pantalla 2026-08-15 125414.png (150.07 KiB)


Captura de pantalla 2026-08-15 124639.png (140.76 KiB)


Captura de pantalla 2026-08-15 124018.png (165.13 KiB)

]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72391#p72391 Sun, 16 Aug 2026 00:55:55 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72391#p72391
<![CDATA[General :: Re: Workspace - development environment :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72415#p72415 casi terminado Workspace y FormEditorService que incluye edición de formulario dentro de un ViewPort que permite como ejemplo mi Aplicación para cámaras IP que tiene una resolución de 1200x 1024, al tener mucha resolucion en canvas de Main.fmg este se puede desplazar con las barras de posición.

Hello everyone: I've almost finished Workspace and FormEditorService, which includes form editing within a ViewPort. For example, my IP camera application has a resolution of 1200x1024, and because of the high resolution of the Main.fmg canvas, it can be scrolled using the position bars.

dejo capturas y como siempre los espero en el canl de Telegram ahi tienen a disposicion Workspace

t.me/HMGWorkspace
Workspace.png
FormEditorService.png
Exist With Save.png

Attachments


Workspace.png (120.08 KiB)


Exist With Save.png (101.26 KiB)


FormEditorService.png (112.67 KiB)

]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72415#p72415 Fri, 28 Aug 2026 13:24:32 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72415#p72415
<![CDATA[General :: Re: Workspace - development environment :: Reply by serge_girard]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72416#p72416 no_email@example.com (serge_girard) http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72416#p72416 Fri, 28 Aug 2026 13:48:16 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72416#p72416 <![CDATA[General :: Re: Workspace - development environment :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72417#p72417 https://t.me/HMGWorkspace

Captura de pantalla 2026-08-28 161323.png

Attachments


Captura de pantalla 2026-08-28 161323.png (81.32 KiB)

]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72417#p72417 Fri, 28 Aug 2026 19:15:21 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72417#p72417
<![CDATA[General :: Re: Workspace - development environment :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72418#p72418
como siempre los invito a probar Workspace en mi canal esta la descarga del mismo : https://t.me/HMGWorkspace

ahora estoy integrando la posibilidad de revisar .exe, .dll, .a, .lib
generar el .def para generar un .a desde un .dll o .lib

Attachments


Captura de pantalla 2026-09-01 181022.png (83.56 KiB)

]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72418#p72418 Tue, 01 Sep 2026 21:15:41 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72418#p72418
<![CDATA[General :: Re: Workspace - development environment :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72419#p72419 la finalidad de este servicio es revisar funciones exportadas.
yo me siento mas comodo trabajar con una libreria estatica .a que un dll, a veces hay .lib que tambien puede ser covertidas en libreria estatica .a

ya no hay necesidad de utilizar e instalar herramientas de terceros .
mi proximo paso es hacer es agregar report a DependencyService que indique como lo hace un getor de paquetes de Linux (Aptget) la falta de dependencias de un binario

Code: Select all

DependencyService report

Runtime dependency group: VLC
Status: incomplete

Found:
  libvlc.dll

Missing:
  libvlccore.dll
  plugins\

Suggestion:
  Copy libvlccore.dll next to the executable.
  Copy the VLC plugins folder next to the executable.
  Verify that all files are 64-bit.
]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72419#p72419 Wed, 02 Sep 2026 02:17:51 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72419#p72419
<![CDATA[General :: Re: Workspace - development environment :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72420#p72420

Attachments


DependencyService.png (48.88 KiB)


Captura de pantalla 2026-09-01 225144.png (105.13 KiB)

]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72420#p72420 Wed, 02 Sep 2026 02:19:05 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72420#p72420
<![CDATA[General :: Re: Workspace - development environment :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72422#p72422
pase de esto:

Code: Select all

*-------------------------------------------------------------*
Function AbrirPuerto( lRetorno )
*-------------------------------------------------------------*
nHandler := CallDll32( "OpenComFiscal" , "WINFIS32.DLL" , 1 , 0 )

    If nHandler >= 0 
       Principal.StatusBar.Item(2) :="Puerto de impresora OK "
       nError := CallDll32( "InitFiscal"    , "WINFIS32.DLL" , nHandler )
       If nError = 0
         lRetorno :=  .T.
       Else 
         alerror( nError )
         Principal.StatusBar.Item(2) := " La impresora no se puede Inicializar"   
          lRetorno := .T.  
       Endif
   Else
    alerror( nHandler )
    Principal.StatusBar.Item(2) :=" Hubo un error de abrir puerto Comm "
    lRetorno := .T.      
   Endif

Return ( lRetorno )

a esto :

Code: Select all

*-------------------------------------------------------------*
Function AbrirPuerto( lRetorno )
*-------------------------------------------------------------*

   nHandler := OpenComFiscal( 1, 0 )

   If nHandler >= 0
      Principal.StatusBar.Item(2) := "Puerto de impresora OK "

      nError := InitFiscal( nHandler )

      If nError = 0
         lRetorno := .T.
      Else
         alerror( nError )
         Principal.StatusBar.Item(2) := " La impresora no se puede Inicializar"
         lRetorno := .T.
      Endif

   Else
      alerror( nHandler )
      Principal.StatusBar.Item(2) := " Hubo un error de abrir puerto Comm "
      lRetorno := .T.
   Endif

Return ( lRetorno )
]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72422#p72422 Wed, 02 Sep 2026 02:35:25 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72422#p72422
<![CDATA[General :: Re: Workspace - development environment :: Reply by danielmaximiliano]]> http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72440#p72440 estas son algunas de las correccciones visuales y correcciones del inspector de propiedades de objetos.
el inspector ahora trabaja sobre un catalogo de controles donde cada control tiene un propiedad y no genericas .
estas propiedades ahora dentro estan marcadas como (D) en modo definicion y no pueden ser modificadas en Runtime.
la parte visual muestra el formulario m su menu, su timer y statusbar dentro del mismo formulario.. este esta encapsulado dentro del DesignForm.
Workspace.png
FormEditor.png

Attachments


Workspace.png (120.63 KiB)


FormEditor.png (100.85 KiB)

]]>
no_email@example.com (danielmaximiliano) http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72440#p72440 Tue, 08 Sep 2026 02:36:38 +0000 http://mail.hmgforum.com/viewtopic.php?f=24&t=7767&p=72440#p72440
<![CDATA[My HMG Projects :: Harbour Chess :: Author gfilatov]]> http://mail.hmgforum.com/viewtopic.php?f=15&t=7778&p=72460#p72460
I would like to express my sincere gratitude to Marcos Jarrin for implementing this chess game using Harbour and MiniGUI Extended.

It had long been a dream of mine to have a full-fledged chess engine in MiniGUI.

Here is the application's main header and a few screenshots.
I am also attaching the technical documentation and user manual for your reference—in case you are a chess enthusiast like me.

/*
Program : chess.prg — Harbour Chess
Author : Marcos Jarrín · BadaSystem · badasystem.com
Toolchain: Harbour + MiniGUI Extended (Win32) + BCC 32-bit
Version : 2.34 · 13/09/2026
License : MIT (see LICENSE.md)

Purpose
-------
Single-module chess application supporting Human vs Human, Human vs Machine,
and Machine vs Machine. Implements core FIDE chess rules including castling,
en passant, promotion, checkmate/stalemate, claimable 3-fold and 50-move
draws, automatic 5-fold and 75-move draws, and insufficient-material cases.

AI engine: Alpha-Beta search with quiescence, iterative deepening, PVS,
killer/history/countermove ordering, Zobrist transposition table (with
mate-distance normalization and draw-context exact-cutoff suppression),
and a phased evaluation (material, piece-square tables, mobility, pawn
structure). Time-controlled iterative deepening with partial-depth commit
policy (Mode A soft-finish / Mode B full-depth only). Root-parallel
multi-threaded search with worker I/O isolation.

Architecture
------------
GUI (MiniGUI) → controller (DoMove, timers, menus)
→ engine (GenLegalMoves, ApplyMove / MakeMove-UnmakeMove)
Legal-move validation uses the same in-place MakeMove/UnmakeMove path as
search. Search undo state is a compact fixed array; repetition counts are
maintained incrementally. Engine state is a hash mutated in place.
AI search is started by a timer. Root-parallel workers use THREAD STATIC
state and never perform console/logfile I/O (routed via ChessDebugOut).

Encoding: UTF-8 (optional Unicode piece glyphs).
UI strings go through T(cKey); hash reads through _HGetSafe().
*/
start_position.png
replay_position.png
final_position.png
I hope you have a great time and a wonderful day.

Attachments


replay_position.png (28.81 KiB)


final_position.png (27.58 KiB)


start_position.png (19.29 KiB)

]]>
no_email@example.com (gfilatov) http://mail.hmgforum.com/viewtopic.php?f=15&t=7778&p=72460#p72460 Sun, 13 Sep 2026 12:09:14 +0000 http://mail.hmgforum.com/viewtopic.php?f=15&t=7778&p=72460#p72460
<![CDATA[My HMG Projects :: Re: Harbour Chess :: Reply by serge_girard]]> http://mail.hmgforum.com/viewtopic.php?f=15&t=7778&p=72461#p72461
Serge]]>
no_email@example.com (serge_girard) http://mail.hmgforum.com/viewtopic.php?f=15&t=7778&p=72461#p72461 Sun, 13 Sep 2026 15:34:21 +0000 http://mail.hmgforum.com/viewtopic.php?f=15&t=7778&p=72461#p72461
<![CDATA[My HMG Projects :: Re: Harbour Chess :: Reply by gfilatov]]> http://mail.hmgforum.com/viewtopic.php?f=15&t=7778&p=72464#p72464
serge_girard wrote: Sun Sep 13, 2026 3:34 pm Thanks Grigory, where can we download?
Hello Serge,

Here it is. 8-)

Have fun!

Attachments

Chess application and two manuals
Chess.zip (1421.17 KiB)
]]>
no_email@example.com (gfilatov) http://mail.hmgforum.com/viewtopic.php?f=15&t=7778&p=72464#p72464 Mon, 14 Sep 2026 15:34:22 +0000 http://mail.hmgforum.com/viewtopic.php?f=15&t=7778&p=72464#p72464