<![CDATA[HMGforum.com]]> http://mail.hmgforum.com Smartfeed extension for phpBB <![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 General Help :: MicroSoft :: Author serge_girard]]> 2026-06-03T14:21:37+00:00 2026-06-03T14:21:37+00:00 http://mail.hmgforum.com/viewtopic.php?f=5&t=7755&p=72308#p72308
https://thenextweb.com/news/microsoft-p ... build-2026]]>

https://thenextweb.com/news/microsoft-p ... build-2026]]>
<![CDATA[HMG General Help :: Re: MicroSoft :: Reply by franco]]> 2026-06-05T16:21:04+00:00 2026-06-05T16:21:04+00:00 http://mail.hmgforum.com/viewtopic.php?f=5&t=7755&p=72309#p72309 Any thoughts on what could this do for us.]]> Any thoughts on what could this do for us.]]> <![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[General :: Re: IDE proyecto nuevo :: Reply by danielmaximiliano]]> 2026-05-28T07:35:22+00:00 2026-05-28T07:35:22+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72306#p72306 como no saben como esta el proyecto les comento:
hice muchos cambios porque llegue a un punto que escribi mucho codigo redundante y el resultado era que seguia estancado. :(
asi que tuve que estudiar de nuevo mi viejo codigo en pascal para resolver el problema.. despues encontre que muchos debian corregir sus proyectos para trabajar con en nuevo IDE :?

con la ayuda de ChatGPT resolvi una porcion de codigo que me permitio hacer que los viejos proyectos puedan cargarse dentro del nuevo IDE.
resultado :
[04:08:36] PROJECT: Open -> C:\Temp\Zbar\Zbar.hbp
[04:08:36] PROJECT MODE -> MODERN
[04:08:36] LOAD: project ready -> Zbar
[04:08:36] CONTAINER READ -> C:\Temp\Zbar\Zbar.hbp
[04:08:36] CONTAINER FILE -> C:\Temp\Zbar\Source\Main.Prg
[04:08:36] CONTAINER FILE -> C:\Temp\Zbar\Source\Camera.Prg
[04:08:36] CONTAINER FILE -> C:\Temp\Zbar\Source\Wrapper.Prg
[04:08:36] CONTAINER FILE -> C:\Temp\Zbar\Source\zbar_wrapper.prg
[04:08:36] CONTAINER READ -> C:\Temp\Zbar\Zbar.frm
[04:08:36] CONTAINER empty -> C:\Temp\Zbar\Zbar.frm
[04:08:36] UI: Tree rebuilt -> 2 containers
[04:08:36] PROJECT: Loaded
[04:09:13] PROJECT: Open -> C:\hmg.3.6\SAMPLES\Advanced\HMGTALK\HmgTalkServer\HmgTalkServer.hbp
[04:09:13] PROJECT MODE -> LEGACY
[04:09:13] LOAD: project ready -> HmgTalkServer
[04:09:13] CONTAINER READ -> C:\hmg.3.6\SAMPLES\Advanced\HMGTALK\HmgTalkServer\HmgTalkServer.hbp
[04:09:13] CONTAINER FILE -> C:\hmg.3.6\SAMPLES\Advanced\HMGTALK\HmgTalkServer\hmgtalkserver.prg
[04:09:13] CONTAINER READ -> C:\hmg.3.6\SAMPLES\Advanced\HMGTALK\HmgTalkServer\HmgTalkServer.frm
[04:09:13] CONTAINER empty -> C:\hmg.3.6\SAMPLES\Advanced\HMGTALK\HmgTalkServer\HmgTalkServer.frm
[04:09:13] UI: Tree rebuilt -> 2 containers
[04:09:13] PROJECT: Loaded
PROJECT MODE : LEGACY / MODERN
LEGACY : todo en la misma carpeta :roll:
MODERN: cada Source, Form, Include, Resource, Lib en su respectiva carpeta como los nuevos IDEs.

ahora debo hacer que esto deba estar normalizado a UpperCase:
06/04/2026 15:16 2.247 Main.Prg
06/04/2026 14:52 1.050 prueba.Prg
esto es : DISPLAY/UI -> original case
DOM INTERNAL -> UPPERCASE normalized
FILESYSTEM ACCESS -> original/full normalized path

voy a descansar y pensar como seguir con la mente fresca despues de trabajar . Saludos!!!!]]>
como no saben como esta el proyecto les comento:
hice muchos cambios porque llegue a un punto que escribi mucho codigo redundante y el resultado era que seguia estancado. :(
asi que tuve que estudiar de nuevo mi viejo codigo en pascal para resolver el problema.. despues encontre que muchos debian corregir sus proyectos para trabajar con en nuevo IDE :?

con la ayuda de ChatGPT resolvi una porcion de codigo que me permitio hacer que los viejos proyectos puedan cargarse dentro del nuevo IDE.
resultado :
[04:08:36] PROJECT: Open -> C:\Temp\Zbar\Zbar.hbp
[04:08:36] PROJECT MODE -> MODERN
[04:08:36] LOAD: project ready -> Zbar
[04:08:36] CONTAINER READ -> C:\Temp\Zbar\Zbar.hbp
[04:08:36] CONTAINER FILE -> C:\Temp\Zbar\Source\Main.Prg
[04:08:36] CONTAINER FILE -> C:\Temp\Zbar\Source\Camera.Prg
[04:08:36] CONTAINER FILE -> C:\Temp\Zbar\Source\Wrapper.Prg
[04:08:36] CONTAINER FILE -> C:\Temp\Zbar\Source\zbar_wrapper.prg
[04:08:36] CONTAINER READ -> C:\Temp\Zbar\Zbar.frm
[04:08:36] CONTAINER empty -> C:\Temp\Zbar\Zbar.frm
[04:08:36] UI: Tree rebuilt -> 2 containers
[04:08:36] PROJECT: Loaded
[04:09:13] PROJECT: Open -> C:\hmg.3.6\SAMPLES\Advanced\HMGTALK\HmgTalkServer\HmgTalkServer.hbp
[04:09:13] PROJECT MODE -> LEGACY
[04:09:13] LOAD: project ready -> HmgTalkServer
[04:09:13] CONTAINER READ -> C:\hmg.3.6\SAMPLES\Advanced\HMGTALK\HmgTalkServer\HmgTalkServer.hbp
[04:09:13] CONTAINER FILE -> C:\hmg.3.6\SAMPLES\Advanced\HMGTALK\HmgTalkServer\hmgtalkserver.prg
[04:09:13] CONTAINER READ -> C:\hmg.3.6\SAMPLES\Advanced\HMGTALK\HmgTalkServer\HmgTalkServer.frm
[04:09:13] CONTAINER empty -> C:\hmg.3.6\SAMPLES\Advanced\HMGTALK\HmgTalkServer\HmgTalkServer.frm
[04:09:13] UI: Tree rebuilt -> 2 containers
[04:09:13] PROJECT: Loaded
PROJECT MODE : LEGACY / MODERN
LEGACY : todo en la misma carpeta :roll:
MODERN: cada Source, Form, Include, Resource, Lib en su respectiva carpeta como los nuevos IDEs.

ahora debo hacer que esto deba estar normalizado a UpperCase:
06/04/2026 15:16 2.247 Main.Prg
06/04/2026 14:52 1.050 prueba.Prg
esto es : DISPLAY/UI -> original case
DOM INTERNAL -> UPPERCASE normalized
FILESYSTEM ACCESS -> original/full normalized path

voy a descansar y pensar como seguir con la mente fresca despues de trabajar . Saludos!!!!]]>
<![CDATA[General :: Re: IDE proyecto nuevo :: Reply by serge_girard]]> 2026-05-28T09:37:03+00:00 2026-05-28T09:37:03+00:00 http://mail.hmgforum.com/viewtopic.php?f=24&t=7745&p=72307#p72307 <![CDATA[My HMG Projects :: 🚀 HMG Extended Edition – Build 26.05 Now Available! :: Author gfilatov]]> 2026-05-25T09:06:41+00:00 2026-05-25T09:06:41+00:00 http://mail.hmgforum.com/viewtopic.php?f=15&t=7754&p=72303#p72303
We are pleased to announce the release of HMG Extended Edition – Build 26.05 (2026/05/25).

This build delivers a broad set of refinements across the framework, with a strong focus on code maintainability, internal consistency, improved control handling, updated libraries/toolchain components, and enhanced sample applications. While most changes are internal refactorings with full backward compatibility preserved, several areas also received safety, readability, and minor performance improvements.

---

🔹 Key Highlights

🔹 Core Improvements

* Extensive refactoring and cleanup across multiple controls and core modules for:

* improved readability
* maintainability
* consistency
* safer WinAPI handling
* cleaner Unicode/ANSI processing
* reduced code duplication

Updated and improved modules include:

* Font management and enumeration
* Dialogs and common controls interfaces
* INI file handling
* BROWSE handling
* GRID handling
* EDITBOX handling
* CheckLabel handling
* LABEL handling
* RADIOGROUP handling
* BUTTONEX control
* IMAGE control
* MENU engine
* SHELLEXECUTE() / SHELLEXECUTEEX()
* TGif class
* MRU module
* TCDOMail class

Most updates preserve complete backward compatibility while modernizing the internal codebase and improving long-term maintainability.

🔹 Libraries & Toolchain Updates

* Updated HbSQLite3 library to use SQLite 3.53.1 (PRO version).
* Updated Harbour Compiler 3.2.0dev (SVN 2026-05-14 14:50) (PRO version).
* Updated SddSqlt3 library source code (PRO version).
* Updated unrar.dll to version 7.22.

🔹 Samples & Applications

Several demos and sample applications were improved with enhanced inline documentation, refactoring, and code cleanup, including:

* EditBox Overwrite
* Virtual Grid Usage
* Label Properties
* Labels as Buttons
* Message Test Function
* System Idle Time Monitoring
* UnRar sample

These updates aim to make the samples easier to study, maintain, and extend.

---

📥 Downloads

STANDARD Build

Compatible with Borland C++ 5.8.2

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

This build is not recommended for production use.

---

🔐 PROFESSIONAL Build

Production-ready, stable, and recommended for serious development and deployment.

Downloads:

https://hmgextended.com/files/CONTRIB/hmg-26.05-pro.7z

https://hmgextended.org/files/CONTRIB/hmg-26.05-pro.7z

The password for the PROFESSIONAL build is shared with project donors and supporters.

This release is strongly recommended as an upgrade for active HMG Extended Edition users.

---

Our sincere thanks go to everyone contributing code, testing improvements, reporting issues, and supporting the project.

Your continued feedback and support help keep HMG Extended Edition evolving and improving.

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

We are pleased to announce the release of HMG Extended Edition – Build 26.05 (2026/05/25).

This build delivers a broad set of refinements across the framework, with a strong focus on code maintainability, internal consistency, improved control handling, updated libraries/toolchain components, and enhanced sample applications. While most changes are internal refactorings with full backward compatibility preserved, several areas also received safety, readability, and minor performance improvements.

---

🔹 Key Highlights

🔹 Core Improvements

* Extensive refactoring and cleanup across multiple controls and core modules for:

* improved readability
* maintainability
* consistency
* safer WinAPI handling
* cleaner Unicode/ANSI processing
* reduced code duplication

Updated and improved modules include:

* Font management and enumeration
* Dialogs and common controls interfaces
* INI file handling
* BROWSE handling
* GRID handling
* EDITBOX handling
* CheckLabel handling
* LABEL handling
* RADIOGROUP handling
* BUTTONEX control
* IMAGE control
* MENU engine
* SHELLEXECUTE() / SHELLEXECUTEEX()
* TGif class
* MRU module
* TCDOMail class

Most updates preserve complete backward compatibility while modernizing the internal codebase and improving long-term maintainability.

🔹 Libraries & Toolchain Updates

* Updated HbSQLite3 library to use SQLite 3.53.1 (PRO version).
* Updated Harbour Compiler 3.2.0dev (SVN 2026-05-14 14:50) (PRO version).
* Updated SddSqlt3 library source code (PRO version).
* Updated unrar.dll to version 7.22.

🔹 Samples & Applications

Several demos and sample applications were improved with enhanced inline documentation, refactoring, and code cleanup, including:

* EditBox Overwrite
* Virtual Grid Usage
* Label Properties
* Labels as Buttons
* Message Test Function
* System Idle Time Monitoring
* UnRar sample

These updates aim to make the samples easier to study, maintain, and extend.

---

📥 Downloads

STANDARD Build

Compatible with Borland C++ 5.8.2

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

This build is not recommended for production use.

---

🔐 PROFESSIONAL Build

Production-ready, stable, and recommended for serious development and deployment.

Downloads:

https://hmgextended.com/files/CONTRIB/hmg-26.05-pro.7z

https://hmgextended.org/files/CONTRIB/hmg-26.05-pro.7z

The password for the PROFESSIONAL build is shared with project donors and supporters.

This release is strongly recommended as an upgrade for active HMG Extended Edition users.

---

Our sincere thanks go to everyone contributing code, testing improvements, reporting issues, and supporting the project.

Your continued feedback and support help keep HMG Extended Edition evolving and improving.

Warm regards,
Grigory Filatov
on behalf of the MiniGUI Team]]>
<![CDATA[My HMG Projects :: Re: 🚀 HMG Extended Edition – Build 26.05 Now Available! :: Reply by serge_girard]]> 2026-05-26T05:57:52+00:00 2026-05-26T05:57:52+00:00 http://mail.hmgforum.com/viewtopic.php?f=15&t=7754&p=72304#p72304 <![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[My HMG Projects :: Re: Elimina numeros :: Reply by luisvasquezcl]]> 2026-05-28T04:57:07+00:00 2026-05-28T04:57:07+00:00 http://mail.hmgforum.com/viewtopic.php?f=15&t=7750&p=72305#p72305 Saludos]]> Saludos]]> <![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