<![CDATA[HMGforum.com]]> http://mail.hmgforum.com Smartfeed extension for phpBB <![CDATA[HMG General Help :: Re: "read" QR Code :: Reply by danielmaximiliano]]> 2026-04-24T17:30:44+00:00 2026-04-24T17:30:44+00:00 http://mail.hmgforum.com/viewtopic.php?f=5&t=7255&p=72236#p72236
tonton2 wrote: Thu Apr 09, 2026 10:17 am Bonjour : How can I read QR code files and other barcodes using the internal camera or an external webcam with Zbar.exe?

Thank you in advance.
Español : visionengine es la libreria que hice para la lectura de codebar para implementar en cualquier proyecto HMG Harbour
mirar la implementacion del ejemplo y los ajuste e onfigurcion en el examinador de proyecto de hmg.
perdon nunca vi mesajes del foro sin leer
VisionEngine.rar

Attachments

VisionEngine.rar (2025.8 KiB)
]]>
tonton2 wrote: Thu Apr 09, 2026 10:17 am Bonjour : How can I read QR code files and other barcodes using the internal camera or an external webcam with Zbar.exe?

Thank you in advance.
Español : visionengine es la libreria que hice para la lectura de codebar para implementar en cualquier proyecto HMG Harbour
mirar la implementacion del ejemplo y los ajuste e onfigurcion en el examinador de proyecto de hmg.
perdon nunca vi mesajes del foro sin leer
VisionEngine.rar

Attachments

VisionEngine.rar (2025.8 KiB)
]]>
<![CDATA[HMG General Help :: Re: "read" QR Code :: Reply by tonton2]]> 2026-04-27T11:34:12+00:00 2026-04-27T11:34:12+00:00 http://mail.hmgforum.com/viewtopic.php?f=5&t=7255&p=72241#p72241
danielmaximiliano wrote: Fri Apr 24, 2026 5:30 pm
tonton2 wrote: Thu Apr 09, 2026 10:17 am Bonjour : How can I read QR code files and other barcodes using the internal camera or an external webcam with Zbar.exe?

Thank you in advance.
Español : visionengine es la libreria que hice para la lectura de codebar para implementar en cualquier proyecto HMG Harbour
mirar la implementacion del ejemplo y los ajuste e onfigurcion en el examinador de proyecto de hmg.
perdon nunca vi mesajes del foro sin leer

VisionEngine.rar
Merci beaucoup mon ami]]>
danielmaximiliano wrote: Fri Apr 24, 2026 5:30 pm
tonton2 wrote: Thu Apr 09, 2026 10:17 am Bonjour : How can I read QR code files and other barcodes using the internal camera or an external webcam with Zbar.exe?

Thank you in advance.
Español : visionengine es la libreria que hice para la lectura de codebar para implementar en cualquier proyecto HMG Harbour
mirar la implementacion del ejemplo y los ajuste e onfigurcion en el examinador de proyecto de hmg.
perdon nunca vi mesajes del foro sin leer

VisionEngine.rar
Merci beaucoup mon ami]]>
<![CDATA[HMG General Help :: Servidor en localhost :: Author Mario Mansilla]]> 2026-05-03T21:04:38+00:00 2026-05-03T21:04:38+00:00 http://mail.hmgforum.com/viewtopic.php?f=5&t=7748&p=72255#p72255 Tengo una aplicacion realizada con HmG 3.4.4 32 bits y necesito conectarla a una API que devuelve los resultados en una url . Como mi aplicacion es de escritorio necesito crear un servidor que espere resultados en la direccion http:\\localhost:8080\Callback .
Intento con esta funcion ayudado por IA pero al intentar compilar me da error en la funcion hb_httpdReceiver .
No se donde estoy cometiendo el error , espero puedan orientarme .
Adjunto las funciones que intento utilizar

Saludos
Mario Rafael Mansilla

Hello Friends:
I have an application built with HmG 3.4.4 32-bit and I need to connect it to an API that returns results to a URL. Since my application is desktop-based, I need to create a server that expects results at the address http:\\localhost:8080\Callback.
I'm trying to use this function with AI assistance, but when I try to compile, I get an error in the hb_httpdReceiver function.
don't know where I'm going wrong; I hope you can guide me.
I've attached the functions I'm trying to use.
Regards, Mario Rafael Mansilla

Harbour 3.2.0dev (r1703241902)
Copyright (c) 1999-2016, http://harbour-project.org/
C:/Users/Usuario/AppData/Local/Temp/hbmk_7cxa8p.dir/Main.o:Main.c:(.data+0xb8): undefined reference to `HB_FUN_HBHTTPDRECEIVER'
collect2.exe: error: ld returned 1 exit status
hbmk2[Main]: Error: Ejecutando enlazador. 1
gcc.exe C:/Users/Usuario/AppData/Local/Temp/hbmk_7cxa8p.dir/Main.o C:/Users/Usuario/AppData/Local/Temp/hbmk_7cxa8p.dir/hbmk_f1wpne.o C:/Sistemas/TfwinNube/_temp.o -pthread -static-libgcc -static-libstdc++ -static -lpthread -mwindows -Wl,--start-group -lhmg -lcrypt -ledit -leditex -lgraph -lini -lreport -lhfcl -lmsvfw32 -lvfw32 -lhbmysql -lmysql -lhbfimage -lhbpgsql -lsddmy -lhbvpdf -lhbct -lhbwin -lhbmzip -lminizip -lhbmemio -lhbmisc -lhbtip -lsqlite3 -lhbsqlit3 -lsddodbc -lrddsql -lhbodbc -lodbc32 -lhbhpdf -lhbnetio -lxhb -lpng -llibhpdf -lhbzebra -lhbssl -lssleay32 -llibeay32 -lhbhttpd -lhbextern -lhbdebug -lhbvm -lhbrtl -lhblang -lhbcpage -lgtcgi -lgtpca -lgtstd -lgtwin -lgtwvt -lgtgui -lhbrdd -lhbuddall -lhbusrrdd -lrddntx -lrddcdx -lrddnsx -lrddfpt -lhbrdd -lhbhsx -lhbsix -lhbmacro -lhbcplr -lhbpp -lhbcommon -lhbmainwin -lkernel32 -luser32 -lgdi32 -ladvapi32 -lws2_32 -liphlpapi -lwinspool -lcomctl32 -lcomdlg32 -lshell32 -luuid -lole32 -loleaut32 -lmpr -lwinmm -lmapi32 -limm32 -lmsimg32 -lwininet -lhbpcre -lhbzlib -Wl,--end-group -oMain.exe -LC:/hmg.3.4.4/harbour/lib/win/mingw -LC:/hmg.3.4.4/lib

hbmk2: Error: Funci¢n(es) referenciada, no encontrada, pero desconocida:
HBHTTPDRECEIVER()

Uso HMG 3.4.4 32 bits con su respectivo ide . En configuracion agrego las librerias :

I'm using HMG 3.4.4 32-bit with its respective IDE. In the configuration, I've added the following libraries:

libs=hbtip.hbc
libs=hbssl.hbc
libs=hbhttpd.hbc


*--------------------------
FUNCTION StartLocalServer()
*--------------------------
LOCAL nPort := 8080
LOCAL oHttpd

// Iniciamos el servidor en el puerto 8080
// El segundo parámetro es el bloque de código que procesa las peticiones
oHttpd := hb_httpdReceiver( nPort, { | oRequest | ProcessRequest( oRequest ) } )

IF Empty( oHttpd )
MsgStop( "No se pudo iniciar el servidor en el puerto " + hb_ntos(nPort) )
ELSE
MsgInfo( "Servidor escuchando en http://localhost:" + hb_ntos(nPort) + "/callback" )
ENDIF
RETURN NIL

*---------------------------------------
STATIC FUNCTION ProcessRequest( oRequest )
*---------------------------------------

LOCAL cPath := oRequest:GetEnv( "PATH_INFO" )
LOCAL cResponse := ""

// Verificamos si la ruta es /callback
IF cPath == "/callback"
// Aquí procesas lo que llega (parámetros GET, POST, etc.)
cResponse := "<html><body><h1>Callback recibido con éxito</h1></body></html>"

// Ejemplo: registrar en log o mostrar mensaje en MiniGUI
// DoMethod( "Form_1", "StatusBar", "Item", 1, "Petición recibida en /callback" )
ELSE
cResponse := "<html><body><h1>404 - Ruta no encontrada</h1></body></html>"
ENDIF

// Enviamos la respuesta al cliente
oRequest:SendResponse( cResponse )
RETURN NIL]]>
Tengo una aplicacion realizada con HmG 3.4.4 32 bits y necesito conectarla a una API que devuelve los resultados en una url . Como mi aplicacion es de escritorio necesito crear un servidor que espere resultados en la direccion http:\\localhost:8080\Callback .
Intento con esta funcion ayudado por IA pero al intentar compilar me da error en la funcion hb_httpdReceiver .
No se donde estoy cometiendo el error , espero puedan orientarme .
Adjunto las funciones que intento utilizar

Saludos
Mario Rafael Mansilla

Hello Friends:
I have an application built with HmG 3.4.4 32-bit and I need to connect it to an API that returns results to a URL. Since my application is desktop-based, I need to create a server that expects results at the address http:\\localhost:8080\Callback.
I'm trying to use this function with AI assistance, but when I try to compile, I get an error in the hb_httpdReceiver function.
don't know where I'm going wrong; I hope you can guide me.
I've attached the functions I'm trying to use.
Regards, Mario Rafael Mansilla

Harbour 3.2.0dev (r1703241902)
Copyright (c) 1999-2016, http://harbour-project.org/
C:/Users/Usuario/AppData/Local/Temp/hbmk_7cxa8p.dir/Main.o:Main.c:(.data+0xb8): undefined reference to `HB_FUN_HBHTTPDRECEIVER'
collect2.exe: error: ld returned 1 exit status
hbmk2[Main]: Error: Ejecutando enlazador. 1
gcc.exe C:/Users/Usuario/AppData/Local/Temp/hbmk_7cxa8p.dir/Main.o C:/Users/Usuario/AppData/Local/Temp/hbmk_7cxa8p.dir/hbmk_f1wpne.o C:/Sistemas/TfwinNube/_temp.o -pthread -static-libgcc -static-libstdc++ -static -lpthread -mwindows -Wl,--start-group -lhmg -lcrypt -ledit -leditex -lgraph -lini -lreport -lhfcl -lmsvfw32 -lvfw32 -lhbmysql -lmysql -lhbfimage -lhbpgsql -lsddmy -lhbvpdf -lhbct -lhbwin -lhbmzip -lminizip -lhbmemio -lhbmisc -lhbtip -lsqlite3 -lhbsqlit3 -lsddodbc -lrddsql -lhbodbc -lodbc32 -lhbhpdf -lhbnetio -lxhb -lpng -llibhpdf -lhbzebra -lhbssl -lssleay32 -llibeay32 -lhbhttpd -lhbextern -lhbdebug -lhbvm -lhbrtl -lhblang -lhbcpage -lgtcgi -lgtpca -lgtstd -lgtwin -lgtwvt -lgtgui -lhbrdd -lhbuddall -lhbusrrdd -lrddntx -lrddcdx -lrddnsx -lrddfpt -lhbrdd -lhbhsx -lhbsix -lhbmacro -lhbcplr -lhbpp -lhbcommon -lhbmainwin -lkernel32 -luser32 -lgdi32 -ladvapi32 -lws2_32 -liphlpapi -lwinspool -lcomctl32 -lcomdlg32 -lshell32 -luuid -lole32 -loleaut32 -lmpr -lwinmm -lmapi32 -limm32 -lmsimg32 -lwininet -lhbpcre -lhbzlib -Wl,--end-group -oMain.exe -LC:/hmg.3.4.4/harbour/lib/win/mingw -LC:/hmg.3.4.4/lib

hbmk2: Error: Funci¢n(es) referenciada, no encontrada, pero desconocida:
HBHTTPDRECEIVER()

Uso HMG 3.4.4 32 bits con su respectivo ide . En configuracion agrego las librerias :

I'm using HMG 3.4.4 32-bit with its respective IDE. In the configuration, I've added the following libraries:

libs=hbtip.hbc
libs=hbssl.hbc
libs=hbhttpd.hbc


*--------------------------
FUNCTION StartLocalServer()
*--------------------------
LOCAL nPort := 8080
LOCAL oHttpd

// Iniciamos el servidor en el puerto 8080
// El segundo parámetro es el bloque de código que procesa las peticiones
oHttpd := hb_httpdReceiver( nPort, { | oRequest | ProcessRequest( oRequest ) } )

IF Empty( oHttpd )
MsgStop( "No se pudo iniciar el servidor en el puerto " + hb_ntos(nPort) )
ELSE
MsgInfo( "Servidor escuchando en http://localhost:" + hb_ntos(nPort) + "/callback" )
ENDIF
RETURN NIL

*---------------------------------------
STATIC FUNCTION ProcessRequest( oRequest )
*---------------------------------------

LOCAL cPath := oRequest:GetEnv( "PATH_INFO" )
LOCAL cResponse := ""

// Verificamos si la ruta es /callback
IF cPath == "/callback"
// Aquí procesas lo que llega (parámetros GET, POST, etc.)
cResponse := "<html><body><h1>Callback recibido con éxito</h1></body></html>"

// Ejemplo: registrar en log o mostrar mensaje en MiniGUI
// DoMethod( "Form_1", "StatusBar", "Item", 1, "Petición recibida en /callback" )
ELSE
cResponse := "<html><body><h1>404 - Ruta no encontrada</h1></body></html>"
ENDIF

// Enviamos la respuesta al cliente
oRequest:SendResponse( cResponse )
RETURN NIL]]>
<![CDATA[HMG General Help :: Re: Servidor en localhost :: Reply by serge_girard]]> 2026-05-04T09:19:59+00:00 2026-05-04T09:19:59+00:00 http://mail.hmgforum.com/viewtopic.php?f=5&t=7748&p=72256#p72256
hb_httpdReceiver

unknown function!

Is the API already working? Can you call the API from a browser?

Best option is to use CURL !

I use this command

Code: Select all

cBTW := 'BE12121212121' 
cUrl := "https://controleerbtwnummer.eu/api/validate/" + cBTW + ".json"
Then I send cURL with CURL and interpret result. Is it something like this you want?

Serge]]>

hb_httpdReceiver

unknown function!

Is the API already working? Can you call the API from a browser?

Best option is to use CURL !

I use this command

Code: Select all

cBTW := 'BE12121212121' 
cUrl := "https://controleerbtwnummer.eu/api/validate/" + cBTW + ".json"
Then I send cURL with CURL and interpret result. Is it something like this you want?

Serge]]>
<![CDATA[HMG General Help :: hmg HPDF :: Author serge_girard]]> 2026-05-18T13:59:22+00:00 2026-05-18T13:59:22+00:00 http://mail.hmgforum.com/viewtopic.php?f=5&t=7753&p=72295#p72295
Today I wanted to use an image in my PDF:

Code: Select all

@ 15,180   HPDFPRINT IMAGE cImage WIDTH 72  HEIGHT 430 TYPE PNG
I tried several syntaxis but all in vain!

and this now gives an error:
Error E0030 Syntax error "syntax error at '@'"

I used it many times before and now I won't compile....

Anybody an idea what's wrong suddenly?

Serge]]>

Today I wanted to use an image in my PDF:

Code: Select all

@ 15,180   HPDFPRINT IMAGE cImage WIDTH 72  HEIGHT 430 TYPE PNG
I tried several syntaxis but all in vain!

and this now gives an error:
Error E0030 Syntax error "syntax error at '@'"

I used it many times before and now I won't compile....

Anybody an idea what's wrong suddenly?

Serge]]>
<![CDATA[HMG General Help :: Re: hmg HPDF :: Reply by danielmaximiliano]]> 2026-05-18T22:15:02+00:00 2026-05-18T22:15:02+00:00 http://mail.hmgforum.com/viewtopic.php?f=5&t=7753&p=72296#p72296 Setproperty("main", xxxxx / getproperty("main", xxxx

Si estás usando sintaxis clásica
@ x, y xxxxxx
Main. Xxxxx. Xxxxx]]>
Setproperty("main", xxxxx / getproperty("main", xxxx

Si estás usando sintaxis clásica
@ x, y xxxxxx
Main. Xxxxx. Xxxxx]]>
<![CDATA[HMG General Help :: Re: hmg HPDF :: Reply by martingz]]> 2026-05-18T22:33:23+00:00 2026-05-18T22:33:23+00:00 http://mail.hmgforum.com/viewtopic.php?f=5&t=7753&p=72298#p72298 This code works well for me; I've tested it and it generates over 20,000 PDFs every 5 days.


@ 5,05 PRINT IMAGE "F:\SCA\LNCDLL\comapa.png" width 45 height 25
@ 5,180 PRINT IMAGE "F:\SCA\LNCDLL\Escudoa.png" width 25 height 25]]>
This code works well for me; I've tested it and it generates over 20,000 PDFs every 5 days.


@ 5,05 PRINT IMAGE "F:\SCA\LNCDLL\comapa.png" width 45 height 25
@ 5,180 PRINT IMAGE "F:\SCA\LNCDLL\Escudoa.png" width 25 height 25]]>
<![CDATA[HMG General Help :: Re: hmg HPDF :: Reply by serge_girard]]> 2026-05-19T06:47:50+00:00 2026-05-19T06:47:50+00:00 http://mail.hmgforum.com/viewtopic.php?f=5&t=7753&p=72299#p72299
Apparantly I had a wrong version of hmg_hpdf.ch:

Code: Select all

 
#xcommand @ <nRow> , <nCol> HPDFPRINT IMAGE <cImage> ;
	WIDTH <nWidth> ;
	HEIGHT <nheight> ;
	[ <stretch : STRETCH> ] ;
	=> ;
	_HMG_HPDF_IMAGE ( <cImage> , <nRow> , <nCol> , <nheight> , <nWidth> , <.stretch.> ) 
Now it is working fine.

S]]>

Apparantly I had a wrong version of hmg_hpdf.ch:

Code: Select all

 
#xcommand @ <nRow> , <nCol> HPDFPRINT IMAGE <cImage> ;
	WIDTH <nWidth> ;
	HEIGHT <nheight> ;
	[ <stretch : STRETCH> ] ;
	=> ;
	_HMG_HPDF_IMAGE ( <cImage> , <nRow> , <nCol> , <nheight> , <nWidth> , <.stretch.> ) 
Now it is working fine.

S]]>
<![CDATA[HMG Tutorials and Tips :: Re: User Components - IDE :: Reply by mol]]> 2026-04-26T05:19:04+00:00 2026-04-26T05:19:04+00:00 http://mail.hmgforum.com/viewtopic.php?f=6&t=5143&p=72239#p72239 <![CDATA[Harbour, MingW updates & releases :: GCC 16.1 Released :: Author gfilatov]]> 2026-05-04T14:07:43+00:00 2026-05-04T14:07:43+00:00 http://mail.hmgforum.com/viewtopic.php?f=7&t=7749&p=72258#p72258 rguenther@suse.de
Thu Apr 30 10:33:40 GMT 2026
The GCC developers are proud to announce a new major GCC release, 16.1.

