Mais outro teste daqueles

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Mais outro teste daqueles

Mensagem por JoséQuintas »

Mais outro teste daqueles....

Vamos por partes, ou por fonte....

demo.ch
Apenas faz o include conforme a lib utilizada: hmg3, hmge, ou oohg

Código: Selecionar todos

#ifdef HBMK_HAS_HMG3
   #include "minigui.ch"
   MEMVAR _HMG_SYSDATA
#endif
#ifdef HBMK_HAS_HMGE
   #include "minigui.ch"
#endif
#ifdef HBMK_HAS_OOHG
   #include "oohg.ch"
#endif
demoaux.prg
Criação de tab e tabpage

Código: Selecionar todos

/*
demo_buildtabs.prg
*/

#include "demo.ch"

FUNCTION demo_BuildTabs( xDlg, aOptionList, nRow )

   LOCAL aOption, xTab

   DEFINE TAB ( xTab := ze_Name( "TAB" ) ) ;
      OF ( xDlg ) ;
      AT nRow, 60 ;
      WIDTH 900 ;
      HEIGHT 600

      FOR EACH aOption IN aOptionList

         PAGE aOption[ 1 ]

            Eval( aOption[ 3 ], xDlg )

         END PAGE

      NEXT

   END TAB

   (xTab)

   RETURN Nil

FUNCTION ze_name( cTipo )

   STATIC nIndex := 0

   nIndex += 1

   RETURN cTipo + Ltrim( Str( nIndex ) )

FUNCTION ze_ListEval( aEvalList )

   LOCAL bCode

   FOR EACH bCode IN aEvalList
      Eval( bCode )
   NEXT

   RETURN Nil
Aí começa a brincadeira.

demoa.prg
O exemplo que cria buttons pra clicar.

Código: Selecionar todos


/*
test codeblock

Based on sample of Valteçom - Uberaba - MG - Brasil
*/

#include "demo.ch"

// don't initialize values here
STATIC  nRowPos, nColPos

FUNCTION DemoA( lWithDialog, xDlg )

   LOCAL aList := {}, nCont, nTable, xButton

   hb_Default( @lWithDialog, .T. )

   nColPos := -1
   nRowPos := -1

   FOR nCont = 1 TO 35
      AAdd( aList, nCont + 50 )
   NEXT
   IF lWithDialog
      DEFINE WINDOW ( xDlg := "DLGANY" ) ;
         AT 0,0 ;
         WIDTH 1000 ;
         HEIGHT 500 ;
         MAIN;
         TITLE 'demoa' ;
         NOSIZE ;
         NOMAXIMIZE
      END WINDOW
   ENDIF

   FOR nCont := 1 TO Len( aList )

      // two variables uniques
      FOR EACH nTable, xButton IN { Nil }, { Nil }
         nTable  := aList[ nCont ]
         xButton := ze_Name( "BTN" )

         RowPos( xDlg )
         @ nRowPos, nColPos BUTTON ( xButton ) ;
            PARENT ( xDlg ) ;
            CAPTION iif( Mod( nCont, 2 ) == 0, "Table ", "Room " ) + CRLF + StrZero( nTable, 2 ) ;
            ; // ICON iif( Mod( nCont, 2 ) == 0, "icotable.ico", "icohouse.ico" ) ;
            ; // BACKCOLOR GREEN  ;
            ; // FLAT ;
            WIDTH 120 ;
            HEIGHT 60 ;
            ; // TEXTALIGNH RIGHT ;
            ACTION ShowTable( xDlg, nTable, xButton )
      NEXT
   NEXT

   IF lWithDialog
      CENTER WINDOW ( xDlg )
      ACTIVATE WINDOW ( xDlg )
   ENDIF

RETURN Nil

STATIC FUNCTION RowPos( xDlg )

   IF nColPos == -1
      nRowPos := 35
      nColPos := 5
   ELSE
      nColPos += 125
      IF nColPos > GetProperty( xDlg, "width" ) - 200
         nRowPos += 65
         nColPos := 5
      ENDIF
   ENDIF

   RETURN nRowPos

STATIC FUNCTION ShowTable( xDlg, nTable, xButton )

   MsgInfo( "Table " + StrZero( nTable, 2 ) + " clicked" )
   IF ArrayEqual( GetProperty( xDlg, xButton, "BACKCOLOR" ), RED )
      SetProperty( xDlg, xButton, "BACKCOLOR", GREEN )
   ELSE
      SetProperty( xDlg, xButton, "BACKCOLOR", RED )
   ENDIF

RETURN Nil

STATIC FUNCTION ArrayEqual( a, b )

   LOCAL nCont

   IF ValType( A ) != "A" .OR. ValType( B ) != "A"
      RETURN .F.
   ENDIF
   IF Len( A ) != Len( B )
      RETURN .F.
   ENDIF
   FOR nCont = 1 TO Len( A )
      IF ! A[ nCont ] == B[ nCont ]
         RETURN .F.
      ENDIF
   NEXT

   RETURN .T.
