IDE proyecto nuevo

HMG en Español

Moderator: Rathinagiri

User avatar
danielmaximiliano
Posts: 2716
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Contact:

Re: IDE proyecto nuevo

Post by danielmaximiliano »

RPC wrote: Tue May 12, 2026 10:01 am Compile ---->>>> Downloads/IDEunicodev10
Try c:\Temp\IDEunicodev10 <----- Check that the folder has write permissions :ugeek:
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
User avatar
danielmaximiliano
Posts: 2716
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Contact:

Re: IDE proyecto nuevo

Post by danielmaximiliano »

Hola a todos:
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
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
User avatar
quartz565
Posts: 674
Joined: Mon Oct 01, 2012 12:37 pm
Location: Thessaloniki, Greece
Contact:

Re: IDE proyecto nuevo

Post by quartz565 »

Gracias Daniel!
Best Regards,
Nikos.

os: Windows Server 2019 - 64
User avatar
Steed
Posts: 453
Joined: Sat Dec 12, 2009 3:40 pm

Re: IDE proyecto nuevo

Post by Steed »

Gracias
User avatar
danielmaximiliano
Posts: 2716
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Contact:

Re: IDE proyecto nuevo

Post by danielmaximiliano »

Hola a Todos:
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!!!!
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
User avatar
serge_girard
Posts: 3412
Joined: Sun Nov 25, 2012 2:44 pm
DBs Used: 1 MySQL - MariaDB
2 DBF
Location: Belgium
Contact:

Re: IDE proyecto nuevo

Post by serge_girard »

Thanks DaNiElMaXiMiLiAnO !
There's nothing you can do that can't be done...
User avatar
danielmaximiliano
Posts: 2716
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Contact:

Re: IDE proyecto nuevo

Post by danielmaximiliano »

Hola a Todos: deje unos días de publicar el estado del nuevo IDE porque encontré una pared muy grande...
contexto : el escollo es hacer un IDE con el IDE actual de hmg3.6, por lo que deje ese proyecto en Standby para estudiar bien HMG.3.6, como los fuentes están en la distribución y tienen esta clausula
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version.
me atreví a realizar modificación para mejorarlo (eso creo :? ) asi que busque la forma de modificar todo , desde ventanas, controles y agregar Scintilla con sus lexxer para tener un nuevo control. tal cual esta en el proyecto HarbourBuilder, pero como tuve muchos inconvenientes usando las .dll genere las librerías estáticas de Scintilla y Lexxilla.
este nuevo control puede usarse como un editor de texto mucho y mas potente que el EditBox y RichEditBox presentes en HMG.3.6 ya que tenemos números de lineas y pintado de sintaxis en Harbour, C , Json y HTML.
si su aplicación no lo necesita este no se compila.
todo el código HMG (legacy) funciona y puede ser compilado con solo un agregado "#define DOM" antes que #include 'hmg.ch' , si ustedes observaron dentro de hmg.ch solo verán #include 'minigui.ch' el corazón de HMG :geek:
así que dentro de hmg.ch hice la bifurcación para minigui.ch y domgui.ch

les dejo una captura de un ejemplo compilado para el control CheckBox
Captura de pantalla 2026-07-03 002200.png
Captura de pantalla 2026-07-03 002200.png (43.5 KiB) Viewed 2214 times
si envían alguna prueba de algún controles que pueda medir velocidad de operaciones se los agradecería para ver que se gano en la optimización de HMG nueva versión. hasta ahora veo que el ejecutable bajo en 800kb , la librería también se redujo, pero la inclusión de Scintilla y Lexilla incrementa en 10 megas el peso de para este mismo ejemplo aunque no se use dicho control.

Dejo los tamaños medidos:
libhmg-64.a: 1,752,950 bytes.
libdom-64.a: 878,654 bytes.
libscintilla.a: 17,841,028 bytes.
liblexilla.a: 12,374,064 bytes.

todo esto estoy en fase de prueba y error, les dejo un .rar con los ejecutables , los fuentes de dicho ejecutable y proxímamente los fuentes de domgui para pruebas con el comando básico hbmk2

Code: Select all

hbmk2 hmg_checkbox.prg "C:\hmg.3.7\hmg64.hbc" -I"C:\hmg.3.7\INCLUDE" -I"C:\hmg.3.7\DOMINCLUDE"
ControlCheckBox.rar
(2.08 MiB) Downloaded 30 times
disculpen si no traduje la publicacion :(
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
User avatar
serge_girard
Posts: 3412
Joined: Sun Nov 25, 2012 2:44 pm
DBs Used: 1 MySQL - MariaDB
2 DBF
Location: Belgium
Contact:

Re: IDE proyecto nuevo

Post by serge_girard »

Thanks DaNiElMaXiMiLiAnO!
There's nothing you can do that can't be done...
Post Reply