This major release introduces several significant changes, including a shift
in the default C++ standard, the addition of a new language front-end, and
substantial improvements to diagnostic reporting.


The C++ frontend now defaults to the GNU C++20 dialect and the corresponding
parts of the standard library are no longer experimental. Several
C++26 features receive experimental support, including Reflection
(-freflection), Contracts, expansion statements and std::simd.

Support for C23 _BitInt has expanded to more targets, including
RISC-V, ARM, S/390 and LoongArch. The C frontend now supports
counted_by attribution of pointer fields.

The Fortran coarray implementation now supports using shared
memory multithreading on single node machines.

The GNU compiler welcomes support for the Algol68 language with an
experimental compiler frontend, ga68.

GCC diagnostics can now be output in HTML form and the SARIF output
was enhanced with new control flow features. The static analyzer
starts to be usable on small C++ examples.

Link-Time Optimization now supports better handling of toplevel asm
statements with -flto-toplevel-asm-heuristics. Support for
speculative devirtualization has been enhanced to handle general
indirect function calls and more than one speculative target.

Vectorization now supports vectorizing of uncounted loops and has more
robust and efficient handling of early exits and has improved handling
of reductions.

Note:
Some code that compiled successfully with older GCC versions might require
source changes.
8-)]]>
rguenther@suse.de
Thu Apr 30 10:33:40 GMT 2026
The GCC developers are proud to announce a new major GCC release, 16.1.

This major release introduces several significant changes, including a shift
in the default C++ standard, the addition of a new language front-end, and
substantial improvements to diagnostic reporting.


The C++ frontend now defaults to the GNU C++20 dialect and the corresponding
parts of the standard library are no longer experimental. Several
C++26 features receive experimental support, including Reflection
(-freflection), Contracts, expansion statements and std::simd.

Support for C23 _BitInt has expanded to more targets, including
RISC-V, ARM, S/390 and LoongArch. The C frontend now supports
counted_by attribution of pointer fields.

The Fortran coarray implementation now supports using shared
memory multithreading on single node machines.

The GNU compiler welcomes support for the Algol68 language with an
experimental compiler frontend, ga68.

GCC diagnostics can now be output in HTML form and the SARIF output
was enhanced with new control flow features. The static analyzer
starts to be usable on small C++ examples.

Link-Time Optimization now supports better handling of toplevel asm
statements with -flto-toplevel-asm-heuristics. Support for
speculative devirtualization has been enhanced to handle general
indirect function calls and more than one speculative target.

Vectorization now supports vectorizing of uncounted loops and has more
robust and efficient handling of early exits and has improved handling
of reductions.

Note:
Some code that compiled successfully with older GCC versions might require
source changes.
8-)]]>
<![CDATA[Harbour, MingW updates & releases :: Re: GCC 16.1 Released :: Reply by gfilatov]]> 2026-05-04T14:54:21+00:00 2026-05-04T14:54:21+00:00 http://mail.hmgforum.com/viewtopic.php?f=7&t=7749&p=72259#p72259 Harbour 3.2.0dev (r2602281433) (MT) MinGW GNU C 16.1 (64-bit) x86-64
THREADS: 0
N_LOOPS: 1000000
[ T000: empty loop overhead ]...................................0.02
====================================================================
[ T001: x := L_C ]..............................................0.00
[ T002: x := L_N ]..............................................0.00
[ T003: x := L_D ]..............................................0.00
[ T004: x := S_C ]..............................................0.02
[ T005: x := S_N ]..............................................0.00
[ T006: x := S_D ]..............................................0.00
[ T007: x := M->M_C ]...........................................0.02
[ T008: x := M->M_N ]...........................................0.00
[ T009: x := M->M_D ]...........................................0.02
[ T010: x := M->P_C ]...........................................0.02
[ T011: x := M->P_N ]...........................................0.00
[ T012: x := M->P_D ]...........................................0.02
[ T013: x := F_C ]..............................................0.00
[ T014: x := F_N ]..............................................0.02
[ T015: x := F_D ]..............................................0.00
[ T016: x := o:Args ]...........................................0.05
[ T017: x := o[ 2 ] ]...........................................0.03
[ T018: Round( i / 1000, 2 ) ]..................................0.05
[ T019: Str( i / 1000 ) ].......................................0.19
[ T020: Val( s ) ]..............................................0.05
[ T021: Val( a [ i % 16 + 1 ] ) ]...............................0.05
[ T022: DToS( d - i % 10000 ) ].................................0.06
[ T023: Eval( {|| i % 16 } ) ]..................................0.09
[ T024: Eval( bc := {|| i % 16 } ) ]............................0.03
[ T025: Eval( {| x | x % 16 }, i ) ]............................0.08
[ T026: Eval( bc := {| x | x % 16 }, i ) ]......................0.03
[ T027: Eval( {| x | f1( x ) }, i ) ]...........................0.08
[ T028: Eval( bc := {| x | f1( x ) }, i ) ].....................0.05
[ T029: Eval( bc := &( "{| x | f1( x ) }" ), i ) ]..............0.06
[ T030: x := &( "f1(" + Str( i ) + ")" ) ]......................0.44
[ T031: bc := &( "{| x | f1( x ) }" ), Eval( bc, i ) ]..........0.55
[ T032: x := ValType( x ) + ValType( i ) ]......................0.08
[ T033: x := StrZero( i % 100, 2 ) $ a[ i % 16 + 1 ] ]..........0.14
[ T034: x := a[ i % 16 + 1 ] == s ].............................0.05
[ T035: x := a[ i % 16 + 1 ] = s ]..............................0.05
[ T036: x := a[ i % 16 + 1 ] >= s ].............................0.06
[ T037: x := a[ i % 16 + 1 ] <= s ].............................0.05
[ T038: x := a[ i % 16 + 1 ] < s ]..............................0.05
[ T039: x := a[ i % 16 + 1 ] > s ]..............................0.06
[ T040: AScan( a, i % 16 ) ]....................................0.06
[ T041: AScan( a, {| x | x == i % 16 } ) ]......................0.53
[ T042: iif( i % 1000 == 0, a := {}, ), AAdd(a,{i,1,.T.,s, ]....0.17
[ T043: x := a ]................................................0.02
[ T044: x := {} ]...............................................0.03
[ T045: f0() ]..................................................0.00
[ T046: f1( i ) ]...............................................0.02
[ T047: f2( c[1...8] ) ]........................................0.02
[ T048: f2( c[1...40000] ) ]....................................0.03
[ T049: f2( @c[1...40000] ) ]...................................0.00
[ T050: f2( @c[1...40000] ), c2 := c ]..........................0.03
[ T051: f3( a, a2, s, i, s2, bc, i, n, x ) ]....................0.06
[ T052: f2( a ) ]...............................................0.02
[ T053: x := f4() ].............................................0.08
[ T054: x := f5() ].............................................0.06
[ T055: x := Space( 16 ) ]......................................0.03
[ T056: f_prv( c ) ]............................................0.11
====================================================================
[ total application time: ].....................................4.66
[ total real time: ]............................................4.69

2026-05-04 16:30:27 Windows 11 or newer 10.0.26200
Harbour 3.2.0dev (r2602281433) (MT)+ MinGW GNU C 16.1 (64-bit) x86-64
THREADS: all->56
N_LOOPS: 1000000
[ T000: empty loop overhead ]...................................0.02
====================================================================
[ T001: x := L_C ]..............................................0.08
[ T002: x := L_N ]..............................................0.08
[ T003: x := L_D ]..............................................0.83
[ T004: x := S_C ]..............................................0.17
[ T005: x := S_N ]..............................................0.05
[ T006: x := S_D ]..............................................0.22
[ T007: x := M->M_C ]...........................................0.44
[ T008: x := M->M_N ]...........................................0.44
[ T009: x := M->M_D ]...........................................0.44
[ T010: x := M->P_C ]...........................................0.69
[ T011: x := M->P_N ]...........................................2.88
[ T012: x := M->P_D ]...........................................2.88
[ T013: x := F_C ]..............................................2.28
[ T014: x := F_N ]..............................................0.14
[ T015: x := F_D ]..............................................0.14
[ T016: x := o:Args ]...........................................1.56
[ T017: x := o[ 2 ] ]...........................................2.27
[ T018: Round( i / 1000, 2 ) ]..................................2.95
[ T019: Str( i / 1000 ) ].......................................4.86
[ T020: Val( s ) ]..............................................1.84
[ T021: Val( a [ i % 16 + 1 ] ) ]...............................2.27
[ T022: DToS( d - i % 10000 ) ].................................1.47
[ T023: Eval( {|| i % 16 } ) ].................................20.78
[ T024: Eval( bc := {|| i % 16 } ) ]............................1.95
[ T025: Eval( {| x | x % 16 }, i ) ]...........................21.02
[ T026: Eval( bc := {| x | x % 16 }, i ) ]......................2.17
[ T027: Eval( {| x | f1( x ) }, i ) ]..........................20.69
[ T028: Eval( bc := {| x | f1( x ) }, i ) ].....................2.17
[ T029: Eval( bc := &( "{| x | f1( x ) }" ), i ) ]..............1.52
[ T030: x := &( "f1(" + Str( i ) + ")" ) ]......................7.47
[ T031: bc := &( "{| x | f1( x ) }" ), Eval( bc, i ) ].........22.44
[ T032: x := ValType( x ) + ValType( i ) ]......................2.91
[ T033: x := StrZero( i % 100, 2 ) $ a[ i % 16 + 1 ] ]..........5.95
[ T034: x := a[ i % 16 + 1 ] == s ].............................1.63
[ T035: x := a[ i % 16 + 1 ] = s ]..............................1.31
[ T036: x := a[ i % 16 + 1 ] >= s ].............................1.31
[ T037: x := a[ i % 16 + 1 ] <= s ].............................1.63
[ T038: x := a[ i % 16 + 1 ] < s ]..............................3.11
[ T039: x := a[ i % 16 + 1 ] > s ]..............................3.31
[ T040: AScan( a, i % 16 ) ]....................................2.41
[ T041: AScan( a, {| x | x == i % 16 } ) ].....................22.86
[ T042: iif( i % 1000 == 0, a := {}, ), AAdd(a,{i,1,.T.,s, ]...21.64
[ T043: x := a ]................................................0.64
[ T044: x := {} ]..............................................19.53
[ T045: f0() ]..................................................0.64
[ T046: f1( i ) ]...............................................1.03
[ T047: f2( c[1...8] ) ]........................................0.83
[ T048: f2( c[1...40000] ) ]....................................1.11
[ T049: f2( @c[1...40000] ) ]...................................0.38
[ T050: f2( @c[1...40000] ), c2 := c ]..........................1.58
[ T051: f3( a, a2, s, i, s2, bc, i, n, x ) ]....................2.20
[ T052: f2( a ) ]...............................................1.34
[ T053: x := f4() ].............................................2.27
[ T054: x := f5() ].............................................2.53
[ T055: x := Space( 16 ) ]......................................1.28
[ T056: f_prv( c ) ]............................................2.84
====================================================================
[ total application time: ]....................................23.19
[ total real time: ]............................................3.24]]>
Harbour 3.2.0dev (r2602281433) (MT) MinGW GNU C 16.1 (64-bit) x86-64
THREADS: 0
N_LOOPS: 1000000
[ T000: empty loop overhead ]...................................0.02
====================================================================
[ T001: x := L_C ]..............................................0.00
[ T002: x := L_N ]..............................................0.00
[ T003: x := L_D ]..............................................0.00
[ T004: x := S_C ]..............................................0.02
[ T005: x := S_N ]..............................................0.00
[ T006: x := S_D ]..............................................0.00
[ T007: x := M->M_C ]...........................................0.02
[ T008: x := M->M_N ]...........................................0.00
[ T009: x := M->M_D ]...........................................0.02
[ T010: x := M->P_C ]...........................................0.02
[ T011: x := M->P_N ]...........................................0.00
[ T012: x := M->P_D ]...........................................0.02
[ T013: x := F_C ]..............................................0.00
[ T014: x := F_N ]..............................................0.02
[ T015: x := F_D ]..............................................0.00
[ T016: x := o:Args ]...........................................0.05
[ T017: x := o[ 2 ] ]...........................................0.03
[ T018: Round( i / 1000, 2 ) ]..................................0.05
[ T019: Str( i / 1000 ) ].......................................0.19
[ T020: Val( s ) ]..............................................0.05
[ T021: Val( a [ i % 16 + 1 ] ) ]...............................0.05
[ T022: DToS( d - i % 10000 ) ].................................0.06
[ T023: Eval( {|| i % 16 } ) ]..................................0.09
[ T024: Eval( bc := {|| i % 16 } ) ]............................0.03
[ T025: Eval( {| x | x % 16 }, i ) ]............................0.08
[ T026: Eval( bc := {| x | x % 16 }, i ) ]......................0.03
[ T027: Eval( {| x | f1( x ) }, i ) ]...........................0.08
[ T028: Eval( bc := {| x | f1( x ) }, i ) ].....................0.05
[ T029: Eval( bc := &( "{| x | f1( x ) }" ), i ) ]..............0.06
[ T030: x := &( "f1(" + Str( i ) + ")" ) ]......................0.44
[ T031: bc := &( "{| x | f1( x ) }" ), Eval( bc, i ) ]..........0.55
[ T032: x := ValType( x ) + ValType( i ) ]......................0.08
[ T033: x := StrZero( i % 100, 2 ) $ a[ i % 16 + 1 ] ]..........0.14
[ T034: x := a[ i % 16 + 1 ] == s ].............................0.05
[ T035: x := a[ i % 16 + 1 ] = s ]..............................0.05
[ T036: x := a[ i % 16 + 1 ] >= s ].............................0.06
[ T037: x := a[ i % 16 + 1 ] <= s ].............................0.05
[ T038: x := a[ i % 16 + 1 ] < s ]..............................0.05
[ T039: x := a[ i % 16 + 1 ] > s ]..............................0.06
[ T040: AScan( a, i % 16 ) ]....................................0.06
[ T041: AScan( a, {| x | x == i % 16 } ) ]......................0.53
[ T042: iif( i % 1000 == 0, a := {}, ), AAdd(a,{i,1,.T.,s, ]....0.17
[ T043: x := a ]................................................0.02
[ T044: x := {} ]...............................................0.03
[ T045: f0() ]..................................................0.00
[ T046: f1( i ) ]...............................................0.02
[ T047: f2( c[1...8] ) ]........................................0.02
[ T048: f2( c[1...40000] ) ]....................................0.03
[ T049: f2( @c[1...40000] ) ]...................................0.00
[ T050: f2( @c[1...40000] ), c2 := c ]..........................0.03
[ T051: f3( a, a2, s, i, s2, bc, i, n, x ) ]....................0.06
[ T052: f2( a ) ]...............................................0.02
[ T053: x := f4() ].............................................0.08
[ T054: x := f5() ].............................................0.06
[ T055: x := Space( 16 ) ]......................................0.03
[ T056: f_prv( c ) ]............................................0.11
====================================================================
[ total application time: ].....................................4.66
[ total real time: ]............................................4.69

2026-05-04 16:30:27 Windows 11 or newer 10.0.26200
Harbour 3.2.0dev (r2602281433) (MT)+ MinGW GNU C 16.1 (64-bit) x86-64
THREADS: all->56
N_LOOPS: 1000000
[ T000: empty loop overhead ]...................................0.02
====================================================================
[ T001: x := L_C ]..............................................0.08
[ T002: x := L_N ]..............................................0.08
[ T003: x := L_D ]..............................................0.83
[ T004: x := S_C ]..............................................0.17
[ T005: x := S_N ]..............................................0.05
[ T006: x := S_D ]..............................................0.22
[ T007: x := M->M_C ]...........................................0.44
[ T008: x := M->M_N ]...........................................0.44
[ T009: x := M->M_D ]...........................................0.44
[ T010: x := M->P_C ]...........................................0.69
[ T011: x := M->P_N ]...........................................2.88
[ T012: x := M->P_D ]...........................................2.88
[ T013: x := F_C ]..............................................2.28
[ T014: x := F_N ]..............................................0.14
[ T015: x := F_D ]..............................................0.14
[ T016: x := o:Args ]...........................................1.56
[ T017: x := o[ 2 ] ]...........................................2.27
[ T018: Round( i / 1000, 2 ) ]..................................2.95
[ T019: Str( i / 1000 ) ].......................................4.86
[ T020: Val( s ) ]..............................................1.84
[ T021: Val( a [ i % 16 + 1 ] ) ]...............................2.27
[ T022: DToS( d - i % 10000 ) ].................................1.47
[ T023: Eval( {|| i % 16 } ) ].................................20.78
[ T024: Eval( bc := {|| i % 16 } ) ]............................1.95
[ T025: Eval( {| x | x % 16 }, i ) ]...........................21.02
[ T026: Eval( bc := {| x | x % 16 }, i ) ]......................2.17
[ T027: Eval( {| x | f1( x ) }, i ) ]..........................20.69
[ T028: Eval( bc := {| x | f1( x ) }, i ) ].....................2.17
[ T029: Eval( bc := &( "{| x | f1( x ) }" ), i ) ]..............1.52
[ T030: x := &( "f1(" + Str( i ) + ")" ) ]......................7.47
[ T031: bc := &( "{| x | f1( x ) }" ), Eval( bc, i ) ].........22.44
[ T032: x := ValType( x ) + ValType( i ) ]......................2.91
[ T033: x := StrZero( i % 100, 2 ) $ a[ i % 16 + 1 ] ]..........5.95
[ T034: x := a[ i % 16 + 1 ] == s ].............................1.63
[ T035: x := a[ i % 16 + 1 ] = s ]..............................1.31
[ T036: x := a[ i % 16 + 1 ] >= s ].............................1.31
[ T037: x := a[ i % 16 + 1 ] <= s ].............................1.63
[ T038: x := a[ i % 16 + 1 ] < s ]..............................3.11
[ T039: x := a[ i % 16 + 1 ] > s ]..............................3.31
[ T040: AScan( a, i % 16 ) ]....................................2.41
[ T041: AScan( a, {| x | x == i % 16 } ) ].....................22.86
[ T042: iif( i % 1000 == 0, a := {}, ), AAdd(a,{i,1,.T.,s, ]...21.64
[ T043: x := a ]................................................0.64
[ T044: x := {} ]..............................................19.53
[ T045: f0() ]..................................................0.64
[ T046: f1( i ) ]...............................................1.03
[ T047: f2( c[1...8] ) ]........................................0.83
[ T048: f2( c[1...40000] ) ]....................................1.11
[ T049: f2( @c[1...40000] ) ]...................................0.38
[ T050: f2( @c[1...40000] ), c2 := c ]..........................1.58
[ T051: f3( a, a2, s, i, s2, bc, i, n, x ) ]....................2.20
[ T052: f2( a ) ]...............................................1.34
[ T053: x := f4() ].............................................2.27
[ T054: x := f5() ].............................................2.53
[ T055: x := Space( 16 ) ]......................................1.28
[ T056: f_prv( c ) ]............................................2.84
====================================================================
[ total application time: ]....................................23.19
[ total real time: ]............................................3.24]]>
<![CDATA[Harbour, MingW updates & releases :: Re: GCC 16.1 Released :: Reply by serge_girard]]> 2026-05-04T17:42:33+00:00 2026-05-04T17:42:33+00:00 http://mail.hmgforum.com/viewtopic.php?f=7&t=7749&p=72260#p72260 <![CDATA[Harbour, MingW updates & releases :: Re: GCC 16.1 Released :: Reply by ASESORMIX]]> 2026-05-04T19:16:39+00:00 2026-05-04T19:16:39+00:00 http://mail.hmgforum.com/viewtopic.php?f=7&t=7749&p=72261#p72261 <![CDATA[General :: Re: Error de compilación :: Reply by serge_girard]]> 2026-04-23T05:47:22+00:00 2026-04-23T05:47:22+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7744&p=72231#p72231 https://hmgforum.com/viewtopic.php?p=71649#p71649
https://hmgforum.com/viewtopic.php?p=71584#p71584
https://hmgforum.com/viewtopic.php?p=71515#p71515
https://hmgforum.com/viewtopic.php?p=71486#p71486]]>
https://hmgforum.com/viewtopic.php?p=71649#p71649
https://hmgforum.com/viewtopic.php?p=71584#p71584
https://hmgforum.com/viewtopic.php?p=71515#p71515
https://hmgforum.com/viewtopic.php?p=71486#p71486]]>
<![CDATA[General :: Pasar una tabla de ESMWIN a UTF8 :: Author mjaviergutierrez]]> 2026-04-25T21:27:34+00:00 2026-04-25T21:27:34+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7747&p=72237#p72237 Estoy renegando hace unos días ... , buscando en el foro ... , pero no doy pie con bola, tengo muchas tablas con gran cantidad de registros en un sistema que estaba en HMG.3.0.46 y la codificación de la página de las tablas aparentemente es ESMWIN (español moderno), tengo que pasarlas a nuevas tablas con la codificación unicode UTF8, para que me traiga las eñes, los acentos, etc. y poder usarlas en un proyecto de HMG.3.5 UNICODE.
Probé varias opciones, pero no hay caso, no creo que sea tan difícil, solo que yo no me estoy dando cuenta, si alguien le paso y me puede tirar una idea se los agradezco. Saludos !]]>
Estoy renegando hace unos días ... , buscando en el foro ... , pero no doy pie con bola, tengo muchas tablas con gran cantidad de registros en un sistema que estaba en HMG.3.0.46 y la codificación de la página de las tablas aparentemente es ESMWIN (español moderno), tengo que pasarlas a nuevas tablas con la codificación unicode UTF8, para que me traiga las eñes, los acentos, etc. y poder usarlas en un proyecto de HMG.3.5 UNICODE.
Probé varias opciones, pero no hay caso, no creo que sea tan difícil, solo que yo no me estoy dando cuenta, si alguien le paso y me puede tirar una idea se los agradezco. Saludos !]]>
<![CDATA[General :: Re: Pasar una tabla de ESMWIN a UTF8 :: Reply by danielmaximiliano]]> 2026-04-26T00:08:11+00:00 2026-04-26T00:08:11+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7747&p=72238#p72238
Si tus archivos fuente o tus tablas tienen datos en ANSI (Windows-1252), debes convertirlos a UTF-8.

Para el código fuente (.prg): Ábrelos con un editor como VS Code o Notepad++ y selecciona "Guardar como..." con codificación UTF-8 (sin BOM).

Para las tablas (.dbf): Necesitarás un script de transición.

2. Funciones de Conversión en Harbour

Harbour tiene funciones nativas para mover strings entre diferentes codificaciones. Las más importantes para tu caso son:
Función Propósito
HB_AnsiToUtf8( cString ) Convierte una cadena de ANSI (tu formato actual) a UTF-8.
HB_Utf8ToAnsi( cString ) El proceso inverso.
HB_CDPSELECT( "UTF8" ) Establece la página de códigos activa en el sistema.

3. Ejemplo de Script de Migración

Para pasar tus tablas viejas a las nuevas, lo ideal es crear un pequeño programa intermedio que haga el "puente":

Code: Select all

// Configuración inicial
REQUEST HB_CODEPAGE_ESWIN
REQUEST HB_CODEPAGE_UTF8
hb_cdpSelect( "ESWIN" ) // Primero leemos como español moderno

USE tabla_vieja.dbf SHARED NEW
COPY STRUCTURE TO tabla_nueva.dbf // La nueva estructura

USE tabla_nueva.dbf EXCLUSIVE NEW
SELECT tabla_vieja

DO WHILE !EOF()
    SELECT tabla_nueva
    APPEND BLANK
    
    // Convertimos campo por campo (ejemplo con un campo 'Nombre')
    REPLACE Nombre WITH HB_AnsiToUtf8( tabla_vieja->Nombre )
    
    SELECT tabla_vieja
    SKIP
ENDDO
4. Configuración en HMG 3.6 Unicode

Para que HMG reconozca que todo el entorno debe trabajar en Unicode, asegúrate de incluir esto en tu función Main:

SET CODEPAGE TO UNICODE: Esto le indica a HMG que los controles (TextBox, Grids, etc.) deben renderizar strings en UTF-8.

SET LANGUAGE TO SPANISH: Ajusta los mensajes internos del sistema.

[!IMPORTANT]
Cuidado con el tamaño de los campos: Recuerda que en UTF-8, caracteres como la ñ o las tildes pueden ocupar 2 bytes en lugar de 1. Si tienes un campo C(1) para un caracter especial, podrías necesitar ampliarlo a C(2) o más para evitar cortes de datos.]]>

Si tus archivos fuente o tus tablas tienen datos en ANSI (Windows-1252), debes convertirlos a UTF-8.

Para el código fuente (.prg): Ábrelos con un editor como VS Code o Notepad++ y selecciona "Guardar como..." con codificación UTF-8 (sin BOM).

Para las tablas (.dbf): Necesitarás un script de transición.

2. Funciones de Conversión en Harbour

Harbour tiene funciones nativas para mover strings entre diferentes codificaciones. Las más importantes para tu caso son:
Función Propósito
HB_AnsiToUtf8( cString ) Convierte una cadena de ANSI (tu formato actual) a UTF-8.
HB_Utf8ToAnsi( cString ) El proceso inverso.
HB_CDPSELECT( "UTF8" ) Establece la página de códigos activa en el sistema.

3. Ejemplo de Script de Migración

Para pasar tus tablas viejas a las nuevas, lo ideal es crear un pequeño programa intermedio que haga el "puente":

Code: Select all

// Configuración inicial
REQUEST HB_CODEPAGE_ESWIN
REQUEST HB_CODEPAGE_UTF8
hb_cdpSelect( "ESWIN" ) // Primero leemos como español moderno

USE tabla_vieja.dbf SHARED NEW
COPY STRUCTURE TO tabla_nueva.dbf // La nueva estructura

USE tabla_nueva.dbf EXCLUSIVE NEW
SELECT tabla_vieja

DO WHILE !EOF()
    SELECT tabla_nueva
    APPEND BLANK
    
    // Convertimos campo por campo (ejemplo con un campo 'Nombre')
    REPLACE Nombre WITH HB_AnsiToUtf8( tabla_vieja->Nombre )
    
    SELECT tabla_vieja
    SKIP
ENDDO
4. Configuración en HMG 3.6 Unicode

Para que HMG reconozca que todo el entorno debe trabajar en Unicode, asegúrate de incluir esto en tu función Main:

SET CODEPAGE TO UNICODE: Esto le indica a HMG que los controles (TextBox, Grids, etc.) deben renderizar strings en UTF-8.

SET LANGUAGE TO SPANISH: Ajusta los mensajes internos del sistema.

[!IMPORTANT]
Cuidado con el tamaño de los campos: Recuerda que en UTF-8, caracteres como la ñ o las tildes pueden ocupar 2 bytes en lugar de 1. Si tienes un campo C(1) para un caracter especial, podrías necesitar ampliarlo a C(2) o más para evitar cortes de datos.]]>
<![CDATA[General :: Re: Pasar una tabla de ESMWIN a UTF8 :: Reply by mjaviergutierrez]]> 2026-04-28T23:25:45+00:00 2026-04-28T23:25:45+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7747&p=72244#p72244 Muy clara tu explicación, yo siempre estuve enredado con ANSI, UNICODE, UTF8, etc etc
El programa para actualizar los datos de las tablas viejas a UTF8 , lo entendí perfecto pero no puedo resolver por que me dice que falta la función HB_AnsiIToUTF8( ) , le di vueltas por todo lados y no pude resolver. Compilando con HMG.3.5 como con HMG.3.6 , seguro me falta alguna actualización o librería ... y por ende, no me compila el proyecto.]]>
Muy clara tu explicación, yo siempre estuve enredado con ANSI, UNICODE, UTF8, etc etc
El programa para actualizar los datos de las tablas viejas a UTF8 , lo entendí perfecto pero no puedo resolver por que me dice que falta la función HB_AnsiIToUTF8( ) , le di vueltas por todo lados y no pude resolver. Compilando con HMG.3.5 como con HMG.3.6 , seguro me falta alguna actualización o librería ... y por ende, no me compila el proyecto.]]>
<![CDATA[General :: Re: Pasar una tabla de ESMWIN a UTF8 :: Reply by danielmaximiliano]]> 2026-04-29T02:09:06+00:00 2026-04-29T02:09:06+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7747&p=72245#p72245 <![CDATA[General :: Re: Pasar una tabla de ESMWIN a UTF8 :: Reply by mjaviergutierrez]]> 2026-04-29T12:40:51+00:00 2026-04-29T12:40:51+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7747&p=72247#p72247 <![CDATA[General :: Re: Pasar una tabla de ESMWIN a UTF8 :: Reply by mjaviergutierrez]]> 2026-04-29T16:27:51+00:00 2026-04-29T16:27:51+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7747&p=72248#p72248 Dejo el código por si alguien le sirve.
Muchas Gracias DanielMaximiliano por tu ayuda.

Saludos.

SET CODEPAGE TO UNICODE
SET LANGUAGE TO SPANISH

REQUEST HB_CODEPAGE_ESWIN
REQUEST HB_CODEPAGE_UTF8

USE &cNombreAuxiliar New Exclusive Alias OldTable
USE &cNombreTabla New Exclusive Alias NewTable

While OldTable->( .not. EOF( ) )

NewTable->( dbAppend( ) )
For i:=1 To OldTable->( FCount( ) )

If ValType( OldTable->( FieldGet( i ) ) )=="C"
NewTable->( FieldPut( i, HB_Translate( OldTable->( FieldGet( i ) ),'ESWIN' ,'UTF8' ) ) )
Else
NewTable->( FieldPut( i, OldTable->( FieldGet( i ) ) ) )
EndIf

Next i

OldTable->( dbskip( ) )

End While

OldTable->( dbCloseArea( ) )
NewTable->( dbCloseArea( ) )]]>
Dejo el código por si alguien le sirve.
Muchas Gracias DanielMaximiliano por tu ayuda.

Saludos.

SET CODEPAGE TO UNICODE
SET LANGUAGE TO SPANISH

REQUEST HB_CODEPAGE_ESWIN
REQUEST HB_CODEPAGE_UTF8

USE &cNombreAuxiliar New Exclusive Alias OldTable
USE &cNombreTabla New Exclusive Alias NewTable

While OldTable->( .not. EOF( ) )

NewTable->( dbAppend( ) )
For i:=1 To OldTable->( FCount( ) )

If ValType( OldTable->( FieldGet( i ) ) )=="C"
NewTable->( FieldPut( i, HB_Translate( OldTable->( FieldGet( i ) ),'ESWIN' ,'UTF8' ) ) )
Else
NewTable->( FieldPut( i, OldTable->( FieldGet( i ) ) ) )
EndIf

Next i

OldTable->( dbskip( ) )

End While

OldTable->( dbCloseArea( ) )
NewTable->( dbCloseArea( ) )]]>
<![CDATA[General :: Re: Pasar una tabla de ESMWIN a UTF8 :: Reply by danielmaximiliano]]> 2026-04-29T17:35:49+00:00 2026-04-29T17:35:49+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7747&p=72249#p72249 <![CDATA[General :: how to identify when App was start as Aministator ? :: Author AUGE_OHR]]> 2026-05-07T18:36:14+00:00 2026-05-07T18:36:14+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7751&p=72272#p72272
how can i identify when App was start as Administrator ?]]>

how can i identify when App was start as Administrator ?]]>
<![CDATA[General :: Re: how to identify when App was start as Aministator ? :: Reply by serge_girard]]> 2026-05-07T21:17:00+00:00 2026-05-07T21:17:00+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7751&p=72273#p72273 <![CDATA[General :: Re: how to identify when App was start as Aministator ? :: Reply by danielmaximiliano]]> 2026-05-08T04:33:53+00:00 2026-05-08T04:33:53+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7751&p=72274#p72274
AUGE_OHR wrote: Thu May 07, 2026 6:36 pm hi,

how can i identify when App was start as Administrator ?
//=============================================================================
// Averigua si OTRA aplicación (por su PID) tiene privilegios de Administrador
// Uso: IsProcessAdmin( nPID ) -> Retorna .T. o .F.
//=============================================================================
FUNCTION IsProcessAdmin( nPID )
LOCAL lIsAdmin := .F.

IF ValType( nPID ) == "N" .AND. nPID > 0
lIsAdmin := HW_IsProcessAdmin( nPID )
ENDIF
RETURN lIsAdmin

o

LOCAL nPID := 0

// Supongamos que lanzás el ejecutable del usuario de forma asíncrona
nPID := EXECUTE FILE "MiProyectoCompilado.exe" ... // (O la función que uses para lanzar)

IF nPID > 0
// Le damos un milisegundo a Windows para que asiente el proceso
hb_idleSleep( 0.05 )

IF IsProcessAdmin( nPID )
ConsoleLog("IDE DETECT: El programa del usuario se inició con permisos de Administrador.", "WARNING")
ELSE
ConsoleLog("IDE DETECT: El programa del usuario se inició con permisos estándar.", "INFO")
ENDIF
ENDIF

#pragma BEGINDUMP

#include <windows.h>
#include "hbapi.h"

HB_FUNC( HW_ISPROCESSADMIN )
{
DWORD dwPID = (DWORD) hb_parnl(1);
HANDLE hProcess = NULL;
HANDLE hToken = NULL;
BOOL bIsAdmin = FALSE;

// 1. Abrimos el proceso con permisos de consulta de información
hProcess = OpenProcess( PROCESS_QUERY_LIMITED_INFORMATION, FALSE, dwPID );

if ( hProcess == NULL )
{
// Si falla, intentamos con el acceso de consulta común por si las dudas
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, dwPID );
}

if ( hProcess != NULL )
{
// 2. Abrimos el Token de acceso de ese proceso
if ( OpenProcessToken( hProcess, TOKEN_QUERY, &hToken ) )
{
TOKEN_ELEVATION elevation;
DWORD cbSize = sizeof( TOKEN_ELEVATION );

// 3. Le preguntamos a Windows si ese Token está "Elevado" (Admin)
if ( GetTokenInformation( hToken, TokenElevation, &elevation, sizeof(elevation), &cbSize ) )
{
bIsAdmin = elevation.TokenIsElevated;
}
CloseHandle( hToken );
}
CloseHandle( hProcess );
}

hb_retl( bIsAdmin );
}

#pragma ENDDUMP]]>
AUGE_OHR wrote: Thu May 07, 2026 6:36 pm hi,

how can i identify when App was start as Administrator ?
//=============================================================================
// Averigua si OTRA aplicación (por su PID) tiene privilegios de Administrador
// Uso: IsProcessAdmin( nPID ) -> Retorna .T. o .F.
//=============================================================================
FUNCTION IsProcessAdmin( nPID )
LOCAL lIsAdmin := .F.

IF ValType( nPID ) == "N" .AND. nPID > 0
lIsAdmin := HW_IsProcessAdmin( nPID )
ENDIF
RETURN lIsAdmin

o

LOCAL nPID := 0

// Supongamos que lanzás el ejecutable del usuario de forma asíncrona
nPID := EXECUTE FILE "MiProyectoCompilado.exe" ... // (O la función que uses para lanzar)

IF nPID > 0
// Le damos un milisegundo a Windows para que asiente el proceso
hb_idleSleep( 0.05 )

IF IsProcessAdmin( nPID )
ConsoleLog("IDE DETECT: El programa del usuario se inició con permisos de Administrador.", "WARNING")
ELSE
ConsoleLog("IDE DETECT: El programa del usuario se inició con permisos estándar.", "INFO")
ENDIF
ENDIF

#pragma BEGINDUMP

#include <windows.h>
#include "hbapi.h"

HB_FUNC( HW_ISPROCESSADMIN )
{
DWORD dwPID = (DWORD) hb_parnl(1);
HANDLE hProcess = NULL;
HANDLE hToken = NULL;
BOOL bIsAdmin = FALSE;

// 1. Abrimos el proceso con permisos de consulta de información
hProcess = OpenProcess( PROCESS_QUERY_LIMITED_INFORMATION, FALSE, dwPID );

if ( hProcess == NULL )
{
// Si falla, intentamos con el acceso de consulta común por si las dudas
hProcess = OpenProcess( PROCESS_QUERY_INFORMATION, FALSE, dwPID );
}

if ( hProcess != NULL )
{
// 2. Abrimos el Token de acceso de ese proceso
if ( OpenProcessToken( hProcess, TOKEN_QUERY, &hToken ) )
{
TOKEN_ELEVATION elevation;
DWORD cbSize = sizeof( TOKEN_ELEVATION );

// 3. Le preguntamos a Windows si ese Token está "Elevado" (Admin)
if ( GetTokenInformation( hToken, TokenElevation, &elevation, sizeof(elevation), &cbSize ) )
{
bIsAdmin = elevation.TokenIsElevated;
}
CloseHandle( hToken );
}
CloseHandle( hProcess );
}

hb_retl( bIsAdmin );
}

#pragma ENDDUMP]]>
<![CDATA[General :: Re: how to identify when App was start as Aministator ? :: Reply by AUGE_OHR]]> 2026-05-08T10:11:00+00:00 2026-05-08T10:11:00+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7751&p=72275#p72275
another Solution :

Code: Select all

#include <hmg.ch>

PROCEDURE MAIN
   
PRIVATE lIsAdmin := wapi_IsUserAnAdmin()
   
IF .Not. lIsAdmin .AND. MsgYesNo ( "The application does not run in administrator mode, do you want to run it as an administrator?", "Run As Administrator" )
   RunApiAsAdministrator()
   RETURN
ENDIF

Msgdebug ( "Does the application run in administrator mode?" , lIsAdmin )
  
/* rest of prg */

RETURN


Function RunApiAsAdministrator()
ShellExecuteEx( wapi_GetActiveWindow(), 'runas', hb_ProgName(), , , SW_SHOWNORMAL )
Return Nil

#pragma BEGINDUMP

#include "SET_COMPILE_HMG_UNICODE.ch"
#include "HMG_UNICODE.h"

#include <windows.h>
#include <hbapi.h>
#include <shlobj.h>

HB_FUNC( SHELLEXECUTEEX )
{
    SHELLEXECUTEINFO SHExecInfo;
    ZeroMemory(&SHExecInfo, sizeof(SHExecInfo));

    SHExecInfo.cbSize       = sizeof(SHExecInfo);
    SHExecInfo.fMask        = SEE_MASK_NOCLOSEPROCESS;
    SHExecInfo.hwnd         = HB_ISNIL( 1 ) ? GetActiveWindow() : (HWND) HMG_parnl( 1 );
    SHExecInfo.lpVerb       = (LPCSTR) HMG_parc( 2 );
    SHExecInfo.lpFile       = (LPCSTR) HMG_parc( 3 );
    SHExecInfo.lpParameters = (LPCSTR) HMG_parc( 4 );
    SHExecInfo.lpDirectory  = (LPCSTR) HMG_parc( 5 );
    SHExecInfo.nShow        = hb_parni( 6 );
    
    if( ShellExecuteEx(&SHExecInfo) )
    {
        // hb_retnl( (LONG) SHExecInfo.hProcess );
        CloseHandle(SHExecInfo.hProcess);
    }
}
#pragma ENDDUMP
]]>

another Solution :

Code: Select all

#include <hmg.ch>

PROCEDURE MAIN
   
PRIVATE lIsAdmin := wapi_IsUserAnAdmin()
   
IF .Not. lIsAdmin .AND. MsgYesNo ( "The application does not run in administrator mode, do you want to run it as an administrator?", "Run As Administrator" )
   RunApiAsAdministrator()
   RETURN
ENDIF

Msgdebug ( "Does the application run in administrator mode?" , lIsAdmin )
  
/* rest of prg */

RETURN


Function RunApiAsAdministrator()
ShellExecuteEx( wapi_GetActiveWindow(), 'runas', hb_ProgName(), , , SW_SHOWNORMAL )
Return Nil

#pragma BEGINDUMP

#include "SET_COMPILE_HMG_UNICODE.ch"
#include "HMG_UNICODE.h"

#include <windows.h>
#include <hbapi.h>
#include <shlobj.h>

HB_FUNC( SHELLEXECUTEEX )
{
    SHELLEXECUTEINFO SHExecInfo;
    ZeroMemory(&SHExecInfo, sizeof(SHExecInfo));

    SHExecInfo.cbSize       = sizeof(SHExecInfo);
    SHExecInfo.fMask        = SEE_MASK_NOCLOSEPROCESS;
    SHExecInfo.hwnd         = HB_ISNIL( 1 ) ? GetActiveWindow() : (HWND) HMG_parnl( 1 );
    SHExecInfo.lpVerb       = (LPCSTR) HMG_parc( 2 );
    SHExecInfo.lpFile       = (LPCSTR) HMG_parc( 3 );
    SHExecInfo.lpParameters = (LPCSTR) HMG_parc( 4 );
    SHExecInfo.lpDirectory  = (LPCSTR) HMG_parc( 5 );
    SHExecInfo.nShow        = hb_parni( 6 );
    
    if( ShellExecuteEx(&SHExecInfo) )
    {
        // hb_retnl( (LONG) SHExecInfo.hProcess );
        CloseHandle(SHExecInfo.hProcess);
    }
}
#pragma ENDDUMP
]]>
<![CDATA[General :: IDE proyecto nuevo :: Author danielmaximiliano]]> 2026-04-24T01:02:06+00:00 2026-04-24T01:02:06+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72232#p72232 .
Gacias a Roberto y don Claudio Soto trabaje con ansias unos lindos proyectos o los que ustedes comparten :mrgreen:

decidí ya que tengo tiempo libre crear un nuevo ide basado en TreeView ( el tree de HMG) , un editor de texto básico integrado (en próxima usar uno externo si quieren) basado en RichEditBox y una consola de lo que pasa dentro del ide :ugeek:

en 2013 maneje Tree para polizas de seguro y me fue re bien pero ahora todo eso se me olvido y tuve que luchar unos días para leer el viejo código de seguros para implementarlo correctamente en el IDE , deje algo funcional y tosco por ahora, pero lo deje usable para unas pruebas (version 0.1)
como me cuesta trabajar en HMG Harbour voy a implementar lo mejor que se usar en turbo Pascal que es el manejo de Hash (hb_hash) y estoy leyendo eso para poder la siguiente etapa del IDE mas "profesional" .

este ide contiene errores todavía y lo estoy haciendo con cariño separando cosas y aplicando una separación por etapas ( como ser.. Menu básico) editor con su propio menú, el editor de formulario con sus propios botones ) . el motor (ConsoleLog) muestra todo , desde la carga de un proyecto, doble click sobre el Tree que acción hace, si hay un error (que actualmente no lo muestra el IDE Actual, proxímante este si), porque va a mirar los residuos de HBMK2 y el html que genera el .exe en caso de error.

bueno basta de texto.. los aprecio por su incansable ayuda para con todos les presento al proyecto IDE :D
ide.png
Proyecto ----->
IDE.rar

Attachments

IDE.rar (94.82 KiB)

ide.png (25.57 KiB)

]]>
.
Gacias a Roberto y don Claudio Soto trabaje con ansias unos lindos proyectos o los que ustedes comparten :mrgreen:

decidí ya que tengo tiempo libre crear un nuevo ide basado en TreeView ( el tree de HMG) , un editor de texto básico integrado (en próxima usar uno externo si quieren) basado en RichEditBox y una consola de lo que pasa dentro del ide :ugeek:

en 2013 maneje Tree para polizas de seguro y me fue re bien pero ahora todo eso se me olvido y tuve que luchar unos días para leer el viejo código de seguros para implementarlo correctamente en el IDE , deje algo funcional y tosco por ahora, pero lo deje usable para unas pruebas (version 0.1)
como me cuesta trabajar en HMG Harbour voy a implementar lo mejor que se usar en turbo Pascal que es el manejo de Hash (hb_hash) y estoy leyendo eso para poder la siguiente etapa del IDE mas "profesional" .

este ide contiene errores todavía y lo estoy haciendo con cariño separando cosas y aplicando una separación por etapas ( como ser.. Menu básico) editor con su propio menú, el editor de formulario con sus propios botones ) . el motor (ConsoleLog) muestra todo , desde la carga de un proyecto, doble click sobre el Tree que acción hace, si hay un error (que actualmente no lo muestra el IDE Actual, proxímante este si), porque va a mirar los residuos de HBMK2 y el html que genera el .exe en caso de error.

bueno basta de texto.. los aprecio por su incansable ayuda para con todos les presento al proyecto IDE :D
ide.png
Proyecto ----->
IDE.rar

Attachments

IDE.rar (94.82 KiB)

ide.png (25.57 KiB)

]]>
<![CDATA[General :: Re: IDE proyecto nuevo :: Reply by serge_girard]]> 2026-04-24T06:16:56+00:00 2026-04-24T06:16:56+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72233#p72233 Serge]]> Serge]]> <![CDATA[General :: Re: IDE proyecto nuevo :: Reply by Steed]]> 2026-04-26T20:51:01+00:00 2026-04-26T20:51:01+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72240#p72240 <![CDATA[General :: Re: IDE proyecto nuevo :: Reply by martingz]]> 2026-04-28T13:40:19+00:00 2026-04-28T13:40:19+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72242#p72242 <![CDATA[General :: Re: IDE proyecto nuevo :: Reply by danielmaximiliano]]> 2026-05-01T21:11:13+00:00 2026-05-01T21:11:13+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72250#p72250 Volví a reescribir todo el IDE basado en paneles a ventanas Child .
este IDE estaba basado en hb_hash() ahora migré a DOM (Document Object Model) mas rápido.
recuerden que estoy en fase beta hasta que encuentre todos lo faltantes para integrar en el nuevo IDE.
sigo usando TREE pero este tiene una caracteristica que es ver el proyecto dentro de un RichEditBox al hacer un click encima, Se puede editar ese contenido? si! pero las funciones de guardado no están del todo probadas.
puedo utilizar un editor externo? si el que Windows asigno como editor para esa extensión de archivo.
¿ como lo pruebo ? en el tree dobleClick del mouse con la tecla CTRL presionada (CTRL + CLICK mouse)
panel de Function / Procedure / DEFiNE WINDOW encontradas en el .PRG.
este LISTBOX indica lo que encontró , su numero de LINEA y al hacer doble click encima te lleva a la linea .
Control RICHEDITBOX para editor interno.
una ventana que sirve de Depurador interno básico en linea.
¿ Como Funciona ? mientras escribimos código en una linea debajo "ConsoleLog( "xxxxx" ) todavía me queda copiar a MSGDEBUG() del Maestro Claudio SOTO !!!
recuerden formatear la variable a modo texto para leer su contenido !!!
que queda ? importar proyecto para que el contenido este en su lugar dentro de la carpeta, se elimina el problema de main.prg y main.fmg con diferentes proyectos en una misma carpeta!!!
recuerden probarlo con ejemplos de HMG ...
Otra cosa. seguimos usando Build64.bat para compilar (la función esta pero no la probé todavía) pero la nueva carácteristica es que al compilar si hay errores el control Listbox muta a un control de errores donde sacamos toda la información que HBMK2 nos regresa mediante ERROR.LOG
esto se lee en el ListBox y ConsoleLog..
bueno con uds IDEUnicode v02. para no tener problemas de compilación es preferible la carpeta c:\Temp de Windows y fijare que la carpeta donde este el IDE no tenga permisos de solo lectura
IDEUnicodeV02.rar

Attachments

IDEUnicodeV02.rar (181.13 KiB)
]]>
Volví a reescribir todo el IDE basado en paneles a ventanas Child .
este IDE estaba basado en hb_hash() ahora migré a DOM (Document Object Model) mas rápido.
recuerden que estoy en fase beta hasta que encuentre todos lo faltantes para integrar en el nuevo IDE.
sigo usando TREE pero este tiene una caracteristica que es ver el proyecto dentro de un RichEditBox al hacer un click encima, Se puede editar ese contenido? si! pero las funciones de guardado no están del todo probadas.
puedo utilizar un editor externo? si el que Windows asigno como editor para esa extensión de archivo.
¿ como lo pruebo ? en el tree dobleClick del mouse con la tecla CTRL presionada (CTRL + CLICK mouse)
panel de Function / Procedure / DEFiNE WINDOW encontradas en el .PRG.
este LISTBOX indica lo que encontró , su numero de LINEA y al hacer doble click encima te lleva a la linea .
Control RICHEDITBOX para editor interno.
una ventana que sirve de Depurador interno básico en linea.
¿ Como Funciona ? mientras escribimos código en una linea debajo "ConsoleLog( "xxxxx" ) todavía me queda copiar a MSGDEBUG() del Maestro Claudio SOTO !!!
recuerden formatear la variable a modo texto para leer su contenido !!!
que queda ? importar proyecto para que el contenido este en su lugar dentro de la carpeta, se elimina el problema de main.prg y main.fmg con diferentes proyectos en una misma carpeta!!!
recuerden probarlo con ejemplos de HMG ...
Otra cosa. seguimos usando Build64.bat para compilar (la función esta pero no la probé todavía) pero la nueva carácteristica es que al compilar si hay errores el control Listbox muta a un control de errores donde sacamos toda la información que HBMK2 nos regresa mediante ERROR.LOG
esto se lee en el ListBox y ConsoleLog..
bueno con uds IDEUnicode v02. para no tener problemas de compilación es preferible la carpeta c:\Temp de Windows y fijare que la carpeta donde este el IDE no tenga permisos de solo lectura
IDEUnicodeV02.rar

Attachments

IDEUnicodeV02.rar (181.13 KiB)
]]>
<![CDATA[General :: Re: IDE proyecto nuevo :: Reply by danielmaximiliano]]> 2026-05-01T21:22:02+00:00 2026-05-01T21:22:02+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72251#p72251 Captura de pantalla 2026-05-01 181717.png el Checkbox es para abrir el ultimo proyecto utilizado en el IDE , esto nos da la posibilidad de volver a trabajar el ultimo proyecto y no andar cargando mediante MENU Cargar proyecto.

todavía falla pero ya le voy a encontrar la vuelta ya que perdí muchos días con la falla del control TREE para cargar el proyecto con los DATOS DE DOM

Attachments


Captura de pantalla 2026-05-01 181717.png (125.71 KiB)

]]>
Captura de pantalla 2026-05-01 181717.png el Checkbox es para abrir el ultimo proyecto utilizado en el IDE , esto nos da la posibilidad de volver a trabajar el ultimo proyecto y no andar cargando mediante MENU Cargar proyecto.

todavía falla pero ya le voy a encontrar la vuelta ya que perdí muchos días con la falla del control TREE para cargar el proyecto con los DATOS DE DOM

Attachments


Captura de pantalla 2026-05-01 181717.png (125.71 KiB)

]]>
<![CDATA[General :: Re: IDE proyecto nuevo :: Reply by tonton2]]> 2026-05-02T10:50:48+00:00 2026-05-02T10:50:48+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72252#p72252 <![CDATA[General :: Re: IDE proyecto nuevo :: Reply by danielmaximiliano]]> 2026-05-02T16:45:39+00:00 2026-05-02T16:45:39+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72253#p72253
tonton2 wrote: Sat May 02, 2026 10:50 am merci,j'espere que d'autre membres maitrisant le sujet vont aider DanielMaximiliano et bon suite a toi Daniel
Gracias, estoy haciendo la traduccion del ide como estaba en el viejo IDE]]>
tonton2 wrote: Sat May 02, 2026 10:50 am merci,j'espere que d'autre membres maitrisant le sujet vont aider DanielMaximiliano et bon suite a toi Daniel
Gracias, estoy haciendo la traduccion del ide como estaba en el viejo IDE]]>
<![CDATA[General :: Re: IDE proyecto nuevo :: Reply by tonton2]]> 2026-05-03T17:05:51+00:00 2026-05-03T17:05:51+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72254#p72254
danielmaximiliano wrote: Sat May 02, 2026 4:45 pm
tonton2 wrote: Sat May 02, 2026 10:50 am merci,j'espere que d'autre membres maitrisant le sujet vont aider DanielMaximiliano et bon suite a toi Daniel
Gracias, estoy haciendo la traduccion del ide como estaba en el viejo IDE
MERCI et bon courage]]>
danielmaximiliano wrote: Sat May 02, 2026 4:45 pm
tonton2 wrote: Sat May 02, 2026 10:50 am merci,j'espere que d'autre membres maitrisant le sujet vont aider DanielMaximiliano et bon suite a toi Daniel
Gracias, estoy haciendo la traduccion del ide como estaba en el viejo IDE
MERCI et bon courage]]>
<![CDATA[General :: Re: IDE proyecto nuevo :: Reply by ASESORMIX]]> 2026-05-04T11:42:35+00:00 2026-05-04T11:42:35+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72257#p72257 Lo descargué, lo revisé y resurgieron en mi algunas ideas que tengo desde hace algún tiempo.
Me gusta esta aplicación.
Quiero contribuir con esas ideas.
Por ahora estoy ocupado en otros proyectos.
Cuando tenga holgura en tiempo le dedico.]]>
Lo descargué, lo revisé y resurgieron en mi algunas ideas que tengo desde hace algún tiempo.
Me gusta esta aplicación.
Quiero contribuir con esas ideas.
Por ahora estoy ocupado en otros proyectos.
Cuando tenga holgura en tiempo le dedico.]]>
<![CDATA[General :: Re: IDE proyecto nuevo :: Reply by tonton2]]> 2026-05-04T20:37:30+00:00 2026-05-04T20:37:30+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72262#p72262

Attachments

HMG_IDE_SourceCode.rar (257.54 KiB)
]]>

Attachments

HMG_IDE_SourceCode.rar (257.54 KiB)
]]>
<![CDATA[General :: Re: IDE proyecto nuevo :: Reply by danielmaximiliano]]> 2026-05-05T16:32:14+00:00 2026-05-05T16:43:00+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72263#p72263
ASESORMIX wrote: Mon May 04, 2026 11:42 am Gracias Daniel.
Lo descargué, lo revisé y resurgieron en mi algunas ideas que tengo desde hace algún tiempo.
Me gusta esta aplicación.
Quiero contribuir con esas ideas.
Por ahora estoy ocupado en otros proyectos.
Cuando tenga holgura en tiempo le dedico.
Gracias !!! use el Grupo en Whatsapp para que vean sus ideas asi no ensuciamos de comentarios aqui..
https://chat.whatsapp.com/KXKs0z2epjD1OGEMbgPhft]]>
ASESORMIX wrote: Mon May 04, 2026 11:42 am Gracias Daniel.
Lo descargué, lo revisé y resurgieron en mi algunas ideas que tengo desde hace algún tiempo.
Me gusta esta aplicación.
Quiero contribuir con esas ideas.
Por ahora estoy ocupado en otros proyectos.
Cuando tenga holgura en tiempo le dedico.
Gracias !!! use el Grupo en Whatsapp para que vean sus ideas asi no ensuciamos de comentarios aqui..
https://chat.whatsapp.com/KXKs0z2epjD1OGEMbgPhft]]>
<![CDATA[General :: Re: IDE proyecto nuevo :: Reply by danielmaximiliano]]> 2026-05-05T16:37:34+00:00 2026-05-11T18:28:19+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72264#p72264
estuve estos dias haciendo limpieza de codigo y funciones duplicadas que hacian lo mismo.
pero ahora estoy luchando porque no puedo utilizar el config.ini que permite comenzar a trabajar con el ultimo proyecto abierto asi no hay necesidad de cargarlo ya que se tiene que hacer automaticamente al Tildar en el CheckBox .
tampoco puede hacer funcionar que guarde el idioma del IDE para que use el menu con su idioma natal por el usuario :roll:
bueno ire corrigiendo a medida que vaya completando el proyecto.. espero les guste

Hello everyone again!!!

I've spent the last few days cleaning up code and removing duplicate functions that did the same thing.

But now I'm struggling because I can't use the config.ini file that allows me to start working with the last opened project, so there's no need to load it manually, since it should be done automatically when the checkbox is checked.
I also can't get it to work so that the IDE language is saved and the menu uses the user's native language. :roll: Well, I'll fix it as I complete the project... I hope you like it.

Sources :



Coming soon: DOM-Based Form Editor (faster and more efficient than conventional code and Hashing)]]>

estuve estos dias haciendo limpieza de codigo y funciones duplicadas que hacian lo mismo.
pero ahora estoy luchando porque no puedo utilizar el config.ini que permite comenzar a trabajar con el ultimo proyecto abierto asi no hay necesidad de cargarlo ya que se tiene que hacer automaticamente al Tildar en el CheckBox .
tampoco puede hacer funcionar que guarde el idioma del IDE para que use el menu con su idioma natal por el usuario :roll:
bueno ire corrigiendo a medida que vaya completando el proyecto.. espero les guste

Hello everyone again!!!

I've spent the last few days cleaning up code and removing duplicate functions that did the same thing.

But now I'm struggling because I can't use the config.ini file that allows me to start working with the last opened project, so there's no need to load it manually, since it should be done automatically when the checkbox is checked.
I also can't get it to work so that the IDE language is saved and the menu uses the user's native language. :roll: Well, I'll fix it as I complete the project... I hope you like it.

Sources :



Coming soon: DOM-Based Form Editor (faster and more efficient than conventional code and Hashing)]]>
<![CDATA[General :: Re: IDE proyecto nuevo :: Reply by serge_girard]]> 2026-05-05T17:38:38+00:00 2026-05-05T17:38:38+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72265#p72265 <![CDATA[General :: Re: IDE proyecto nuevo :: Reply by quartz565]]> 2026-05-05T18:41:51+00:00 2026-05-05T18:41:51+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72266#p72266 <![CDATA[General :: Re: IDE proyecto nuevo :: Reply by RPC]]> 2026-05-10T06:10:45+00:00 2026-05-10T06:10:45+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72279#p72279
tonton2 wrote: Mon May 04, 2026 8:37 pm Bonsoir, voici le code source de "l'IDE" que nous a remis le Dr. Claudio Sotto, jai essayé de le compiler mais en Vain, peut etre qu'il vous sera utile
Thanks tonton2]]>
tonton2 wrote: Mon May 04, 2026 8:37 pm Bonsoir, voici le code source de "l'IDE" que nous a remis le Dr. Claudio Sotto, jai essayé de le compiler mais en Vain, peut etre qu'il vous sera utile
Thanks tonton2]]>
<![CDATA[General :: Re: IDE proyecto nuevo :: Reply by RPC]]> 2026-05-10T06:14:49+00:00 2026-05-10T06:14:49+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72280#p72280
danielmaximiliano wrote: Tue May 05, 2026 4:37 pm Hola a todos de nuevo !!!

estuve estos dias haciendo limpieza de codigo y funciones duplicadas que hacian lo mismo.
pero ahora estoy luchando porque no puedo utilizar el config.ini que permite comenzar a trabajar con el ultimo proyecto abierto asi no hay necesidad de cargarlo ya que se tiene que hacer automaticamente al Tildar en el CheckBox .
tampoco puede hacer funcionar que guarde el idioma del IDE para que use el menu con su idioma natal por el usuario :roll:
bueno ire corrigiendo a medida que vaya completando el proyecto.. espero les guste

Hello everyone again!!!

I've spent the last few days cleaning up code and removing duplicate functions that did the same thing.

But now I'm struggling because I can't use the config.ini file that allows me to start working with the last opened project, so there's no need to load it manually, since it should be done automatically when the checkbox is checked.
I also can't get it to work so that the IDE language is saved and the menu uses the user's native language. :roll: Well, I'll fix it as I complete the project... I hope you like it.

Sources :

IDEunicodev05.rar

Coming soon: DOM-Based Form Editor (faster and more efficient than conventional code and Hashing)
Hi I tried to compile your IDE program but am getting following error.

hbmk2: Linking... IDEunicode_v05.exe
c:/hmg.3.5/mingw/bin/../lib/gcc/i686-w64-mingw32/9.3.0/../../../../i686-w64-mingw32/bin/ld.exe: warning: resolving _GetKeyState by linking to _GetKeyState@4
Use --enable-stdcall-fixup to disable these warnings
Use --disable-stdcall-fixup to disable these fixups
`_GetKeyState' referenced in section `.text' of .hbmk/win/mingw/Funciones.o: defined in discarded section `.text' of c:/hmg.3.5/mingw/bin/../lib/gcc/i686-w64-mingw32/9.3.0/../../../../i686-w64-mingw32/lib/../lib\libuser32.a(dgjqs00342.o)
`_GetKeyState' referenced in section `.text' of .hbmk/win/mingw/Funciones.o: defined in discarded section `.text' of c:/hmg.3.5/mingw/bin/../lib/gcc/i686-w64-mingw32/9.3.0/../../../../i686-w64-mingw32/lib/../lib\libuser32.a(dgjqs00342.o)
collect2.exe: error: ld returned 1 exit status
hbmk2[IDEunicode_v05]: Error: Running linker. 1
gcc.exe .hbmk/win/mingw/Main.o .hbmk/win/mingw/Console.o .hbmk/win/mingw/Dom.o .hbmk/win/mingw/DomSemantic.o .hbmk/win/mingw/Event.o .hbmk/win/mingw/Funciones.o .hbmk/win/mingw/Language.o .hbmk/win/mingw/Sintaxis.o .hbmk/win/mingw/Window.o .hbmk/win/mingw/_hbmkaut_Main.o C:/Users/rpcch/Downloads/IDEunicodev05/IDEunicodev05/_temp.o -pthread -static-libgcc -static-libstdc++ -static -lpthread -mwindows -Wl,--start-group -lhmg -lcrypt -ledit -leditex -lgraph -lini -lreport -lhfcl -lmsvfw32 -lvfw32 -lhbmysql -lmysql -lhbfimage -lhbpgsql -lsddmy -lhbvpdf -lhbct -lhbwin -lhbmzip -lminizip -lhbmemio -lhbmisc -lhbtip -lsqlite3 -lhbsqlit3 -lsddodbc -lrddsql -lhbodbc -lodbc32 -lhbhpdf -lhbnetio -lxhb -lpng -llibhpdf -lhbzebra -lhbextern -lhbdebug -lhbvmmt -lhbrtl -lhblang -lhbcpage -lgtcgi -lgtpca -lgtstd -lgtwin -lgtwvt -lgtgui -lhbrdd -lhbuddall -lhbusrrdd -lrddntx -lrddcdx -lrddnsx -lrddfpt -lhbrdd -lhbhsx -lhbsix -lhbmacro -lhbcplr -lhbpp -lhbcommon -lhbmainwin -lwinmm -lkernel32 -luser32 -lgdi32 -ladvapi32 -lws2_32 -liphlpapi -lwinspool -lcomctl32 -lcomdlg32 -lshell32 -luuid -lole32 -loleaut32 -lmpr -lmapi32 -limm32 -lmsimg32 -lwininet -lhbpcre -lhbzlib -Wl,--end-group -oIDEunicode_v05.exe -LC:/HMG.3.5/harbour/lib/win/mingw -LC:/HMG.3.5/lib


Can you pls help resolve it.
Thanks
RPC]]>
danielmaximiliano wrote: Tue May 05, 2026 4:37 pm Hola a todos de nuevo !!!

estuve estos dias haciendo limpieza de codigo y funciones duplicadas que hacian lo mismo.
pero ahora estoy luchando porque no puedo utilizar el config.ini que permite comenzar a trabajar con el ultimo proyecto abierto asi no hay necesidad de cargarlo ya que se tiene que hacer automaticamente al Tildar en el CheckBox .
tampoco puede hacer funcionar que guarde el idioma del IDE para que use el menu con su idioma natal por el usuario :roll:
bueno ire corrigiendo a medida que vaya completando el proyecto.. espero les guste

Hello everyone again!!!

I've spent the last few days cleaning up code and removing duplicate functions that did the same thing.

But now I'm struggling because I can't use the config.ini file that allows me to start working with the last opened project, so there's no need to load it manually, since it should be done automatically when the checkbox is checked.
I also can't get it to work so that the IDE language is saved and the menu uses the user's native language. :roll: Well, I'll fix it as I complete the project... I hope you like it.

Sources :

IDEunicodev05.rar

Coming soon: DOM-Based Form Editor (faster and more efficient than conventional code and Hashing)
Hi I tried to compile your IDE program but am getting following error.

hbmk2: Linking... IDEunicode_v05.exe
c:/hmg.3.5/mingw/bin/../lib/gcc/i686-w64-mingw32/9.3.0/../../../../i686-w64-mingw32/bin/ld.exe: warning: resolving _GetKeyState by linking to _GetKeyState@4
Use --enable-stdcall-fixup to disable these warnings
Use --disable-stdcall-fixup to disable these fixups
`_GetKeyState' referenced in section `.text' of .hbmk/win/mingw/Funciones.o: defined in discarded section `.text' of c:/hmg.3.5/mingw/bin/../lib/gcc/i686-w64-mingw32/9.3.0/../../../../i686-w64-mingw32/lib/../lib\libuser32.a(dgjqs00342.o)
`_GetKeyState' referenced in section `.text' of .hbmk/win/mingw/Funciones.o: defined in discarded section `.text' of c:/hmg.3.5/mingw/bin/../lib/gcc/i686-w64-mingw32/9.3.0/../../../../i686-w64-mingw32/lib/../lib\libuser32.a(dgjqs00342.o)
collect2.exe: error: ld returned 1 exit status
hbmk2[IDEunicode_v05]: Error: Running linker. 1
gcc.exe .hbmk/win/mingw/Main.o .hbmk/win/mingw/Console.o .hbmk/win/mingw/Dom.o .hbmk/win/mingw/DomSemantic.o .hbmk/win/mingw/Event.o .hbmk/win/mingw/Funciones.o .hbmk/win/mingw/Language.o .hbmk/win/mingw/Sintaxis.o .hbmk/win/mingw/Window.o .hbmk/win/mingw/_hbmkaut_Main.o C:/Users/rpcch/Downloads/IDEunicodev05/IDEunicodev05/_temp.o -pthread -static-libgcc -static-libstdc++ -static -lpthread -mwindows -Wl,--start-group -lhmg -lcrypt -ledit -leditex -lgraph -lini -lreport -lhfcl -lmsvfw32 -lvfw32 -lhbmysql -lmysql -lhbfimage -lhbpgsql -lsddmy -lhbvpdf -lhbct -lhbwin -lhbmzip -lminizip -lhbmemio -lhbmisc -lhbtip -lsqlite3 -lhbsqlit3 -lsddodbc -lrddsql -lhbodbc -lodbc32 -lhbhpdf -lhbnetio -lxhb -lpng -llibhpdf -lhbzebra -lhbextern -lhbdebug -lhbvmmt -lhbrtl -lhblang -lhbcpage -lgtcgi -lgtpca -lgtstd -lgtwin -lgtwvt -lgtgui -lhbrdd -lhbuddall -lhbusrrdd -lrddntx -lrddcdx -lrddnsx -lrddfpt -lhbrdd -lhbhsx -lhbsix -lhbmacro -lhbcplr -lhbpp -lhbcommon -lhbmainwin -lwinmm -lkernel32 -luser32 -lgdi32 -ladvapi32 -lws2_32 -liphlpapi -lwinspool -lcomctl32 -lcomdlg32 -lshell32 -luuid -lole32 -loleaut32 -lmpr -lmapi32 -limm32 -lmsimg32 -lwininet -lhbpcre -lhbzlib -Wl,--end-group -oIDEunicode_v05.exe -LC:/HMG.3.5/harbour/lib/win/mingw -LC:/HMG.3.5/lib


Can you pls help resolve it.
Thanks
RPC]]>
<![CDATA[General :: Re: IDE proyecto nuevo :: Reply by danielmaximiliano]]> 2026-05-11T03:02:52+00:00 2026-05-11T16:03:25+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72282#p72282
recuerden que se debe compilar con el IDE de Roberto Lopez (Unicode por Claudio Soto.)
en C:\Temp\xxxxxx
y que la carpeta tenga permisos de escritura
por ahora esta en base experimental hasta descubrir posibles errores..


Captura de pantalla 2026-05-11 125049.png
IDEunicodev10.rar

Attachments

IDEunicodev10.rar (267.53 KiB)

Captura de pantalla 2026-05-11 125049.png (183.1 KiB)

]]>

recuerden que se debe compilar con el IDE de Roberto Lopez (Unicode por Claudio Soto.)
en C:\Temp\xxxxxx
y que la carpeta tenga permisos de escritura
por ahora esta en base experimental hasta descubrir posibles errores..


Captura de pantalla 2026-05-11 125049.png
IDEunicodev10.rar

Attachments

IDEunicodev10.rar (267.53 KiB)

Captura de pantalla 2026-05-11 125049.png (183.1 KiB)

]]>
<![CDATA[General :: Re: IDE proyecto nuevo :: Reply by RPC]]> 2026-05-11T05:27:15+00:00 2026-05-11T05:27:15+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72283#p72283 I am able to compile ver 0.10 successfully and have also created new project.
Now how do I open *.prg file in editor and edit it and then compile it ?]]>
I am able to compile ver 0.10 successfully and have also created new project.
Now how do I open *.prg file in editor and edit it and then compile it ?]]>
<![CDATA[General :: Re: IDE proyecto nuevo :: Reply by RPC]]> 2026-05-12T10:01:45+00:00 2026-05-12T10:01:45+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72286#p72286 I am getting following error on compilation
***
gcc: fatal error: cannot execute 'cc1': CreateProcess: No such file or directory
compilation terminated.
windres: preprocessing failed.
Harbour 3.2.0dev (r2304211101)
Copyright (c) 1999-2023, https://harbour.github.io/
gcc.exe: fatal error: cannot execute 'cc1': CreateProcess: No such file or directory
compilation terminated.
hbmk2[process_CN_PDF]: Error: Running C/C++ compiler. 1
gcc.exe -c -O3 -W -Wall -pipe -IC:/hmg.3.6/harbour64/include -I../../../../Downloads/IDEunicodev10 -IC:/hmg.3.6/include -IC:/hmg.3.6/harbour64/contrib/hbmysql C:/Users/rpcch/AppData/Local/Temp/hbmk_cvas83.dir/process_CN_PDF.c C:/Users/rpcch/AppData/Local/Temp/hbmk_4cwdmp.c

***
Pls resolve,
Thanks]]>
I am getting following error on compilation
***
gcc: fatal error: cannot execute 'cc1': CreateProcess: No such file or directory
compilation terminated.
windres: preprocessing failed.
Harbour 3.2.0dev (r2304211101)
Copyright (c) 1999-2023, https://harbour.github.io/
gcc.exe: fatal error: cannot execute 'cc1': CreateProcess: No such file or directory
compilation terminated.
hbmk2[process_CN_PDF]: Error: Running C/C++ compiler. 1
gcc.exe -c -O3 -W -Wall -pipe -IC:/hmg.3.6/harbour64/include -I../../../../Downloads/IDEunicodev10 -IC:/hmg.3.6/include -IC:/hmg.3.6/harbour64/contrib/hbmysql C:/Users/rpcch/AppData/Local/Temp/hbmk_cvas83.dir/process_CN_PDF.c C:/Users/rpcch/AppData/Local/Temp/hbmk_4cwdmp.c

***
Pls resolve,
Thanks]]>
<![CDATA[General :: Re: IDE proyecto nuevo :: Reply by danielmaximiliano]]> 2026-05-13T20:28:39+00:00 2026-05-13T20:28:39+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72288#p72288
RPC wrote: Tue May 12, 2026 10:01 am Compile ---->>>> Downloads/IDEunicodev10
Try c:\Temp\IDEunicodev10 <----- Check that the folder has write permissions :ugeek:]]>
RPC wrote: Tue May 12, 2026 10:01 am Compile ---->>>> Downloads/IDEunicodev10
Try c:\Temp\IDEunicodev10 <----- Check that the folder has write permissions :ugeek:]]>
<![CDATA[General :: Re: IDE proyecto nuevo :: Reply by danielmaximiliano]]> 2026-05-15T03:22:51+00:00 2026-05-15T03:22:51+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72290#p72290 llegue en un punto que el trabajo del IDEUnicode v0.10 se complicaba decidi cambiar DOM estudiando el IDE de Lazarus con lo que siempre me senti identificado.
asi que busque en mi yahoo mail mi viejo proyecto en turbo pascal llamado Tilos (un arbol de sudamerica) que era un sistema POS (point of Sale) ahi tenia a la tienda y sus sectores de venta, stock , expedicion y productos.
cuando entraba un producto nuevo o reposicion este producto afectaba las distintas secciones de la tienda, asi que en base a ese diseño decidi modificar el IDE siguiendo ese concepto que hice en en 1994.
les dejo la seccion de DOM y como lo estoy implementando porque me ahorra mucho escribir codigo sin equivocarme.

Hello everyone: I reached a point where working with IDEUnicode v0.10 was becoming too complicated, so I decided to change the DOM by studying the Lazarus IDE, with which I've always felt a connection.

So I looked in my Yahoo Mail for my old Turbo Pascal project called Tilos (a South American tree), which was a POS (Point of Sale) system. It had the store and its sales, stock, shipping, and product sections.
When a new product arrived or was restocked, it affected the different sections of the store. Based on that design, I decided to modify the IDE following the concept I created back in 1994. I'm sharing the DOM section and how I'm implementing it because it saves me a lot of time writing code without making mistakes.

Code: Select all

// Dom.prg
#include "hmg.ch"
#include "IDE_Unicode.ch"

// ============================================================================
// IDE UNICODE v0.12
// DOM CORE ENGINE
// ============================================================================

STATIC nDomNextID := 1000

// ============================================================================
// DOM CORE
// ============================================================================

FUNCTION DOM_Init()
    PUBLIC hDOM := {=>}
    // ----------------------------------------------------------------
    // CORE
    // ----------------------------------------------------------------
    hDOM["_data"]    := {=>}
    hDOM["_watch"]   := {=>}
    hDOM["_history"] := {}
    // ----------------------------------------------------------------
    // PROJECT
    // ----------------------------------------------------------------
    hDOM["project"] := {=>}
    hDOM["project"]["name"]       := ""
    hDOM["project"]["path"]       := ""
    hDOM["project"]["status"]     := "INIT"
    hDOM["project"]["modified"]   := .F.
    hDOM["project"]["containers"] := {}
    hDOM["project"]["files"]      := {}
    // ----------------------------------------------------------------
    // EDITOR
    // ----------------------------------------------------------------
    hDOM["editor"] := {=>}
    hDOM["editor"]["active_file"] := ""
    hDOM["editor"]["dirty"]       := .F.
    hDOM["editor"]["encoding"]    := "utf8"
    // ----------------------------------------------------------------
    // UI
    // ----------------------------------------------------------------
    hDOM["ui"] := {=>}
    hDOM["ui"]["tree_selected"] := 0
    // ----------------------------------------------------------------
    // LANGUAGE
    // ----------------------------------------------------------------
    hDOM["language"] := "English"
RETURN NIL