Compilando esses acima......
A HMG3 já se perde.
hbmk2: Error: Referenced, missing, but unknown function(s): WINDOW()
A HMG3 considera WINDOW (xDlg) como sendo função.

Tudo bem com HMGE e OOHG
As cores, sei lá, não me preocupei em entender porque não funciona o recurso que existe (ou parece que existe)
demoa.png
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Mais outro teste daqueles

Mensagem por JoséQuintas »

Aí vém o próximo fonte
demob.prg
Ele cria tab/tabpage e chama o demoa.prg em tabpages intercaladas

Código: Selecionar todos

/*
demoall.prg
*/

#include "demo.ch"

STATIC aMenuOptions := {}, nMenuLevel := 0

FUNCTION Demob( lWithDialog, xDlg )

   LOCAL aList, aInitList := {}, aEndList := {}

   hb_Default( @lWithDialog, .T. )

   aList := ze_CreateMenu( aInitList, aEndList )

   IF lWithDialog
      DEFINE WINDOW ( xDlg := ze_Name( "DLG" ) ) ;
         AT 0, 0 ;
         WIDTH 1024 ;
         HEIGHT 768 ;
         MAIN;
         TITLE "demob.prg" ;
         ON INIT Eval( { || ze_ListEval( aInitList ) } ) ;
         ON RELEASE Eval( { || ze_ListEval( aEndList ) } )

      END WINDOW
   ENDIF

   demo_BuildTabs( xDlg, aList, 60 )

   IF lWithDialog
      DoMethod( xDlg, "CENTER" )
      DoMethod( xDlg, "ACTIVATE" )
   ENDIF

   RETURN Nil

STATIC FUNCTION Ze_CreateMenu( aInitList, aEndList )

   MenuOption( "DemoA",                              { |o| DemoA( .F., o ) } )
   MenuOption( "None",                                { || Nil } )
   MenuOption( "DemoA",                              { |o| DemoA( .F., o ) } )
   MenuOption( "None",                                { || Nil } )
   MenuOption( "DemoA",                              { |o| DemoA( .F., o ) } )

   IF .F.           // warning -w3 -es2
      MenuDrop()
      MenuUnDrop()
   ENDIF
   (aInitList);(aEndList)

   RETURN aMenuOptions

STATIC FUNCTION MenuOption( cCaption, bCode )

   LOCAL nCont, aLastMenu

   aLastMenu := aMenuOptions
   FOR nCont = 1 TO nMenuLevel
      aLastMenu := aLastMenu[ Len( aLastMenu ) ]
      aLastMenu := aLastMenu[ 2 ]
   NEXT
   AAdd( aLastMenu, { ccaption, {}, bCode } )

   RETURN Nil

STATIC FUNCTION MenuDrop()


   nMenuLevel++

   RETURN Nil

STATIC FUNCTION MenuUndrop()

   nMenuLevel--

   RETURN Nil
demob.png
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Mais outro teste daqueles

Mensagem por JoséQuintas »

e por último....
democ.prg
Ele cria tabpages intercalando o demoa e o demob

Código: Selecionar todos

/*
demoall.prg
*/

#include "demo.ch"

STATIC aMenuOptions := {}, nMenuLevel := 0

PROCEDURE DemoC

   LOCAL xDlg, aList, aInitList := {}, aEndList := {}

   aList := ze_CreateMenu( aInitList, aEndList )

   DEFINE WINDOW ( xDlg := ze_Name( "DLG" ) ) ;
      AT 0, 0 ;
      WIDTH 1024 ;
      HEIGHT 768 ;
      MAIN;
      TITLE "democ.prg" ;
      ON INIT Eval( { || ze_ListEval( aInitList ) } ) ;
      ON RELEASE Eval( { || ze_ListEval( aEndList ) } )

   END WINDOW

   demo_BuildTabs( xDlg, aList, 10 )

   DoMethod( xDlg, "CENTER" )
   DoMethod( xDlg, "ACTIVATE" )

   RETURN

STATIC FUNCTION Ze_CreateMenu( aInitList, aEndList )

   MenuOption( "DemoA",                              { |o| DemoA( .F., o ) } )
   MenuOption( "DemoB",                              { |o| DemoB( .F., o ) } )
   MenuOption( "None",                               { || Nil } )
   MenuOption( "DemoA",                              { |o| DemoA( .F., o ) } )
   MenuOption( "DemoB",                              { |o| DemoB( .F., o ) } )
   MenuOption( "None",                               { || Nil } )
   MenuOption( "DemoA",                              { |o| DemoA( .F., o ) } )
   MenuOption( "DemoB",                              { |o| DemoB( .F., o ) } )

   IF .F.          // warning -w3 -es2
      MenuDrop()
      MenuUnDrop()
   ENDIF

   (aInitList);(aEndList)

   RETURN aMenuOptions