// ============================================================================
// DOM GET / SET
// ============================================================================

FUNCTION DomSet( cKey, uValue )
    LOCAL uOld := NIL

    IF !HB_HHasKey( hDOM["_data"], cKey )
        hDOM["_data"][ cKey ] := NIL
    ENDIF

    uOld := hDOM["_data"][ cKey ]

    IF uOld == uValue
        RETURN NIL
    ENDIF

    hDOM["_data"][ cKey ] := uValue
    AAdd( hDOM["_history"], { cKey, uOld, uValue } )
RETURN NIL

FUNCTION DomGet( cKey )

    IF HB_HHasKey( hDOM["_data"], cKey )
        RETURN hDOM["_data"][ cKey ]
    ENDIF

RETURN NIL

// ============================================================================
// DOM CREATE EMPTY
// ============================================================================

PROCEDURE DOM_CreateEmpty()
    hDOM["project"]["name"]               := ""
    hDOM["project"]["path"]               := ""
    hDOM["project"]["status"]           := "INIT"
    hDOM["project"]["modified"]      := .F.
    hDOM["project"]["containers"] := {}
    hDOM["project"]["files"]            := {}
RETURN

// ============================================================================
// DOM LOAD PROJECT
// ============================================================================

PROCEDURE DOM_LoadProject( cProject )
    LOCAL cName

    IF Empty( cProject )
        RETURN
    ENDIF

    IF !File( cProject )
        RETURN
    ENDIF

    cName := hb_fNameName( cProject )
    hDOM["project"]["name"]            := cName
    hDOM["project"]["path"]            := cProject
    hDOM["project"]["status"]        := "PROJECT"
    hDOM["project"]["modified"]    := .F.
    hDOM["project"]["containers"]:= {}
    hDOM["project"]["files"]           := {}

    DOM_LoadContainers()
RETURN

// ============================================================================
// LOAD CONTAINERS
// ============================================================================

PROCEDURE DOM_LoadContainers()
    LOCAL cHBP
    LOCAL cBase
    LOCAL cDir

    LOCAL cFRM
    LOCAL cHBC
    LOCAL cRC

    cHBP   := hDOM["project"]["path"]
    cBase := hb_fNameName( cHBP )
    cDir   := hb_fNameDir( cHBP )

    IF Right( cDir, 1 ) != "\"
        cDir += "\"
    ENDIF

    cFRM := cDir + cBase + ".frm"
    cHBC := cDir + cBase + ".hbc"
    cRC  := cDir + cBase + ".rc"

    // ----------------------------------------------------------------
    // REGISTER CONTAINERS
    // ----------------------------------------------------------------

    DOM_AddContainer( "hbp", cHBP )

    IF File( cFRM )
        DOM_AddContainer( "frm", cFRM )
    ENDIF

    IF File( cHBC )
        DOM_AddContainer( "hbc", cHBC )
    ENDIF

    IF File( cRC )
        DOM_AddContainer( "rc", cRC )
    ENDIF

    // ----------------------------------------------------------------
    // PARSE
    // ----------------------------------------------------------------

    DOM_ParseHBP( cHBP )

    IF File( cFRM )
        DOM_ParseFRM( cFRM )
    ENDIF

RETURN

// ============================================================================
// ADD CONTAINER
// ============================================================================

PROCEDURE DOM_AddContainer( cType, cPath )

    LOCAL hContainer := {=>}

    nDomNextID++

    hContainer["id"]      := nDomNextID
    hContainer["type"] := Lower( cType )
    hContainer["path"] := cPath
    hContainer["name"] := hb_fNameNameExt( cPath )
    hContainer["icon"] := GetFileIconIndex( cPath )

    AAdd( hDOM["project"]["containers"], hContainer )

RETURN

// ============================================================================
// PARSE HBP
// ============================================================================

PROCEDURE DOM_ParseHBP( cHBP )
    LOCAL cContent , aLines , cLine , nI
    LOCAL cDir , cFull , cExt
    LOCAL cName

    IF !File( cHBP )
        RETURN
    ENDIF

    cDir := hb_fNameDir( cHBP )

    IF Right( cDir, 1 ) != "\"
        cDir += "\"
    ENDIF

    cContent := MemoRead( cHBP )
    cContent := StrTran( cContent, Chr(13), "" )
    aLines := hb_ATokens( cContent, Chr(10) )

    FOR nI := 1 TO Len( aLines )

        cLine := AllTrim( aLines[nI] )

        IF Empty( cLine )
            LOOP
        ENDIF

        IF Left( cLine, 1 ) == "#"
            LOOP
        ENDIF

        IF Left( cLine, 1 ) == "-"
            LOOP
        ENDIF

        cLine := StrTran( cLine, "/", "\" )

        //----------------------------------------------------
        // FULL PATH
        //----------------------------------------------------

        IF ":" $ cLine
            cFull := cLine
        ELSE
            cFull := cDir + cLine
        ENDIF

        cExt  := Lower( hb_fNameExt( cFull ) )
        cName := hb_fNameNameExt( cFull )

        //----------------------------------------------------
        // REGISTER FILE
        //----------------------------------------------------

        IF cExt == ".prg" .OR. ;
           cExt == ".c"   .OR. ;
           cExt == ".cpp"

            DOM_AddFile( cFull , "hbp" )

        ENDIF

    NEXT

RETURN

// ============================================================================
// PARSE FRM
// ============================================================================

PROCEDURE DOM_ParseFRM( cFRM )
    LOCAL cContent , aLines , cLine ,  nI , cDir ,  cFull , cExt

    IF !File( cFRM )
        RETURN
    ENDIF

    cDir := hb_fNameDir( cFRM )

    IF Right( cDir, 1 ) != "\"
        cDir += "\"
    ENDIF

    cContent := MemoRead( cFRM )
    cContent := StrTran( cContent, Chr(13), "" )
    aLines := hb_ATokens( cContent, Chr(10) )

    FOR nI := 1 TO Len( aLines )
        cLine := AllTrim( aLines[nI ] )
        IF Empty( cLine )
            LOOP
        ENDIF

        IF Left( cLine, 1 ) == "#"
            LOOP
        ENDIF

        IF Left( cLine, 1 ) == "-"
            LOOP
        ENDIF

        cLine := StrTran( cLine, "/", "\" )

        IF ":" $ cLine
            cFull := cLine
        ELSE
            cFull := cDir + cLine
        ENDIF

        cExt := Lower( hb_fNameExt( cFull ) )

        IF cExt == ".fmg"
            DOM_AddFile( cFull, "frm" )
        ENDIF
    NEXT
RETURN

// ============================================================================
// ADD FILE
// ============================================================================

PROCEDURE DOM_AddFile( cFull, cGroup )
    LOCAL hFile := {=>}
    LOCAL cName , cExt

    IF Empty( cFull )
        RETURN
    ENDIF

    IF DOM_FindFileByPath( cFull ) != NIL
        RETURN
    ENDIF

    cName := hb_fNameNameExt( cFull )
    cExt  := Lower( hb_fNameExt( cFull ) )

    nDomNextID++

    hFile["id"]             := nDomNextID
    hFile["name"]         := cName
    hFile["path"]         := cFull
    hFile["ext"]           := cExt
    hFile["group"]      := cGroup
    hFile["opened"]    := .F.
    hFile["dirty"]      := .F.
    hFile["encoding"]:= "utf8"
    hFile["icon"]         := GetFileIconIndex( cFull )

    DO CASE

        CASE cExt == ".prg"
            hFile["type"] := "source"

        CASE cExt == ".c"
            hFile["type"] := "c"

        CASE cExt == ".cpp"
            hFile["type"] := "cpp"

        CASE cExt == ".fmg"
            hFile["type"] := "form"

        OTHERWISE
            hFile["type"] := "unknown"
    ENDCASE

    AAdd( hDOM["project"]["files"], hFile )
    hDOM["project"]["modified"] := .T.
RETURN

// ============================================================================
// FIND FILE
// ============================================================================

FUNCTION DOM_FindFileByPath( cPath )
    LOCAL aFiles := hDOM["project"]["files"]
    LOCAL nI 
	
    FOR nI := 1 TO Len( aFiles )
        IF Upper( aFiles[nI]["path"] ) == Upper( cPath )
            RETURN aFiles[nI]
        ENDIF
    NEXT
RETURN NIL

FUNCTION DOM_GetPath( nIndex )
    LOCAL aFiles , hFile , nI

    IF Empty( nIndex )
        RETURN ""
    ENDIF

    IF !HB_HHasKey( hDOM, "project" )
        RETURN ""
    ENDIF

    IF !HB_HHasKey( hDOM["project"], "files" )
        RETURN ""
    ENDIF

    aFiles := hDOM["project"]["files"]

    FOR nI := 1 TO Len( aFiles )
        hFile := aFiles[nI]
        IF ValType( hFile ) == "H"
            IF hb_HGetDef( hFile, "treeid", 0 ) == nIndex
                RETURN hb_HGetDef( hFile, "path", "" )
            ENDIF
        ENDIF
    NEXT
RETURN ""

PROCEDURE InitProjectStructure()
   hDOM["project_name"] := "Untitled"
   hDOM["status"]              := "EMPTY"
RETURN

// ============================================================================
// BUILD TREE
// ============================================================================
FUNCTION BuildTreeFromDOM()
    LOCAL aContainers := hDOM["project"]["containers"]
    LOCAL aFiles      := hDOM["project"]["files"]

    LOCAL nI , nJ
    LOCAL hContainer , hFile

    LOCAL nRoot
    LOCAL nProject

    LOCAL nHBP := 0
    LOCAL nFRM := 0
    LOCAL nHBC := 0
    LOCAL nRC  := 0

    LOCAL nTreeID

    IF .NOT. IsWindowDefined( "Inspector" )
        RETURN NIL
    ENDIF

    DoMethod( "Inspector", "Tree_Project", "DisableUpdate" )
    DoMethod( "Inspector", "Tree_Project", "DeleteAllItems" )

    // ----------------------------------------------------------------
    // INIT
    // ----------------------------------------------------------------

    IF hDOM["project"]["status"] == "INIT"

        DoMethod( ;
            "Inspector", ;
            "Tree_Project", ;
            "AddItem", ;
            "IDE Unicode v0.12", ;
            0, ;
            5 )

        DoMethod( ;
            "Inspector", ;
            "Tree_Project", ;
            "AddItem", ;
            "No open project", ;
            1, ;
            6 )

        DoMethod( "Inspector", "Tree_Project", "EnableUpdate" )
        DoMethod( "Inspector", "Tree_Project", "Refresh" )

        RETURN NIL

    ENDIF

    // ----------------------------------------------------------------
    // ROOT
    // ----------------------------------------------------------------

    DoMethod( ;
        "Inspector", ;
        "Tree_Project", ;
        "AddItem", ;
        "IDE Unicode v0.12", ;
        0, ;
        1 )

    nRoot := GetProperty( ;
        "Inspector", ;
        "Tree_Project", ;
        "ItemCount" )

    // ----------------------------------------------------------------
    // PROJECT
    // ----------------------------------------------------------------

    DoMethod( ;
        "Inspector", ;
        "Tree_Project", ;
        "AddItem", ;
        hDOM["project"]["name"], ;
        nRoot, ;
        6 )

    nProject := GetProperty( ;
        "Inspector", ;
        "Tree_Project", ;
        "ItemCount" )

    // ----------------------------------------------------------------
    // CONTAINERS
    // ----------------------------------------------------------------

    FOR nI := 1 TO Len( aContainers )

        hContainer := aContainers[nI]

        DoMethod( ;
            "Inspector", ;
            "Tree_Project", ;
            "AddItem", ;
            hContainer["name"], ;
            nProject, ;
            hContainer["icon"] )

        nTreeID := GetProperty( ;
            "Inspector", ;
            "Tree_Project", ;
            "ItemCount" )

        hContainer["treeid"] := nTreeID

        DO CASE

            CASE hContainer["type"] == "hbp"
                nHBP := nTreeID

            CASE hContainer["type"] == "frm"
                nFRM := nTreeID

            CASE hContainer["type"] == "hbc"
                nHBC := nTreeID

            CASE hContainer["type"] == "rc"
                nRC := nTreeID

        ENDCASE

    NEXT

    // ----------------------------------------------------------------
    // FILES
    // ----------------------------------------------------------------

    FOR nJ := 1 TO Len( aFiles )

        hFile := aFiles[nJ]

        DO CASE

            CASE hFile["group"] == "hbp"
                IF nHBP > 0
                    DoMethod( ;
                        "Inspector", ;
                        "Tree_Project", ;
                        "AddItem", ;
                        hFile["name"], ;
                        nHBP, ;
                        hFile["icon"] )
                ENDIF

            CASE hFile["group"] == "frm"
                IF nFRM > 0
                    DoMethod( ;
                        "Inspector", ;
                        "Tree_Project", ;
                        "AddItem", ;
                        hFile["name"], ;
                        nFRM, ;
                        hFile["icon"] )
                ENDIF

            CASE hFile["group"] == "hbc"
                IF nHBC > 0
                    DoMethod( ;
                        "Inspector", ;
                        "Tree_Project", ;
                        "AddItem", ;
                        hFile["name"], ;
                        nHBC, ;
                        hFile["icon"] )
                ENDIF

            CASE hFile["group"] == "rc"
                IF nRC > 0
                    DoMethod( ;
                        "Inspector", ;
                        "Tree_Project", ;
                        "AddItem", ;
                        hFile["name"], ;
                        nRC, ;
                        hFile["icon"] )
                ENDIF

        ENDCASE

        //-------------------------------------------------------------
        // CAPTURE REAL TREE ID
        //-------------------------------------------------------------

        nTreeID := GetProperty( ;
            "Inspector", ;
            "Tree_Project", ;
            "ItemCount" )

        hFile["treeid"] := nTreeID

    NEXT

    // ----------------------------------------------------------------
    // EXPAND
    // ----------------------------------------------------------------

    IF nRoot > 0
        DoMethod( "Inspector", "Tree_Project", "Expand", nRoot )
    ENDIF

    IF nProject > 0
        DoMethod( "Inspector", "Tree_Project", "Expand", nProject )
    ENDIF

    IF nHBP > 0
        DoMethod( "Inspector", "Tree_Project", "Expand", nHBP )
    ENDIF

    IF nFRM > 0
        DoMethod( "Inspector", "Tree_Project", "Expand", nFRM )
    ENDIF

    IF nHBC > 0
        DoMethod( "Inspector", "Tree_Project", "Expand", nHBC )
    ENDIF

    IF nRC > 0
        DoMethod( "Inspector", "Tree_Project", "Expand", nRC )
    ENDIF

    // ----------------------------------------------------------------
    // DEFAULT SELECT
    // ----------------------------------------------------------------

    SetProperty( "Inspector", "Tree_Project", "Value", 1 )

    DoMethod( "Inspector", "Tree_Project", "EnableUpdate" )
    DoMethod( "Inspector", "Tree_Project", "Refresh" )

    ConsoleLog( ;
        "UI: Tree rebuilt -> " + ;
        hb_ntos( Len( aFiles ) ) + ;
        " files", ;
        "SUCCESS" )

RETURN NIL

// ============================================================================
// SAVE PROJECT
// ============================================================================

PROCEDURE DOM_SaveProject()
   LOCAL cProject := DomGet( "project_path" )

   IF Empty( cProject )
      RETURN
   ENDIF

   Project_SyncHBP()
   ConsoleLog( "DOM: project saved", "SUCCESS" )
RETURN

PROCEDURE Project_SyncHBP()
   LOCAL cProject := DomGet( "project_path" )
   LOCAL aModules
   LOCAL i
   LOCAL cContent := ""

   IF Empty( cProject )
      RETURN
   ENDIF

   IF !HB_HHasKey( hDOM, "modules" )
      RETURN
   ENDIF

   aModules := hDOM["modules"]

   FOR i := 1 TO Len( aModules )
      cContent += aModules[i] + hb_eol()
   NEXT

   MemoWrit( cProject, cContent )
   ConsoleLog( "PROJECT: .hbp synced", "SUCCESS" )
RETURN

// ============================================================================
// ICONS
// ============================================================================

FUNCTION GetFileIconIndex( cFile )

    LOCAL cExt   := Lower( hb_fNameExt( cFile ) )
    LOCAL nIcono := 6

    DO CASE
        CASE cExt == ".hbp"
            nIcono := 1

        CASE cExt == ".prg" .OR. cExt == ".c"   .OR. cExt == ".cpp"
            nIcono := 2

        CASE cExt == ".rc"
            nIcono := 3

        CASE cExt == ".ch" .OR. cExt == ".h"
            nIcono := 4

        CASE cExt == ".frm"
            nIcono := 7

        CASE cExt == ".fmg"
            nIcono := 8

        CASE cExt == ".hbc"
            nIcono := 9

        CASE Empty( cExt )
            nIcono := 5
    ENDCASE
RETURN nIcono
tengo todavia unas discrepancias entre DOM y el TREE de HMG pero espero corregir estos dias siguiente.. espero les guste esa forma de trabajar]]>
llegue en un punto que el trabajo del IDEUnicode v0.10 se complicaba decidi cambiar DOM estudiando el IDE de Lazarus con lo que siempre me senti identificado.
asi que busque en mi yahoo mail mi viejo proyecto en turbo pascal llamado Tilos (un arbol de sudamerica) que era un sistema POS (point of Sale) ahi tenia a la tienda y sus sectores de venta, stock , expedicion y productos.
cuando entraba un producto nuevo o reposicion este producto afectaba las distintas secciones de la tienda, asi que en base a ese diseño decidi modificar el IDE siguiendo ese concepto que hice en en 1994.
les dejo la seccion de DOM y como lo estoy implementando porque me ahorra mucho escribir codigo sin equivocarme.

Hello everyone: I reached a point where working with IDEUnicode v0.10 was becoming too complicated, so I decided to change the DOM by studying the Lazarus IDE, with which I've always felt a connection.

So I looked in my Yahoo Mail for my old Turbo Pascal project called Tilos (a South American tree), which was a POS (Point of Sale) system. It had the store and its sales, stock, shipping, and product sections.
When a new product arrived or was restocked, it affected the different sections of the store. Based on that design, I decided to modify the IDE following the concept I created back in 1994. I'm sharing the DOM section and how I'm implementing it because it saves me a lot of time writing code without making mistakes.

Code: Select all

// Dom.prg
#include "hmg.ch"
#include "IDE_Unicode.ch"

// ============================================================================
// IDE UNICODE v0.12
// DOM CORE ENGINE
// ============================================================================

STATIC nDomNextID := 1000

// ============================================================================
// DOM CORE
// ============================================================================

FUNCTION DOM_Init()
    PUBLIC hDOM := {=>}
    // ----------------------------------------------------------------
    // CORE
    // ----------------------------------------------------------------
    hDOM["_data"]    := {=>}
    hDOM["_watch"]   := {=>}
    hDOM["_history"] := {}
    // ----------------------------------------------------------------
    // PROJECT
    // ----------------------------------------------------------------
    hDOM["project"] := {=>}
    hDOM["project"]["name"]       := ""
    hDOM["project"]["path"]       := ""
    hDOM["project"]["status"]     := "INIT"
    hDOM["project"]["modified"]   := .F.
    hDOM["project"]["containers"] := {}
    hDOM["project"]["files"]      := {}
    // ----------------------------------------------------------------
    // EDITOR
    // ----------------------------------------------------------------
    hDOM["editor"] := {=>}
    hDOM["editor"]["active_file"] := ""
    hDOM["editor"]["dirty"]       := .F.
    hDOM["editor"]["encoding"]    := "utf8"
    // ----------------------------------------------------------------
    // UI
    // ----------------------------------------------------------------
    hDOM["ui"] := {=>}
    hDOM["ui"]["tree_selected"] := 0
    // ----------------------------------------------------------------
    // LANGUAGE
    // ----------------------------------------------------------------
    hDOM["language"] := "English"
RETURN NIL

// ============================================================================
// DOM GET / SET
// ============================================================================

FUNCTION DomSet( cKey, uValue )
    LOCAL uOld := NIL

    IF !HB_HHasKey( hDOM["_data"], cKey )
        hDOM["_data"][ cKey ] := NIL
    ENDIF

    uOld := hDOM["_data"][ cKey ]

    IF uOld == uValue
        RETURN NIL
    ENDIF

    hDOM["_data"][ cKey ] := uValue
    AAdd( hDOM["_history"], { cKey, uOld, uValue } )
RETURN NIL

FUNCTION DomGet( cKey )

    IF HB_HHasKey( hDOM["_data"], cKey )
        RETURN hDOM["_data"][ cKey ]
    ENDIF

RETURN NIL

// ============================================================================
// DOM CREATE EMPTY
// ============================================================================

PROCEDURE DOM_CreateEmpty()
    hDOM["project"]["name"]               := ""
    hDOM["project"]["path"]               := ""
    hDOM["project"]["status"]           := "INIT"
    hDOM["project"]["modified"]      := .F.
    hDOM["project"]["containers"] := {}
    hDOM["project"]["files"]            := {}
RETURN

// ============================================================================
// DOM LOAD PROJECT
// ============================================================================

PROCEDURE DOM_LoadProject( cProject )
    LOCAL cName

    IF Empty( cProject )
        RETURN
    ENDIF

    IF !File( cProject )
        RETURN
    ENDIF

    cName := hb_fNameName( cProject )
    hDOM["project"]["name"]            := cName
    hDOM["project"]["path"]            := cProject
    hDOM["project"]["status"]        := "PROJECT"
    hDOM["project"]["modified"]    := .F.
    hDOM["project"]["containers"]:= {}
    hDOM["project"]["files"]           := {}

    DOM_LoadContainers()
RETURN

// ============================================================================
// LOAD CONTAINERS
// ============================================================================

PROCEDURE DOM_LoadContainers()
    LOCAL cHBP
    LOCAL cBase
    LOCAL cDir

    LOCAL cFRM
    LOCAL cHBC
    LOCAL cRC

    cHBP   := hDOM["project"]["path"]
    cBase := hb_fNameName( cHBP )
    cDir   := hb_fNameDir( cHBP )

    IF Right( cDir, 1 ) != "\"
        cDir += "\"
    ENDIF

    cFRM := cDir + cBase + ".frm"
    cHBC := cDir + cBase + ".hbc"
    cRC  := cDir + cBase + ".rc"

    // ----------------------------------------------------------------
    // REGISTER CONTAINERS
    // ----------------------------------------------------------------

    DOM_AddContainer( "hbp", cHBP )

    IF File( cFRM )
        DOM_AddContainer( "frm", cFRM )
    ENDIF

    IF File( cHBC )
        DOM_AddContainer( "hbc", cHBC )
    ENDIF

    IF File( cRC )
        DOM_AddContainer( "rc", cRC )
    ENDIF

    // ----------------------------------------------------------------
    // PARSE
    // ----------------------------------------------------------------

    DOM_ParseHBP( cHBP )

    IF File( cFRM )
        DOM_ParseFRM( cFRM )
    ENDIF

RETURN

// ============================================================================
// ADD CONTAINER
// ============================================================================

PROCEDURE DOM_AddContainer( cType, cPath )

    LOCAL hContainer := {=>}

    nDomNextID++

    hContainer["id"]      := nDomNextID
    hContainer["type"] := Lower( cType )
    hContainer["path"] := cPath
    hContainer["name"] := hb_fNameNameExt( cPath )
    hContainer["icon"] := GetFileIconIndex( cPath )

    AAdd( hDOM["project"]["containers"], hContainer )

RETURN

// ============================================================================
// PARSE HBP
// ============================================================================

PROCEDURE DOM_ParseHBP( cHBP )
    LOCAL cContent , aLines , cLine , nI
    LOCAL cDir , cFull , cExt
    LOCAL cName

    IF !File( cHBP )
        RETURN
    ENDIF

    cDir := hb_fNameDir( cHBP )

    IF Right( cDir, 1 ) != "\"
        cDir += "\"
    ENDIF

    cContent := MemoRead( cHBP )
    cContent := StrTran( cContent, Chr(13), "" )
    aLines := hb_ATokens( cContent, Chr(10) )

    FOR nI := 1 TO Len( aLines )

        cLine := AllTrim( aLines[nI] )

        IF Empty( cLine )
            LOOP
        ENDIF

        IF Left( cLine, 1 ) == "#"
            LOOP
        ENDIF

        IF Left( cLine, 1 ) == "-"
            LOOP
        ENDIF

        cLine := StrTran( cLine, "/", "\" )

        //----------------------------------------------------
        // FULL PATH
        //----------------------------------------------------

        IF ":" $ cLine
            cFull := cLine
        ELSE
            cFull := cDir + cLine
        ENDIF

        cExt  := Lower( hb_fNameExt( cFull ) )
        cName := hb_fNameNameExt( cFull )

        //----------------------------------------------------
        // REGISTER FILE
        //----------------------------------------------------

        IF cExt == ".prg" .OR. ;
           cExt == ".c"   .OR. ;
           cExt == ".cpp"

            DOM_AddFile( cFull , "hbp" )

        ENDIF

    NEXT

RETURN

// ============================================================================
// PARSE FRM
// ============================================================================

PROCEDURE DOM_ParseFRM( cFRM )
    LOCAL cContent , aLines , cLine ,  nI , cDir ,  cFull , cExt

    IF !File( cFRM )
        RETURN
    ENDIF

    cDir := hb_fNameDir( cFRM )

    IF Right( cDir, 1 ) != "\"
        cDir += "\"
    ENDIF

    cContent := MemoRead( cFRM )
    cContent := StrTran( cContent, Chr(13), "" )
    aLines := hb_ATokens( cContent, Chr(10) )

    FOR nI := 1 TO Len( aLines )
        cLine := AllTrim( aLines[nI ] )
        IF Empty( cLine )
            LOOP
        ENDIF

        IF Left( cLine, 1 ) == "#"
            LOOP
        ENDIF

        IF Left( cLine, 1 ) == "-"
            LOOP
        ENDIF

        cLine := StrTran( cLine, "/", "\" )

        IF ":" $ cLine
            cFull := cLine
        ELSE
            cFull := cDir + cLine
        ENDIF

        cExt := Lower( hb_fNameExt( cFull ) )

        IF cExt == ".fmg"
            DOM_AddFile( cFull, "frm" )
        ENDIF
    NEXT
RETURN

// ============================================================================
// ADD FILE
// ============================================================================

PROCEDURE DOM_AddFile( cFull, cGroup )
    LOCAL hFile := {=>}
    LOCAL cName , cExt

    IF Empty( cFull )
        RETURN
    ENDIF

    IF DOM_FindFileByPath( cFull ) != NIL
        RETURN
    ENDIF

    cName := hb_fNameNameExt( cFull )
    cExt  := Lower( hb_fNameExt( cFull ) )

    nDomNextID++

    hFile["id"]             := nDomNextID
    hFile["name"]         := cName
    hFile["path"]         := cFull
    hFile["ext"]           := cExt
    hFile["group"]      := cGroup
    hFile["opened"]    := .F.
    hFile["dirty"]      := .F.
    hFile["encoding"]:= "utf8"
    hFile["icon"]         := GetFileIconIndex( cFull )

    DO CASE

        CASE cExt == ".prg"
            hFile["type"] := "source"

        CASE cExt == ".c"
            hFile["type"] := "c"

        CASE cExt == ".cpp"
            hFile["type"] := "cpp"

        CASE cExt == ".fmg"
            hFile["type"] := "form"

        OTHERWISE
            hFile["type"] := "unknown"
    ENDCASE

    AAdd( hDOM["project"]["files"], hFile )
    hDOM["project"]["modified"] := .T.
RETURN

// ============================================================================
// FIND FILE
// ============================================================================

FUNCTION DOM_FindFileByPath( cPath )
    LOCAL aFiles := hDOM["project"]["files"]
    LOCAL nI 
	
    FOR nI := 1 TO Len( aFiles )
        IF Upper( aFiles[nI]["path"] ) == Upper( cPath )
            RETURN aFiles[nI]
        ENDIF
    NEXT
RETURN NIL

FUNCTION DOM_GetPath( nIndex )
    LOCAL aFiles , hFile , nI

    IF Empty( nIndex )
        RETURN ""
    ENDIF

    IF !HB_HHasKey( hDOM, "project" )
        RETURN ""
    ENDIF

    IF !HB_HHasKey( hDOM["project"], "files" )
        RETURN ""
    ENDIF

    aFiles := hDOM["project"]["files"]

    FOR nI := 1 TO Len( aFiles )
        hFile := aFiles[nI]
        IF ValType( hFile ) == "H"
            IF hb_HGetDef( hFile, "treeid", 0 ) == nIndex
                RETURN hb_HGetDef( hFile, "path", "" )
            ENDIF
        ENDIF
    NEXT
RETURN ""

PROCEDURE InitProjectStructure()
   hDOM["project_name"] := "Untitled"
   hDOM["status"]              := "EMPTY"
RETURN

// ============================================================================
// BUILD TREE
// ============================================================================
FUNCTION BuildTreeFromDOM()
    LOCAL aContainers := hDOM["project"]["containers"]
    LOCAL aFiles      := hDOM["project"]["files"]

    LOCAL nI , nJ
    LOCAL hContainer , hFile

    LOCAL nRoot
    LOCAL nProject

    LOCAL nHBP := 0
    LOCAL nFRM := 0
    LOCAL nHBC := 0
    LOCAL nRC  := 0

    LOCAL nTreeID

    IF .NOT. IsWindowDefined( "Inspector" )
        RETURN NIL
    ENDIF

    DoMethod( "Inspector", "Tree_Project", "DisableUpdate" )
    DoMethod( "Inspector", "Tree_Project", "DeleteAllItems" )

    // ----------------------------------------------------------------
    // INIT
    // ----------------------------------------------------------------

    IF hDOM["project"]["status"] == "INIT"

        DoMethod( ;
            "Inspector", ;
            "Tree_Project", ;
            "AddItem", ;
            "IDE Unicode v0.12", ;
            0, ;
            5 )

        DoMethod( ;
            "Inspector", ;
            "Tree_Project", ;
            "AddItem", ;
            "No open project", ;
            1, ;
            6 )

        DoMethod( "Inspector", "Tree_Project", "EnableUpdate" )
        DoMethod( "Inspector", "Tree_Project", "Refresh" )

        RETURN NIL

    ENDIF

    // ----------------------------------------------------------------
    // ROOT
    // ----------------------------------------------------------------

    DoMethod( ;
        "Inspector", ;
        "Tree_Project", ;
        "AddItem", ;
        "IDE Unicode v0.12", ;
        0, ;
        1 )

    nRoot := GetProperty( ;
        "Inspector", ;
        "Tree_Project", ;
        "ItemCount" )

    // ----------------------------------------------------------------
    // PROJECT
    // ----------------------------------------------------------------

    DoMethod( ;
        "Inspector", ;
        "Tree_Project", ;
        "AddItem", ;
        hDOM["project"]["name"], ;
        nRoot, ;
        6 )

    nProject := GetProperty( ;
        "Inspector", ;
        "Tree_Project", ;
        "ItemCount" )

    // ----------------------------------------------------------------
    // CONTAINERS
    // ----------------------------------------------------------------

    FOR nI := 1 TO Len( aContainers )

        hContainer := aContainers[nI]

        DoMethod( ;
            "Inspector", ;
            "Tree_Project", ;
            "AddItem", ;
            hContainer["name"], ;
            nProject, ;
            hContainer["icon"] )

        nTreeID := GetProperty( ;
            "Inspector", ;
            "Tree_Project", ;
            "ItemCount" )

        hContainer["treeid"] := nTreeID

        DO CASE

            CASE hContainer["type"] == "hbp"
                nHBP := nTreeID

            CASE hContainer["type"] == "frm"
                nFRM := nTreeID

            CASE hContainer["type"] == "hbc"
                nHBC := nTreeID

            CASE hContainer["type"] == "rc"
                nRC := nTreeID

        ENDCASE

    NEXT

    // ----------------------------------------------------------------
    // FILES
    // ----------------------------------------------------------------

    FOR nJ := 1 TO Len( aFiles )

        hFile := aFiles[nJ]

        DO CASE

            CASE hFile["group"] == "hbp"
                IF nHBP > 0
                    DoMethod( ;
                        "Inspector", ;
                        "Tree_Project", ;
                        "AddItem", ;
                        hFile["name"], ;
                        nHBP, ;
                        hFile["icon"] )
                ENDIF

            CASE hFile["group"] == "frm"
                IF nFRM > 0
                    DoMethod( ;
                        "Inspector", ;
                        "Tree_Project", ;
                        "AddItem", ;
                        hFile["name"], ;
                        nFRM, ;
                        hFile["icon"] )
                ENDIF

            CASE hFile["group"] == "hbc"
                IF nHBC > 0
                    DoMethod( ;
                        "Inspector", ;
                        "Tree_Project", ;
                        "AddItem", ;
                        hFile["name"], ;
                        nHBC, ;
                        hFile["icon"] )
                ENDIF

            CASE hFile["group"] == "rc"
                IF nRC > 0
                    DoMethod( ;
                        "Inspector", ;
                        "Tree_Project", ;
                        "AddItem", ;
                        hFile["name"], ;
                        nRC, ;
                        hFile["icon"] )
                ENDIF

        ENDCASE

        //-------------------------------------------------------------
        // CAPTURE REAL TREE ID
        //-------------------------------------------------------------

        nTreeID := GetProperty( ;
            "Inspector", ;
            "Tree_Project", ;
            "ItemCount" )

        hFile["treeid"] := nTreeID

    NEXT

    // ----------------------------------------------------------------
    // EXPAND
    // ----------------------------------------------------------------

    IF nRoot > 0
        DoMethod( "Inspector", "Tree_Project", "Expand", nRoot )
    ENDIF

    IF nProject > 0
        DoMethod( "Inspector", "Tree_Project", "Expand", nProject )
    ENDIF

    IF nHBP > 0
        DoMethod( "Inspector", "Tree_Project", "Expand", nHBP )
    ENDIF

    IF nFRM > 0
        DoMethod( "Inspector", "Tree_Project", "Expand", nFRM )
    ENDIF

    IF nHBC > 0
        DoMethod( "Inspector", "Tree_Project", "Expand", nHBC )
    ENDIF

    IF nRC > 0
        DoMethod( "Inspector", "Tree_Project", "Expand", nRC )
    ENDIF

    // ----------------------------------------------------------------
    // DEFAULT SELECT
    // ----------------------------------------------------------------

    SetProperty( "Inspector", "Tree_Project", "Value", 1 )

    DoMethod( "Inspector", "Tree_Project", "EnableUpdate" )
    DoMethod( "Inspector", "Tree_Project", "Refresh" )

    ConsoleLog( ;
        "UI: Tree rebuilt -> " + ;
        hb_ntos( Len( aFiles ) ) + ;
        " files", ;
        "SUCCESS" )

RETURN NIL

// ============================================================================
// SAVE PROJECT
// ============================================================================

PROCEDURE DOM_SaveProject()
   LOCAL cProject := DomGet( "project_path" )

   IF Empty( cProject )
      RETURN
   ENDIF

   Project_SyncHBP()
   ConsoleLog( "DOM: project saved", "SUCCESS" )
RETURN

PROCEDURE Project_SyncHBP()
   LOCAL cProject := DomGet( "project_path" )
   LOCAL aModules
   LOCAL i
   LOCAL cContent := ""

   IF Empty( cProject )
      RETURN
   ENDIF

   IF !HB_HHasKey( hDOM, "modules" )
      RETURN
   ENDIF

   aModules := hDOM["modules"]

   FOR i := 1 TO Len( aModules )
      cContent += aModules[i] + hb_eol()
   NEXT

   MemoWrit( cProject, cContent )
   ConsoleLog( "PROJECT: .hbp synced", "SUCCESS" )
RETURN

// ============================================================================
// ICONS
// ============================================================================

FUNCTION GetFileIconIndex( cFile )

    LOCAL cExt   := Lower( hb_fNameExt( cFile ) )
    LOCAL nIcono := 6

    DO CASE
        CASE cExt == ".hbp"
            nIcono := 1

        CASE cExt == ".prg" .OR. cExt == ".c"   .OR. cExt == ".cpp"
            nIcono := 2

        CASE cExt == ".rc"
            nIcono := 3

        CASE cExt == ".ch" .OR. cExt == ".h"
            nIcono := 4

        CASE cExt == ".frm"
            nIcono := 7

        CASE cExt == ".fmg"
            nIcono := 8

        CASE cExt == ".hbc"
            nIcono := 9

        CASE Empty( cExt )
            nIcono := 5
    ENDCASE
RETURN nIcono
tengo todavia unas discrepancias entre DOM y el TREE de HMG pero espero corregir estos dias siguiente.. espero les guste esa forma de trabajar]]>
<![CDATA[General :: Re: IDE proyecto nuevo :: Reply by quartz565]]> 2026-05-15T21:38:33+00:00 2026-05-15T21:38:33+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72292#p72292 <![CDATA[General :: Re: IDE proyecto nuevo :: Reply by Steed]]> 2026-05-20T21:14:54+00:00 2026-05-20T21:14:54+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72302#p72302 <![CDATA[HMG Source :: Re: ROMPECABEZAS VINTAGE :: Reply by LOUIS]]> 2026-04-28T16:49:21+00:00 2026-04-28T16:49:21+00:00 http://mail.hmgforum.com/viewtopic.php?f=8&t=7492&p=72243#p72243
Aquí les traigo la última actualización del Rompecabezas Vintage, ya corregí cuando pasaba al juego #2 que los cuadros aparecían en fondo blanco y a medida que se iba jugando se volvían azules ... Eso ya quedó solucionado y ahora sí el juego está ok

Saludos
Louis

Attachments


JUEGO2.jpg (235.1 KiB)

ROMPECAB.rar (407.5 KiB)
]]>

Aquí les traigo la última actualización del Rompecabezas Vintage, ya corregí cuando pasaba al juego #2 que los cuadros aparecían en fondo blanco y a medida que se iba jugando se volvían azules ... Eso ya quedó solucionado y ahora sí el juego está ok

Saludos
Louis

Attachments


JUEGO2.jpg (235.1 KiB)

ROMPECAB.rar (407.5 KiB)
]]>
<![CDATA[HMG Source :: Re: ROMPECABEZAS VINTAGE :: Reply by serge_girard]]> 2026-04-29T05:24:10+00:00 2026-04-29T05:24:10+00:00 http://mail.hmgforum.com/viewtopic.php?f=8&t=7492&p=72246#p72246 <![CDATA[My HMG Projects :: 🚀 HMG Extended Edition – Build 26.04 Now Available! :: Author gfilatov]]> 2026-04-24T09:05:53+00:00 2026-04-24T09:05:53+00:00 http://mail.hmgforum.com/viewtopic.php?f=15&t=7746&p=72234#p72234
We are pleased to announce the release of HMG Extended Edition – Build 26.04 (2026/04/24).

This release brings a series of refinements and internal improvements aimed at enhancing stability, maintainability, and overall developer experience. It includes control-level updates, performance optimizations, toolchain upgrades, and refreshed sample applications to better support modern development workflows.

🔹 Key Highlights

Core (C Layer) Improvements

* Control Miscellaneous Module
Major refactoring and code cleanup to improve structure and maintainability.

* Font Handling
Refactored for improved clarity, safety, and cross-platform compatibility.

* Cursor Handling
Revised for better consistency and long-term maintainability.

* Icon Handling
Codebase cleaned up and reorganized for clarity (no functional changes).

* ToolBar Handling
Internal updates and optimizations.

* StatusBar Handling
Enhancements for consistency and stability.

* MessageBox Handling
Improvements to internal implementation.

🔹 Libraries & Toolchain Updates

* HbSQLite3 Library (PRO version)
Updated to SQLite 3.53.0 (previously 3.52.0).

* Harbour Compiler 3.2.0dev (SVN 2026-02-28 15:33)

* Updated libpng to version 1.6.58 (from 1.6.55).

🔹 Samples & Applications

* Updated “Get Form Client Height” sample
* Fully refactored “Font Measurement Utility” sample
* Updated “HbZipArc Usage” sample
* Updated “Arkanoid Mini Game 3.0” (by Edward)
* Updated “Tetris Game” (by Claudio Soto)

📥 Downloads

STANDARD Build
https://hmgextended.com/files/CONTRIB/h ... -setup.zip

* Built with Borland C++ 5.8.2
* ⚠ This build is not recommended for production use.

---

🔐 PROFESSIONAL Build

* https://hmgextended.com/files/CONTRIB/hmg-26.04-pro.7z
* https://hmgextended.org/files/CONTRIB/hmg-26.04-pro.7z

The PROFESSIONAL build is production-ready, stable, and represents the recommended upgrade path.
Access credentials (password) are shared with project donors.

---

We extend our sincere thanks to all contributors, testers, and supporters whose efforts continue to improve and sustain the HMG ecosystem.

Best regards,
Grigory Filatov
on behalf of the MiniGUI Team]]>

We are pleased to announce the release of HMG Extended Edition – Build 26.04 (2026/04/24).

This release brings a series of refinements and internal improvements aimed at enhancing stability, maintainability, and overall developer experience. It includes control-level updates, performance optimizations, toolchain upgrades, and refreshed sample applications to better support modern development workflows.

🔹 Key Highlights

Core (C Layer) Improvements

* Control Miscellaneous Module
Major refactoring and code cleanup to improve structure and maintainability.

* Font Handling
Refactored for improved clarity, safety, and cross-platform compatibility.

* Cursor Handling
Revised for better consistency and long-term maintainability.

* Icon Handling
Codebase cleaned up and reorganized for clarity (no functional changes).

* ToolBar Handling
Internal updates and optimizations.

* StatusBar Handling
Enhancements for consistency and stability.

* MessageBox Handling
Improvements to internal implementation.

🔹 Libraries & Toolchain Updates

* HbSQLite3 Library (PRO version)
Updated to SQLite 3.53.0 (previously 3.52.0).

* Harbour Compiler 3.2.0dev (SVN 2026-02-28 15:33)

* Updated libpng to version 1.6.58 (from 1.6.55).

🔹 Samples & Applications

* Updated “Get Form Client Height” sample
* Fully refactored “Font Measurement Utility” sample
* Updated “HbZipArc Usage” sample
* Updated “Arkanoid Mini Game 3.0” (by Edward)
* Updated “Tetris Game” (by Claudio Soto)

📥 Downloads

STANDARD Build
https://hmgextended.com/files/CONTRIB/h ... -setup.zip

* Built with Borland C++ 5.8.2
* ⚠ This build is not recommended for production use.

---

🔐 PROFESSIONAL Build

* https://hmgextended.com/files/CONTRIB/hmg-26.04-pro.7z
* https://hmgextended.org/files/CONTRIB/hmg-26.04-pro.7z

The PROFESSIONAL build is production-ready, stable, and represents the recommended upgrade path.
Access credentials (password) are shared with project donors.

---

We extend our sincere thanks to all contributors, testers, and supporters whose efforts continue to improve and sustain the HMG ecosystem.

Best regards,
Grigory Filatov
on behalf of the MiniGUI Team]]>
<![CDATA[My HMG Projects :: Re: 🚀 HMG Extended Edition – Build 26.04 Now Available! :: Reply by ASESORMIX]]> 2026-04-24T12:30:53+00:00 2026-04-24T12:30:53+00:00 http://mail.hmgforum.com/viewtopic.php?f=15&t=7746&p=72235#p72235 <![CDATA[My HMG Projects :: Elimina numeros :: Author LOUIS]]> 2026-05-07T02:24:47+00:00 2026-05-07T19:25:51+00:00 http://mail.hmgforum.com/viewtopic.php?f=15&t=7750&p=72267#p72267
No se si esta sea la última vez que Yo escriba aquí, ya que desde febrero de este año me diagnosticaron cáncer a la garganta y este se me ha expandido en forma brutal, no quiero entrar en detalles para no cansaros.

Este juego es individual, pero se puede hacer una competición entre 2 o 3 amigos ...
en cualquier momento si desea salir es con Esc.

La imagen que muestro es un ejemplo dejado a propósito, para que vean cómo se pueden eliminar 2 números entre si, a pesar que a inicios del programa, muestra instrucciones del juego -solo con mouse- .

Saludos desde Guayaquil-Ecuador
Louis

P.D.- Para los que son creyentes en Dios, sólo les pido me incluyan en sus oraciones.
P.D.- If you believe in God, pray for me.

Attachments


20x10.jpg (313.01 KiB)

20x10.rar (60.14 KiB)
]]>

No se si esta sea la última vez que Yo escriba aquí, ya que desde febrero de este año me diagnosticaron cáncer a la garganta y este se me ha expandido en forma brutal, no quiero entrar en detalles para no cansaros.

Este juego es individual, pero se puede hacer una competición entre 2 o 3 amigos ...
en cualquier momento si desea salir es con Esc.

La imagen que muestro es un ejemplo dejado a propósito, para que vean cómo se pueden eliminar 2 números entre si, a pesar que a inicios del programa, muestra instrucciones del juego -solo con mouse- .

Saludos desde Guayaquil-Ecuador
Louis

P.D.- Para los que son creyentes en Dios, sólo les pido me incluyan en sus oraciones.
P.D.- If you believe in God, pray for me.

Attachments


20x10.jpg (313.01 KiB)

20x10.rar (60.14 KiB)
]]>
<![CDATA[My HMG Projects :: Re: Elimina numeros :: Reply by danielmaximiliano]]> 2026-05-07T05:21:29+00:00 2026-05-07T05:21:29+00:00 http://mail.hmgforum.com/viewtopic.php?f=15&t=7750&p=72268#p72268 pronta recuperacion Saludos !!!!]]> pronta recuperacion Saludos !!!!]]> <![CDATA[My HMG Projects :: Re: Elimina numeros :: Reply by serge_girard]]> 2026-05-07T05:43:21+00:00 2026-05-07T05:43:21+00:00 http://mail.hmgforum.com/viewtopic.php?f=15&t=7750&p=72269#p72269
I will pray for you!

Stay strong!!

Most 'cancer a la garganta' can be cured today.


Serge]]>

I will pray for you!

Stay strong!!

Most 'cancer a la garganta' can be cured today.


Serge]]>
<![CDATA[My HMG Projects :: Re: Elimina numeros :: Reply by Steed]]> 2026-05-07T16:19:51+00:00 2026-05-07T16:19:51+00:00 http://mail.hmgforum.com/viewtopic.php?f=15&t=7750&p=72270#p72270 <![CDATA[My HMG Projects :: Re: Elimina numeros :: Reply by martingz]]> 2026-05-07T17:03:16+00:00 2026-05-07T17:03:16+00:00 http://mail.hmgforum.com/viewtopic.php?f=15&t=7750&p=72271#p72271

saludos]]>


saludos]]>
<![CDATA[My HMG Projects :: Re: Elimina numeros :: Reply by mustafa]]> 2026-05-08T15:20:50+00:00 2026-05-08T15:20:50+00:00 http://mail.hmgforum.com/viewtopic.php?f=15&t=7750&p=72276#p72276 Espero que te mejores, aun recuerdo, la "batalla" de la aplicación del Bingo, que montamos.
un fuerte abrazo amigo
Mustafa]]>
Espero que te mejores, aun recuerdo, la "batalla" de la aplicación del Bingo, que montamos.
un fuerte abrazo amigo
Mustafa]]>
<![CDATA[My HMG Projects :: Re: Elimina numeros :: Reply by LOUIS]]> 2026-05-09T02:21:55+00:00 2026-05-09T02:21:55+00:00 http://mail.hmgforum.com/viewtopic.php?f=15&t=7750&p=72277#p72277
Bajen por favor esta actualización, ya que había dejado algo inconcluso.

Al hacer el fondo azul, es como un grado de dificultad que añadí, al que juega libre de tiempo ... Pero al que juega a Presión, le dejé el fondo normal de la cuadrícula para que no se le complique.

Sí me acuerdo Sr. Mustafa, fue un buen proyecto, su colaboración fue muy importante, así como el de las demás personas que participaron.

Saludos a todos
Louis

P.D.- Por favor díganme si les gustó, para poder irme contento ...

Attachments


20x10NEW.jpg (214.74 KiB)

20x10.rar (3.91 KiB)
]]>

Bajen por favor esta actualización, ya que había dejado algo inconcluso.

Al hacer el fondo azul, es como un grado de dificultad que añadí, al que juega libre de tiempo ... Pero al que juega a Presión, le dejé el fondo normal de la cuadrícula para que no se le complique.

Sí me acuerdo Sr. Mustafa, fue un buen proyecto, su colaboración fue muy importante, así como el de las demás personas que participaron.

Saludos a todos
Louis

P.D.- Por favor díganme si les gustó, para poder irme contento ...

Attachments


20x10NEW.jpg (214.74 KiB)

20x10.rar (3.91 KiB)
]]>
<![CDATA[My HMG Projects :: Re: Elimina numeros :: Reply by franco]]> 2026-05-09T15:20:51+00:00 2026-05-09T15:20:51+00:00 http://mail.hmgforum.com/viewtopic.php?f=15&t=7750&p=72278#p72278 Franco]]> Franco]]> <![CDATA[My HMG Projects :: Re: Elimina numeros :: Reply by danielmaximiliano]]> 2026-05-11T03:01:22+00:00 2026-05-11T03:01:22+00:00 http://mail.hmgforum.com/viewtopic.php?f=15&t=7750&p=72281#p72281 espero no me tome adiccion como el tetris y que era el segundo juego ,, el primero fue Eggerland Mistery de la MSX 2 :)]]> espero no me tome adiccion como el tetris y que era el segundo juego ,, el primero fue Eggerland Mistery de la MSX 2 :)]]> <![CDATA[My HMG Projects :: Re: Elimina numeros :: Reply by LOUIS]]> 2026-05-11T22:31:32+00:00 2026-05-11T22:31:32+00:00 http://mail.hmgforum.com/viewtopic.php?f=15&t=7750&p=72285#p72285
La pregunta es, limpiará alguien el tablero ? ... Yo llegué a 95 en modo normal ... a presión llegué a 80

Hay 2 formas de jugar en modo normal, por si no lo descubrieron ... :mrgreen:
El primero, empiezas a jugar y pides 2 filas más y así sucesivamente ...
El segundo, no juegas nada y empiezas a pedir filas, hasta completar el tablero, entonces tienes una panorámica total del tablero lleno y tú elijes por dónde empezar ...

Vamos, que alguien me diga que le gusta !

Saludos
Louis

P.D.- Recuerden que el juego se aborta en cualquier momento con Esc.]]>

La pregunta es, limpiará alguien el tablero ? ... Yo llegué a 95 en modo normal ... a presión llegué a 80

Hay 2 formas de jugar en modo normal, por si no lo descubrieron ... :mrgreen:
El primero, empiezas a jugar y pides 2 filas más y así sucesivamente ...
El segundo, no juegas nada y empiezas a pedir filas, hasta completar el tablero, entonces tienes una panorámica total del tablero lleno y tú elijes por dónde empezar ...

Vamos, que alguien me diga que le gusta !

Saludos
Louis

P.D.- Recuerden que el juego se aborta en cualquier momento con Esc.]]>
<![CDATA[My HMG Projects :: Re: Elimina numeros :: Reply by LOUIS]]> 2026-05-13T00:39:07+00:00 2026-05-13T00:39:07+00:00 http://mail.hmgforum.com/viewtopic.php?f=15&t=7750&p=72287#p72287

Attachments


92 PARES.jpg (174.86 KiB)

]]>

Attachments


92 PARES.jpg (174.86 KiB)

]]>
<![CDATA[My HMG Projects :: Re: Elimina numeros :: Reply by quartz565]]> 2026-05-15T21:43:55+00:00 2026-05-15T21:43:55+00:00 http://mail.hmgforum.com/viewtopic.php?f=15&t=7750&p=72293#p72293
I will pray for you!

Stay positive friend.]]>

I will pray for you!

Stay positive friend.]]>
<![CDATA[General Discussions :: World HMG Day 2026 :: Author Rathinagiri]]> 2026-05-15T03:07:33+00:00 2026-05-15T03:07:33+00:00 http://mail.hmgforum.com/viewtopic.php?f=12&t=7752&p=72289#p72289
Today is our HMG Founder Roberto's Birthday! Let us celebrate the same.

Wish you many more happy returns of the day Roberto!
Gemini_Generated_Image_derzbgderzbgderz.png
ChatGPT Image May 15, 2026, 08_36_06 AM.png

Attachments


ChatGPT Image May 15, 2026, 08_36_06 AM.png (2694.85 KiB)


Gemini_Generated_Image_derzbgderzbgderz.png (8487.84 KiB)

]]>

Today is our HMG Founder Roberto's Birthday! Let us celebrate the same.

Wish you many more happy returns of the day Roberto!
Gemini_Generated_Image_derzbgderzbgderz.png
ChatGPT Image May 15, 2026, 08_36_06 AM.png

Attachments


ChatGPT Image May 15, 2026, 08_36_06 AM.png (2694.85 KiB)


Gemini_Generated_Image_derzbgderzbgderz.png (8487.84 KiB)

]]>
<![CDATA[General Discussions :: Re: World HMG Day 2026 :: Reply by gfilatov]]> 2026-05-15T08:46:52+00:00 2026-05-15T08:46:52+00:00 http://mail.hmgforum.com/viewtopic.php?f=12&t=7752&p=72291#p72291
Happy Birthday!

Today, we celebrate not only your special day but also the incredible legacy you have built for the developer community around the world. Your dedication, vision, and passion for Harbour/XBase technologies have inspired countless programmers and helped transform ideas into powerful applications.

Your work with the Win32 API Wrapper HMG library has opened doors for developers to modernize Clipper-based systems and create robust GUI applications with confidence and creativity. The impact of your contribution is truly remarkable and deeply appreciated by everyone who has benefited from your knowledge and innovation.

Beyond technology, your generosity in sharing wisdom, supporting developers, and strengthening the Harbour/XBase community continues to motivate people across generations of programmers.

May this birthday bring you good health, happiness, peace, and continued success in all that you do. Thank you for being a pioneer, a mentor, and a guiding force for so many.

Your work lives on in the software we build and in the community you helped shape.

With heartfelt gratitude and admiration,

Happy Birthday, Roberto! 🎉]]>

Happy Birthday!

Today, we celebrate not only your special day but also the incredible legacy you have built for the developer community around the world. Your dedication, vision, and passion for Harbour/XBase technologies have inspired countless programmers and helped transform ideas into powerful applications.

Your work with the Win32 API Wrapper HMG library has opened doors for developers to modernize Clipper-based systems and create robust GUI applications with confidence and creativity. The impact of your contribution is truly remarkable and deeply appreciated by everyone who has benefited from your knowledge and innovation.

Beyond technology, your generosity in sharing wisdom, supporting developers, and strengthening the Harbour/XBase community continues to motivate people across generations of programmers.

May this birthday bring you good health, happiness, peace, and continued success in all that you do. Thank you for being a pioneer, a mentor, and a guiding force for so many.

Your work lives on in the software we build and in the community you helped shape.

With heartfelt gratitude and admiration,

Happy Birthday, Roberto! 🎉]]>
<![CDATA[General Discussions :: Re: World HMG Day 2026 :: Reply by mustafa]]> 2026-05-16T11:54:49+00:00 2026-05-16T11:54:49+00:00 http://mail.hmgforum.com/viewtopic.php?f=12&t=7752&p=72294#p72294 Mustafa]]> Mustafa]]> <![CDATA[General Discussions :: Re: World HMG Day 2026 :: Reply by danielmaximiliano]]> 2026-05-18T22:18:32+00:00 2026-05-18T22:18:32+00:00 http://mail.hmgforum.com/viewtopic.php?f=12&t=7752&p=72297#p72297 <![CDATA[General Discussions :: Re: World HMG Day 2026 :: Reply by mol]]> 2026-05-20T18:39:29+00:00 2026-05-20T18:39:29+00:00 http://mail.hmgforum.com/viewtopic.php?f=12&t=7752&p=72300#p72300 Happy HMG Days for all for everytime!]]> Happy HMG Days for all for everytime!]]> <![CDATA[General Discussions :: Re: World HMG Day 2026 :: Reply by Steed]]> 2026-05-20T21:12:20+00:00 2026-05-20T21:12:20+00:00 http://mail.hmgforum.com/viewtopic.php?f=12&t=7752&p=72301#p72301