STATIC FUNCTION MenuOption( cCaption, bCode )

   LOCAL nCont, aLastMenu

   aLastMenu := aMenuOptions
   FOR nCont = 1 TO nMenuLevel
      aLastMenu := aLastMenu[ Len( aLastMenu ) ]
      aLastMenu := aLastMenu[ 2 ]
   NEXT
   AAdd( aLastMenu, { ccaption, {}, bCode } )

   RETURN Nil

STATIC FUNCTION MenuDrop()

   nMenuLevel++

   RETURN Nil

STATIC FUNCTION MenuUndrop()

   nMenuLevel--

   RETURN Nil
tabno.png
Aqui HMG Extended não vai, ela não deixa criar tab dentro de tab.
Com OOHG tudo bem, é iliimitado.
democ.png
O que isso significa ?
Que pra esse teste, oohg deu certo, só isso.

Na verdade, com esse fonte nenhuma deu certo, porque era pros botões serem coloridos.
Na HMG Extended dá certo pra cores usando o BUTTONEX, mas aí o fonte não rodaria pras outras.
Só pra cores, pra dois níveis de tab continuaria sem funcionar.

É só pra curiosidade geral.
NADA de OOP.
Apenas a sintaxe tradicional.
Na HMG3... acabei de atualizar pra HMG 4.6.1, e talvez precise ajustar os CHs novamente pra ficarem parecidos com HMG Extended.
Alterando passa a não considerar que WINDOW (xDlg) seja uma função.

Em demoa.prg - button
Em demob.prg - tabs, e executando demoa.prg em pages, 3 vezes
Em democ.prg - tabs, e executando demoa.prg e demob.prg em pages, 3 vezes cada um, portanto demoa.prg executado 12 vezes em pages diferentes
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Mais outro teste daqueles

Mensagem por JoséQuintas »

Comentários:

Pra mim, OOHG tem como vantagem isso de tab, pra testes desse tipo, e multithread
Pra mim, HMG3 tem como vantagem funcionar MAIN WINDOW OFF, útil pra multithread
Pra mim, HMG Extended tem mais recursos, mas fica de fora em multithread

OOP em OOHG pra esse tipo de exemplo até atrapalha.
Aquela FAKE OOP, gerada por CH e existente nas 3 miniguis, nem pensar, impossível utilizar pra esse tipo de coisa.

Eu diria assim: Esse recurso de não obrigar variáveis públicas é vantagem, talvez até mais que OOP, tomara que HMG Extended e OOHG não acabem com isso, e que HMG3 adote isso.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Mais outro teste daqueles

Mensagem por JoséQuintas »

Adicional:

Qual o nomes dos controles nisso tudo ? tanto faz, vai sendo criado um nome 1,2,3,4,5,6... qualquer.
Se precisar do nome pra alguma coisa, é só guardar na variável que quiser, usando o nome que quiser.
Isso é parecido com OOP, mas nesse caso tem a vantagem de nem precisar variável, basta ter o nome "na mão".

Achei esse recurso fantástico, faz até ficar na dúvida se OOP é vantagem maior que isso ou não.

Foi esse tipo de coisa que fiz na HWGUI, de um SAMPLE chamar outro pra executar em tabs.
Achei interessante o resultado, e quis fazer igual nas outras LIBs.
Não é um uso muito comum, mas tem certas coisas que podem funcionar diferente ou até nem funcionar quando usada em tabs.
É como antecipar situações que poderiam acontecer num aplicativo, por isso é interessante.

Chamar dois módulos ao mesmo tempo, ou até o mesmo módulo várias vezes.... pode acontecer em qualquer aplicativo.
Essa construçào em tabpages faz isso.
Pode acontecer erro de nome já utilizado, por exemplo, o que não deveria acontecer, mas com minigui pode acontecer.
Usando igual fiz aí, não acontece.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Mais outro teste daqueles

Mensagem por JoséQuintas »

demo.zip
(4.74 KiB) Baixado 42 vezes
Fontes utilizados

Aqui compilo fácil, com os BATs das LIBs deve ser um inferno.....

hbmk2 demoa.prg demoaux.prg hmge.hbc
hbmk2 demob.prg demoa.prg demoaux.prg hmge.hbc
hbmk2 democ.prg demoa.prg demob.prg demoaux.prg oohg.hbc

Se for usar BAT das LIBs, defina aquela variável conforme a LIB
HBMK_HAS_HMG3, HBMK_HAS_HMGE, HBMK_HAS_OOHG
Elas são criadas automaticamente pelo HBMK2 quando usa o HBC, sem HBMK2 e sem HBC é criar na mão -DHBMK_HAS_HMGE.

Note que o primeiro fonte da lista é sempre o que vai ser o principal.
Se compilar demoa, demob, democ, demoaux, vai carregar o demoa, que é o exemplo sozinho dos buttons
Se compilar demob, demoa, democ, demoaux, vai carregar o demob, que é o com um nível de tab
Se compilear democ,demob,demoa,demoaux, vai carregar o democ, que só funciona em oohg.
Não existe MAIN nesses exemplos.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder