Clipper On Line • Ver Tópico - Iniciando com HWGUI
Página 1 de 6

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 12:00
por JoséQuintas
Tenho lá meu Main() oculto.

acrescentei no fonte

ANNOUNCE HB_GTSYS
REQUEST HB_GT_WVG_DEFAULT


Compilei, testei, à primeira vista tudo ok.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 12:46
por JoséQuintas
Por enquanto sem ambiente especial:

Criei uma pasta para os fontes hwgui, criei o projeto, e vou usar um fonte teste.

fonte: pteshwgui.prg
#include "windows.ch"
#include "guilib.ch"

PROCEDURE pTesHWGUI()
   LOCAL oForm, oFont
        Local nCombo := 1
        Local cCombo := 'Four'
        Local xCombo := 'Test'
        Local aItems := {'First', 'Second', 'Third', 'Four'}
        Local cEdit  := Space(50)
        Local oCombo1, oCombo2, oCombo3, oCombo4, oCombo5, oCombo6

        PREPARE FONT oFont NAME "Courier New" WIDTH 0 HEIGHT -11

        INIT DIALOG oForm CLIPPER NOEXIT TITLE "ComboBox Demo";
             FONT oFont ;
             AT 0, 0 SIZE 700, 425 ;
             STYLE DS_CENTER + WS_VISIBLE + WS_POPUP + WS_VISIBLE + WS_CAPTION + WS_SYSMENU

            @ 20, 20 GET COMBOBOX oCombo1 VAR nCombo ITEMS aItems SIZE 100, 150
            @ 20, 50 GET COMBOBOX oCombo2 VAR cCombo ITEMS aItems SIZE 100, 150 TEXT
            @ 20, 80 GET COMBOBOX oCombo3 VAR xCombo ITEMS aItems SIZE 100, 150 EDIT TOOLTIP 'Type any thing here'

            @ 20,110 COMBOBOX oCombo4 ITEMS aItems SIZE 100, 150
            @ 20,140 COMBOBOX oCombo5 ITEMS aItems SIZE 100, 150 TEXT
            @ 20,170 COMBOBOX oCombo6 ITEMS aItems SIZE 100, 150 EDIT

            @ 20,200 GET cEdit SIZE 150,23

            @ 380, 395 BUTTON 'Test'    SIZE 75,25 ON CLICK {|| xCombo := 'Temp', oCombo3:refresh(), nCombo := 2, oCombo1:refresh(), oCombo2:SetItem(3), oCombo4:SetItem(3), oCombo5:value := 'Third', oCombo5:refresh(), oCombo6:SetItem(2) }
            @ 460, 395 BUTTON 'Combo 1' SIZE 75,25 ON CLICK {|| hwg_Msginfo(str(nCombo)) }
            @ 540, 395 BUTTON 'Combo 2' SIZE 75,25 ON CLICK {|| hwg_Msginfo(cCombo, xCombo) }
            @ 620, 395 BUTTON 'Close'   SIZE 75,25 ON CLICK {|| oForm:Close() }

        ACTIVATE DIALOG oForm
Return


meu projeto jpahwgui.hbp
-ojpahwgui
-hblib
hwgui.hbc
*.prg


No meu menu principal, acrescentei uma opção
            MenuOption( "Módulo hwgui",              "PTESHWGUI", { || pteshwgui() } )


O codeblock só serve pra puxar a rotina hwgui pra dentro do JPA.EXE

Nada mais alterado.
Vou na pasta hwgui: C <ENTER>
Vou na pasta do meu aplicativo C <ENTER>

NÃO alterei mais nada, então, normal o erro:
c:/temp/jpa_menu.o:jpa_menu.c:(.data+0x388): undefined reference to `HB_FUN_PTESHWGUI'


Agora, lógico, preciso acrescentar a minha LIB e HWGUI, e a pasta da minha lib

C hwgui.hbc -ljpahwgui -Lhwgui <ENTER>

Pronto, um novo EXE.
        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
  21261824 ->   6667264   31.36%    win32/pe     jpa.exe                                                                                                       


hwgui.png


hwgui2.png


Esse é um ponto de partida para o restante.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 12:52
por JoséQuintas
Uma necessidade aqui:

A dialog acaba sendo MODAL.
NÃO sei se vai ser possível, talvez aqui precise conversar com o desenvolvedor da HWGUI, pra ver se dá pra criar DIALOGs NÃO MODAL.
Isso porque a janela que chama a DIALOG NÃO é uma WINDOW da HWGUI.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 12:59
por JoséQuintas
Opa, mostrei cedo demais.

hwgui3.png


Meu menu cria automático a janela para o módulo.
O aplicativo está totalmente livre, apenas tem uma janela a mais.
A janela a mais é porque ele criou, mas não precisava.....
Estamos chegando lá...

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 13:10
por JoséQuintas
Agora é conversar com o desenvolvedor.
Consegui o que eu queria, janelas à vontade, sem limites, mas....
Módulos em hwgui precisam ser fechados na ordem em que foram abertos.

jpa.png


Apenas coloquei tratamento diferenciado pra módulo HWGUI.
Aquilo de travar a janela que chama a dialog, tudo bem, é uma janela oculta mesmo, o usuário não vê nada.

FUNCTION DoPrg( cModule, cTitulo, p1, p2, p3 )

   LOCAL mHrInic //, oStatusbar
   PRIVATE m_Prog

   m_Prog := cModule
   hb_gtReload( "WVG" )
   AppInitSets( ! "HWGUI" $ Upper( cModule ) )
   HB_GtInfo( HB_GTI_WINTITLE, cTitulo )
   IF ! ( "HWGUI" $ Upper( cModule ) )
      SetColor( SetColorNormal() )
      CLS
      SayTitulo( cTitulo )
      @ MaxRow() - 2, 0 TO MaxRow() - 2, MaxCol() COLOR SetColorTraco()
      mHrInic := Time()
   ENDIF
   Do( cModule, p1, p2, p3 )
   IF ! ( "HWGUI" $ Upper( cModule ) )
      LogDeUso( mHrInic, cModule )
   ENDIF
   //  HB_SYMBOL_UNUSED( oStatusbar )

   RETURN NIL

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 13:32
por JoséQuintas
Tem como definir uma janela main hwgui oculta?
Talvez se as dialogs partirem dela não fiquem presas à ordem.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 13:39
por Itamar M. Lins Jr.
Ola!
Meu aplicativo 90% só tem dois níveis. Acredito que de todo mundo é assim.
A Window MAIN e a DIALOG. Depois pode eventualmente ter mais outro nível, botão que chama uma DIALOG com opções de impressão.
Lembre-se que a DIALOG pode ser nomodal. Fica solta, sem ter uma janela de origem.
Veja o DESIGNER como ele é feito, as JANELAS ficam SOLTAS. Não obedece essa ordem para fechar.

Saudações,
Itamar M. Lins Jr.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 14:36
por Itamar M. Lins Jr.
Ola!
Esconder um janela.
Objeto : HIDE() //Se tiver essa opção.
oWnd:Hide()


Saudações,
Itamar M. Lins Jr.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 15:05
por JoséQuintas
Não adianta, não dá certo.

Tentei com oform:activate(.f.)

Tudo bem, vai ficar assim até talvez o desenvolvedor dar uma resposta.

Tomei um baile muito grande pra descobrir um problema que fazia travar tudo.
   hb_gtReload( "WVG" )
   AppInitSets()


Inverti essas duas linhas e travava tudo.
Meio normal, tudo tem a ver com a janela ativa.
Foi o GIT que me salvou, porque conferi as mudanças.
Não funcionava mais nem o jeito anterior kkkk

Mas ok, definido o jeito de trabalhar.

hwgui\*.* vão ser meus fontes hwgui, transformados em LIB
-o${hb_addons}/josequintas/lib/${hb_plat}/${hb_comp}/jpahwgui
-hblib
-hbx=${hb_addons}/josequintas/jpahwgui
hwgui.hbc
-w3 -es2
*.prg


Vou desviar a LIB pra pasta addons/josequintas

No projeto principal:
hwgui/jpahwgui.hbp
-ljpahwgui
hwgui.hbc


Coloquei a outra pasta como subprojeto, assim compila o que eu mexer lá, já criando uma nova LIB
E compila o projeto geral juntando essa LIB, e as da hwgui

Pronto.
A partir de agora, é igual todo mundo que usa hwgui.
A única diferença é que a entrada é gtwvg.
Se eu descobrir como fazer a dialog independente, melhor ainda.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 15:10
por JoséQuintas
Agora é liberar alguma coisa pro usuário brincar.

Precisa ver o comportamento do lado do cliente, incluindo uso via terminal service.

Isso ok, é começar a colocar a mão na massa.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 15:14
por JoséQuintas
Itamar M. Lins Jr. escreveu:Lembre-se que a DIALOG pode ser nomodal. Fica solta, sem ter uma janela de origem.
Veja o DESIGNER como ele é feito, as JANELAS ficam SOLTAS. Não obedece essa ordem para fechar.


Talvez ela fique como container da Main, talvez não.
Seria interessante descobrir isso.

Nessa parte, nada a ver com GTWVG, mas sim com começar o aplicativo sem janela Main(), mas com uma ou duas dialogs.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 15:23
por JoséQuintas
Acho que estou quase lá....

        ACTIVATE DIALOG oForm


        ACTIVATE DIALOG oForm NOMODAL


Assim não tem dialog.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 15:36
por JoséQuintas
Nada feito.

Com NOMODAL a dialog não existe.
Acho que ela precisa ficar presa a alguma coisa.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 15:39
por Itamar M. Lins Jr.
Ola!
NOMODAL usamos o tempo todo, para mostrar avisos, BARRA DE PROGRESSO... como não funciona ?
Olhe o fonte da hprogres.prg
   INIT DIALOG ::oParent TITLE cTitle       ;
      At nLeft, nTop SIZE nWidth, nHeight   ;
      STYLE WS_POPUP + WS_VISIBLE + WS_CAPTION + WS_SYSMENU + WS_SIZEBOX + iif( nTop == 0, DS_CENTER, 0 ) + DS_SYSMODAL + MB_USERICON

   @ ::nLeft, nTop + 5 SAY ::LabelBox CAPTION iif( Empty( lPercent ), "", "%" )  SIZE ::nWidth, 19 ;
      STYLE SS_CENTER

   IF bExit != Nil
      ::oParent:bDestroy := bExit
   ENDIF

   ACTIVATE DIALOG ::oParent NOMODAL


Saudações,
Itamar M. Lins Jr.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 15:51
por JoséQuintas
Teste simples:


#include "hwgui.ch"

FUNCTION Main()
   LOCAL oFont, oForm
        Local nCombo := 1
        Local cCombo := 'Four'
        Local xCombo := 'Test'
        Local aItems := {'First', 'Second', 'Third', 'Four'}
        Local cEdit  := Space(50)
        Local oCombo1, oCombo2, oCombo3, oCombo4, oCombo5, oCombo6

        PREPARE FONT oFont NAME "Courier New" WIDTH 0 HEIGHT -11

        INIT DIALOG oForm CLIPPER NOEXIT TITLE "ComboBox Demo";
             FONT oFont ;
             AT 0, 0 SIZE 700, 425 ;
             STYLE DS_CENTER + WS_VISIBLE + WS_POPUP + WS_VISIBLE + WS_CAPTION + WS_SYSMENU

            @ 20, 20 GET COMBOBOX oCombo1 VAR nCombo ITEMS aItems SIZE 100, 150
            @ 20, 50 GET COMBOBOX oCombo2 VAR cCombo ITEMS aItems SIZE 100, 150 TEXT
            @ 20, 80 GET COMBOBOX oCombo3 VAR xCombo ITEMS aItems SIZE 100, 150 EDIT TOOLTIP 'Type any thing here'

            @ 20,110 COMBOBOX oCombo4 ITEMS aItems SIZE 100, 150
            @ 20,140 COMBOBOX oCombo5 ITEMS aItems SIZE 100, 150 TEXT
            @ 20,170 COMBOBOX oCombo6 ITEMS aItems SIZE 100, 150 EDIT

            @ 20,200 GET cEdit SIZE 150,23

            @ 380, 395 BUTTON 'Test'    SIZE 75,25 ON CLICK {|| xCombo := 'Temp', oCombo3:refresh(), nCombo := 2, oCombo1:refresh(), oCombo2:SetItem(3), oCombo4:SetItem(3), oCombo5:value := 'Third', oCombo5:refresh(), oCombo6:SetItem(2) }
            @ 460, 395 BUTTON 'Combo 1' SIZE 75,25 ON CLICK {|| hwg_Msginfo(str(nCombo)) }
            @ 540, 395 BUTTON 'Combo 2' SIZE 75,25 ON CLICK {|| hwg_Msginfo(cCombo, xCombo) }
            @ 620, 395 BUTTON 'Close'   SIZE 75,25 ON CLICK {|| oForm:Close() }

        ACTIVATE DIALOG oForm NOMODAL
Return oForm


Tente uma dialog sozinha, sem mais nada.
com NOMODAL, nada feito.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 15:57
por JoséQuintas
METHOD Activate( lNoModal, lMaximized, lMinimized, lCentered, bActivate ) CLASS HDialog

   LOCAL oWnd, hParent
   //LOCAL aCoors, aRect

   IF bActivate != Nil
      ::bActivate := bActivate
   ENDIF

   hwg_CreateGetList( Self )
   hParent := Iif( ::oParent != Nil .AND. ;
      __ObjHasMsg( ::oParent, "HANDLE" ) .AND. !Empty( ::oParent:handle ), ;
      ::oParent:handle, Iif( ( oWnd := HWindow():GetMain() ) != Nil,  ;
      oWnd:handle, hwg_Getactivewindow() ) )


A Dialog fica presa a uma janela ativa.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 16:02
por Itamar M. Lins Jr.
Ola!
Precisa do objeto pai. No caso uma window/dialog. Deve está como WVG... O objeto principal(GTWVG), por isso não aparece nada.

Saudações,
Itamar M. Lins Jr.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 16:20
por JoséQuintas
hwgui.png


Aqui ok, cada janela uma thread.
Tudo normal, só a sequência pra fechar que fica chato.

É começar assim mesmo.

Só mais um último teste, que lembrei de uma coisa...

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 16:36
por JoséQuintas
Testei com outras GTs: GTWGU e GTGUI.

Bom, sem problemas, o usuário vai poder abrir várias janelas.
Se abrir muitas vai se perder, mas por enquanto não tem nenhuma kkkkk

Até lá, talvez tenha outra Main()

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 17:25
por JoséQuintas
#include "hwgui.ch"

STATIC nWindow := 0

FUNCTION pTeshwgui

   LOCAL oTela, oFont, nRow, nCol

   PREPARE FONT oFont NAME "Times New Roman" WIDTH 0 HEIGHT 20 WEIGHT 400

   nWindow += 1
   INIT WINDOW oTela TITLE "Shade Buttons " + Str( nWindow, 3 ) ;
      AT 20,0 SIZE 640,480 SYSCOLOR COLOR_3DLIGHT+1

   FOR nCol= 100 TO 400 STEP 100
      FOR nRow = 40 TO 400 STEP 40
         @ nRow, nCol SHADEBUTTON SIZE 100,36 TEXT Str( nRow, 3 ) + Str( nCol, 3 ) FONT oFont EFFECT SHS_METAL PALETTE PAL_METAL
      NEXT
   NEXT

   ACTIVATE WINDOW oTela

   RETURN Nil


Não tem jeito, só o desenvolvedor mesmo.
Agora com Window.
Ok, a primeira vez abre normalmente, depois nunca mais.
Acho que ninguém nunca usou hwgui sem existir uma janela Main().

Pergunta:

Qual a diferença entre Dialog e Window? precisa das duas?
A Dialog não faz tudo que a Window faz?

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 17:29
por JoséQuintas
Alterando pra dialog ok.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 17:44
por asimoes
JoséQuintas escreveu:Alterando pra dialog ok.


Isso eu tentei, inclusive tem um post meu questionando isso, o problema é o tipo da janela que que é MAIN, com CHILD ou DIALOG pode abrir quantas vezes quiser a mesma janela na thread.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 17:44
por Itamar M. Lins Jr.
Ola!
Com Window o povo usa/usava as "WINDOWS CHILD" que ficava dentro da outra(abaixo);
Eu prefiro as DIALOGS.

Acho que ninguém nunca usou hwgui sem existir uma janela Main().


Tenho vários exemplos com dialogs puros.
A MAIN sempre irá existir dentro do projeto, com MENUS, Background...
Por isso eu vejo como melhor opção a MAIN ser com a Hwgui e as outras sendo WVG/WVW...

Saudações,
Itamar M. Lins Jr.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 17:52
por JoséQuintas
Amiguinhos do céu, nem te conto.....
Tudo bem que em GUI isso normalmente não se faz, deixar todas as janelas com o mesmo tamanho....

FUNCTION DoPrg( cModule, cTitulo, p1, p2, p3 )

   LOCAL mHrInic //, oStatusbar
   PRIVATE m_Prog

   m_Prog := cModule
   hb_gtReload( "WVG" )
   IF "HWGUI" $ cModule
      AppInitSets( .F. )
      DoHWGui( cModule, cTitulo, p1, p2, p3 )
   ELSE
      HB_GtInfo( HB_GTI_WINTITLE, cTitulo )
      AppInitSets()
   // oStatusbar := wvgStatusBar():New( wvgSetAppWindow(), , , { -2, -2 } , , .T. ):Create()
      SetColor( SetColorNormal() )
      CLS
      SayTitulo( cTitulo )
      @ MaxRow() - 2, 0 TO MaxRow() - 2, MaxCol() COLOR SetColorTraco()
      mHrInic := Time()
      Do( cModule, p1, p2, p3 )
      LogDeUso( mHrInic, cModule )
   //  HB_SYMBOL_UNUSED( oStatusbar )
   ENDIF

   RETURN NIL


Como dá pra perceber acima, em GTWVG eu crio a janela e já coloco o título.
O próprio menu já faz tudo.

Dá pra fazer igual em HWGUI?
Yes


#include "hwgui.ch"

MEMVAR m_Prog

FUNCTION DoHWGui( cModule, cTitulo )

   LOCAL oTela

   m_Prog := cModule
   INIT DIALOG oTela TITLE cTitulo AT 20, 0 SIZE 640, 480
   Do( cModule, oTela )

   RETURN NIL

FUNCTION pTeshwgui( oTela )

   PutButtons()

   ACTIVATE DIALOG oTela

   RETURN Nil

STATIC FUNCTION PutButtons()

   LOCAL nRow, nCol, oFont

   PREPARE FONT oFont NAME "Times New Roman" WIDTH 0 HEIGHT 20 WEIGHT 400

   FOR nCol= 100 TO 400 STEP 100
      FOR nRow = 40 TO 400 STEP 40
         @ nCol, nRow SHADEBUTTON SIZE 90,36 TEXT Str( nRow, 3 ) + Str( nCol, 3 ) FONT oFont EFFECT SHS_METAL PALETTE PAL_METAL
      NEXT
   NEXT

   RETURN Nil


Em GTWVG também tenho uma classe que monta as telas de cadastro, os botões, etc.
O fonte acima mostra que isso é possível.

Então.... teoricamente.... tá quase tudo pronto, falta só SAY e GET (e browse)

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 17:59
por Claudio Soto
En Windows un dialogo es una ventana temporaria que se utiliza para recibir la entrada de datos por parte del usuario, es una ventana que normalmente no tiene un boton para minimizar ni maximizar, y puede o no ser modal. En cambio un window es algo mas amplio con mas opciones, son las ventanas de la mayoria de las aplicaciones y son simpre no modal.
Son ej de dialogos, las cajas con mensaje ok,cancel,etc. Las cajas para abrir y gravar archivos, para seleccionar un color o una fuente de letra, etc.
Pero en la practica a veces si cumple con lo que el usuario necesita se usan en forma indistinta un dialog o un windows.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 18:14
por MSDN
Dá pra fazer igual em HWGUI?
Yes

é sério que vc se espantou com isso ?

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 18:14
por JoséQuintas
Não encontrei exemplo pra button.
Queria fazer do jeito que a GTWVG não deixa, já comentei por aqui.

icone.png


Prefiro button ao invés de toolbar.
Acaba ficando mais flexível até pra redimensionar.
Agora com a imagem certa.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 18:25
por Itamar M. Lins Jr.
Ola!
Eu mesmo não uso toolbutton
Tem um exemplo no TUTOR que é o que uso. TOP PANEL com OnwnerButtons.
   ADD TOP PANEL oPanelMain TO oFormMain HEIGHT 70

Vai criar uma faixa no top da window MAIN.
   INIT WINDOW oFormMain MAIN APPNAME "XYZ" FONT oFontMain ;
   TITLE "SISTEMA XYZ S/A "  ;
   AT 0,0 SIZE PosX,PosY-30 ICON oIconEXE STYLE WS_POPUP +  WS_CAPTION + WS_SYSMENU ;
   MENUPOS 3 ; //Vai abrir na posição 3
   BACKGROUND BITMAP oBmp
   ADD TOP PANEL oPanelMain TO oFormMain HEIGHT 70
   MENU OF oFormMain

      MENU TITLE "&Arquivos"
         MENUITEM "&Fornecedores"       ID 110  ACTION {||Fornecedores()}
...


Aqui os botões da BARRA
Function EscolhePerfil(cPerfil,oPanel,oTempoAviso)
...
   oImgEstoque      := hbitmap():AddResource( 'IMG_ESTOQUE' )

      @ 000,1 OWNERBUTTON OF oPanel ON CLICK {||Estoque()} ;
          SIZE 58,68 FLAT TEXT "Estoque" COORDINATES 0,53,50,50 FONT oFontBarra ;
          BITMAP oImgEstoque FROM RESOURCE TRANSPARENT COORDINATES 0,0,58,58 TOOLTIP "Arquivo do Estoque"


Saudações,
Itamar M. Lins Jr.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 18:28
por JoséQuintas
Aqui no button não vejo opção de ícone

#xcommand @ <x>,<y> BUTTON [ <oBut> CAPTION ] <caption> ;
            [ OF <oWnd> ]              ;
            [ ID <nId> ]               ;
            [ SIZE <width>, <height> ] ;
            [ COLOR <color> ]          ;
            [ BACKCOLOR <bcolor> ]     ;
            [ ON INIT <bInit> ]        ;
            [ ON SIZE <bSize> ]        ;
            [ ON PAINT <bDraw> ]       ;
            [ ON CLICK <bClick> ]      ;
            [ STYLE <nStyle> ]         ;
            [ FONT <oFont> ]           ;
            [ TOOLTIP <ctoolt> ]


o ícone é uma opção, mas não tem caption

#xcommand @ <x>,<y> ICON [ <oIco> SHOW ] <icon> ;
            [<res: FROM RESOURCE>]     ;
            [ OF <oWnd> ]              ;
            [ ID <nId> ]               ;
            [ SIZE <width>, <height> ] ;
            [ ON INIT <bInit> ]        ;
            [ ON SIZE <bSize> ]        ;
            [ ON CLICK <bClick> ]      ;
            [ ON DBLCLICK <bDblClick> ];
            [ TOOLTIP <ctoolt> ]   

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 18:36
por Itamar M. Lins Jr.
Ola!
A Hwgui tem BUTTON, BUTTONEX e OwnerButton. ButtonEX tem imagem, BUTTON não. OwnerButton tem imagem mas não recebe FOCO.

Saudações,
Itamar M. Lins Jr.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 18:39
por Itamar M. Lins Jr.
Ola!
OwnerButton o CAPTION é TEXT!
#xcommand @ <x>,<y> OWNERBUTTON [ <oOwnBtn> ]  ;
            [ OF <oWnd> ]              ;
            [ ID <nId> ]               ;
            [ SIZE <width>, <height> ] ;
            [ BACKCOLOR <bcolor> ]     ;
            [ ON INIT <bInit> ]        ;
            [ ON SIZE <bSize> ]        ;
            [ ON PAINT <bPaint> ]      ;
            [ ON CLICK <bClick> ]      ;
            [ HSTYLES <aStyles,...> ]  ;
            [ <flat: FLAT> ]           ;
            [ <enable: DISABLED> ]     ;
            [ TEXT <cText>             ;
                 [ COLOR <color>] [ FONT <font> ] ;
                 [ COORDINATES  <xt>, <yt>, <widtht>, <heightt> ] ;
            ] ;
            [ BITMAP <bmp>  [<res: FROM RESOURCE>] [<ltr: TRANSPARENT> [COLOR  <trcolor> ]] ;
                 [ COORDINATES  <xb>, <yb>, <widthb>, <heightb> ] ;
            ] ;
            [ TOOLTIP <ctoolt> ]    ;
            [ <lCheck: CHECK> ]     ;
          => ;
    [<oOwnBtn> :=] HOWNBUTTON():New( <oWnd>,<nId>,\{<aStyles>\},<x>,<y>,<width>, ;
          <height>,<bInit>,<bSize>,<bPaint>, ;
          <bClick>,<.flat.>, ;
              <cText>,<color>,<font>,<xt>, <yt>,<widtht>,<heightt>, ;
              <bmp>,<.res.>,<xb>,<yb>,<widthb>,<heightb>,<.ltr.>,<trcolor>, <ctoolt>,!<.enable.>,<.lCheck.>,<bcolor> );
    [; hwg_SetCtrlName( <oOwnBtn>,<(oOwnBtn)> )]


Saudações,
Itamar M. Lins Jr.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 18:59
por JoséQuintas
Uia....
Só pra dar uma idéia.

#include "hbclass.ch"
#include "hwgui.ch"

MEMVAR m_Prog

FUNCTION DoHWGui( cModule, cTitulo )

   LOCAL oFrm

   oFrm := FrmClass():New( cTitulo, cModule, "CIAEPU+-" )
   oFrm:Execute()

   RETURN NIL

FUNCTION pTeshwgui( oFrm )

   ACTIVATE DIALOG oFrm:oFrm

   RETURN Nil


O que a classe faz?
Cria a janela, e coloca os botões que foram indicados.

CREATE CLASS FrmClass

   VAR oFrm
   VAR cPRGName
   VAR cOptions

   METHOD New( cTitulo, cModulo, cOptions )
   METHOD CreateButtons()
   METHOD Execute()

   ENDCLASS

METHOD New( cTitulo, cModulo, cOptions ) CLASS FrmClass

   ::cPRGName := cModulo
   ::cOptions := cOptions
   INIT DIALOG ::oFrm TITLE cTitulo AT 20, 0 SIZE 640, 480

   RETURN Self

METHOD Execute() CLASS FrmClass

   ::CreateButtons()

   DO( ::cPRGName, Self )

   RETURN NIL

METHOD CreateButtons() CLASS FrmClass

   LOCAL nRow, nCol, oFont, acOptions := {}, cCaption

   PREPARE FONT oFont NAME "Times New Roman" WIDTH 0 HEIGHT 20 WEIGHT 400

   IF "C" $ ::cOptions
      AAdd( acOptions, "Consulta" )
   ENDIF
   IF "A" $ ::cOptions
      AAdd( acOptions, "Altera" )
   ENDIF
   IF "E" $ ::cOptions
      AAdd( acOptions, "Exclui" )
   ENDIF
   IF "P" $ ::cOptions
      AAdd( acOptions, "Primeiro" )
   ENDIF
   IF "U" $ ::cOptions
      AAdd( acOptions, "Último" )
   ENDIF
   IF "+" $ ::cOptions
      AAdd( acOptions, "Seguinte" )
   ENDIF
   IF "-" $ ::cOptions
      AAdd( acOptions, "Anterior" )
   ENDIF
   nCol := 1
   nRow := 1
   FOR EACH cCaption IN acOptions
      @ nCol, nRow SHADEBUTTON SIZE 90,36 TEXT cCaption FONT oFont EFFECT SHS_METAL PALETTE PAL_METAL
      nCol += 100
      IF nCol > 540
         nCol := 1
         nRow += 40
      ENDIF
   NEXT

   RETURN Nil


O resultado?
O módulo tem o que precisa.

tela.png


Bom.....
o botão inclui executa o método inclui(), o botão altera executa o método altera(), etc.
Basta o módulo ter esses métodos, igual faço com GTWVG.

Depois... no futuro, dá pra fazer o ajuste fino, mas num primeiro momento.... parece que vai deixar a migração extremamente rápida.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 19:15
por JoséQuintas
Não sei se interessa pra alguém....

28/08/2020 11:15 6.487.984 jpa.exe

20/09/2020 18:55 6.681.512 jpa.exe


Como já uso ícones multiresolução, que são grandes, o EXE tá praticamente igual.
Tá com HWGUI agora.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 19:22
por Itamar M. Lins Jr.
Ola!
Nos botões, prefira imagens, cores. Evite usar palavras, com o tempo de uso o pessoal vai preferir desenho ou cor. Poupa tempo de ler.
Os icones(desenho/cores) são mais representativos no subconsciente.

Saudações,
Itamar M. Lins Jr.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 19:29
por JoséQuintas
Tem uma coisa na hwgui que deveriam ter feito faz tempo, igual na GTWVG:

Se indicar ícone que não existe, não colocar nada ou assumir um default, e não dar erro como acontece hoje.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 19:46
por Itamar M. Lins Jr.
Ola!
Tá começando agora, use utils\bincnt basta apontar onde estão os icones e ele vai criar um container(RC) com os ícones.
Eu já usava .RC mas vou passar a usar o binccnt.exe.

Saudações,
Itamar M. Lins Jr.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 20:00
por JoséQuintas
Não apareceu imagem.

hwgui.png

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 20:18
por JoséQuintas
O mais próximo que consegui foi este, mas fica doidão.

hwgui.png


      @ nCol, nRow ICON IconFromCaption( cCaption) FROM RESOURCE SIZE 55,55

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 20:30
por JoséQuintas
No hicon tem a opção de definir tamanho.
Não resolveu ainda, não aparece.

      hIcon := HIcon():AddResource( IconFromCaption( cCaption ), 55, 55 )
      @ nCol, nRow BUTTONEX cCaption ;
         SIZE 55,55 ;
         ICON hIcon ;
         TRANSPARENT

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 20:42
por JoséQuintas
Coloquei pra redimensionar o ícone.
Alterei a variável com handle dos ícones pra classe, pra ver se o problema era a variável ser local.
Sem sucesso também.

      AAdd( ::aIconList, HIcon():AddResource( IconFromCaption( cCaption ), 55, 55 ) )
      @ nCol, nRow BUTTONEX cCaption ;
         SIZE 55,55 ;
         ICON Atail( ::aIconList ) ;
         TRANSPARENT

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 21:14
por MSDN
Quintas, siga as orientações do Itamar, vc é fera em GTWVG, mas em HwGUI está começando, e quando a gente está começando tem que ser mais humilde !

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 21:23
por JoséQuintas
MSDN escreveu:Quintas, siga as orientações do Itamar, vc é fera em GTWVG, mas em HwGUI está começando, e quando a gente está começando tem que ser mais humilde !


Apenas estou tentando mostrar um button com ícone.
O que tem de errado nisso?

20/09/2020  21:10         3.181.437 ze_resource.o
20/09/2020  21:13        10.727.126 jpa.reso


Já tenho 14MB de resource.
Criar mais 14MB de resource, duplicando tudo, só pra usar o recurso novo, NÃO dá.
Não é questão de humildade, é questão de acrescentar 14MB no EXE pra isso.

hwgui.png


Apareceu alguma coisa com o nice button.
Defini ícones com tamanho 55, e button também com tamanho 55.
Mesmo assim, tá menor que button.

Pensei na ampliação do Windows 10, mas não tem nada a ver.

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 21:24
por MSDN
A questão é que usar botões em HwGUI é diferente de usar em GTWVG, só isso, basta vc esquecer como fazia antes e ver como se faz em HwGUI.
Eu uso MiniGUI, sou acostumado de um jeito, se eu for usar HwGUI vou ter que reaprender algumas coisas, faz parte !

Iniciando com HWGUI

MensagemEnviado: 20 Set 2020 21:42
por JoséQuintas
Revi as mensagens, deixei passar o fonte do owner button.
Mesmo problema.

      AAdd( ::aIconList, HIcon():AddResource( IconFromCaption( cCaption ), 55, 55 ) )
      @ nCol, nRow OWNERBUTTON SIZE 55, 55 FLAT ;
         BITMAP Atail( ::aIconList ) FROM RESOURCE TRANSPARENT ;
         TOOLTIP cCaption


owner.png

Iniciando com HWGUI

MensagemEnviado: 21 Set 2020 04:02
por JoséQuintas
Preguiça... vai o teste assim mesmo.
Comparado com console, e com pouca informação, qualquer coisa fica legal.

hwgui.png

Iniciando com HWGUI

MensagemEnviado: 21 Set 2020 04:33
por JoséQuintas
Ou aproveitando o espaço....

hwgui.png


#include "hbclass.ch"
#include "hwgui.ch"
#include "hwg_extctrl.ch"
#include "dbstruct.ch"

MEMVAR m_Prog

FUNCTION DoHWGui( cModule, cTitulo )

   LOCAL oFrm

   oFrm := FrmClass():New( cTitulo, cModule, "CIAEPU+-" )
   use \jpa\cordeiro\jpcontabil
   oFrm:Execute()
   use

   RETURN Nil

FUNCTION pTeshwgui( oFrm )

   LOCAL aStru, aValues := {}, oElement, xValue, nRow, nCol

   aStru := dbStruct()
   FOR EACH oElement IN aStru
      AAdd( aValues, FieldGet( oElement:__EnumIndex ) )
   NEXT
   nRow := 80
   nCol := 5
   FOR EACH xValue IN aValues
      IF nCol + 100 + aStru[ xValue:__EnumIndex, DBS_LEN ] * 12 + 50> 790
         nCol := 5
         nRow += 26
      ENDIF
      @ nCol, nRow SAY aStru[ xValue:__EnumIndex, DBS_NAME ] SIZE 100, 25
      @ nCol + 110, nRow GET xValue SIZE aStru[ xvalue:__EnumIndex, DBS_LEN ] * 12, 25
      nCol += 100 + aStru[ xValue:__EnumIndex, DBS_LEN ] * 12 + 50
   NEXT

   ACTIVATE DIALOG oFrm:oFrm

   RETURN Nil

Iniciando com HWGUI

MensagemEnviado: 21 Set 2020 15:45
por Itamar M. Lins Jr.
Ola!
Falta os ajustes. STYLES!
@ x,y GET oGet VAR xVar size nComp,nLarg STYLE ES_RIGHT //Para números
@ x,y GET oGet VAR xVar size nComp,nLarg STYLE ES_LEFT //Para caracteres

E os possíveis blocos com
VALID {||fFuncaoXYZ()}

E os possíveis LIMITES nos tamanhos dos GETs.
MAXLENGTH 60


Saudações,
Itamar M. Lins Jr.

Iniciando com HWGUI

MensagemEnviado: 21 Set 2020 18:17
por Fernando queiroz
e não esquece um campo fantasma depois do ultimo GET para poder validar ele, pois o ultimo GET não sofre validação ai o fantasma passa a ser o ultimo

@ 18,680 GET oPhantom VAR cPHANTOM SIZE 0,0

Iniciando com HWGUI

MensagemEnviado: 21 Set 2020 21:01
por asimoes
Fernando queiroz escreveu:e não esquece um campo fantasma depois do ultimo GET para poder validar ele, pois o ultimo GET não sofre validação ai o fantasma passa a ser o ultimo

isso é GAMBIARRRA, na 2.17 não tem isso.

Iniciando com HWGUI

MensagemEnviado: 21 Set 2020 21:41
por Itamar M. Lins Jr.
Ola!
isso é GAMBIARRRA, na 2.17 não tem isso.

Sabe corrigir isso ?

Saudações,
Itamar M. Lins Jr.

Iniciando com HWGUI

MensagemEnviado: 21 Set 2020 22:00
por JoséQuintas
E não é que achei um uso pro FOR/EACH composto.

FUNCTION pTeshwgui( oFrm )

   LOCAL aStru, aValues := {}, oElement, xValue, nRow, nCol, oField

   aStru := dbStruct()
   FOR EACH oElement IN aStru
      AAdd( aValues, FieldGet( oElement:__EnumIndex ) )
   NEXT
   nRow := 80
   nCol := 5
   FOR EACH xValue, oField IN aValues, aStru
      IF nCol + 100 + oField[ DBS_LEN ] * 12 + 50> 790
         nCol := 5
         nRow += 26
      ENDIF
      @ nCol, nRow SAY oField[ DBS_NAME ] SIZE 100, 25
      @ nCol + 110, nRow GET xValue SIZE oField[ DBS_LEN ] * 12, 25 ;
         STYLE iif( oField[ DBS_TYPE ] == "N", ES_RIGHT, ES_LEFT ) ;
         MAXLENGTH oField[ DBS_LEN ]
      nCol += 100 + oField[ DBS_LEN ] * 12 + 50
   NEXT

   ACTIVATE DIALOG oFrm:oFrm

   RETURN Nil

Iniciando com HWGUI

MensagemEnviado: 21 Set 2020 22:20
por JoséQuintas
Por costume, tem aquilo também de deixar a digitação ativa em destaque.

Pra menu, por enquanto só imagino usar browse, seria o mais próximo de prático, ao contrário do menu do Windows.

Iniciando com HWGUI

MensagemEnviado: 21 Set 2020 23:29
por Itamar M. Lins Jr.
Ola!
Por costume, tem aquilo também de deixar a digitação ativa em destaque.

Mudar a cor do FOCO.

hwg_SetColorinFocus(.T.) //,0,11193702) 
hwg_SetToolTipBalloon(.T.)


FUNCTION hwg_SetColorinFocus( lDef, tColor, bColor )


Saudações,
Itamar M. Lins Jr.

Iniciando com HWGUI

MensagemEnviado: 22 Set 2020 06:34
por JoséQuintas
Esqueci do principal:
habilitar/desabilitar digitação, botões, etc.

Deveria ter um exemplo de um uso desses, um cadastro por exemplo.

Iniciando com HWGUI

MensagemEnviado: 22 Set 2020 06:46
por JoséQuintas
o exemplo tab tem dialog em resource, mas mingw não compila o resource.
qual a alternativa?

Iniciando com HWGUI

MensagemEnviado: 22 Set 2020 06:52
por Itamar M. Lins Jr.
Ola!
habilitar/desabilitar digitação, botões, etc.


Essa é a mais simples, fácil de fazer.
Objeto:Disable()

Depois dele está apresentado na DIALOG/Window.

O pessoal está querendo ESCREVER os controles já com os EVENTOS aplicados, isso está errado.
Primeiro desenhamos eles nas JANELAS(Dialogs/window) bunitinho... Depois é que vamos DESLIGAR/LIGAR eles.

Function Off_Controls
oGet1:Disable()
oGet2:Disable()
IF XYZ
oBotao_01:Disable()
...


Saudações,
Itamar M. Lins Jr.

Iniciando com HWGUI

MensagemEnviado: 22 Set 2020 06:56
por Itamar M. Lins Jr.
Ola!
o exemplo tab tem dialog em resource, mas mingw não compila o resource.
qual a alternativa?

Compila .RC Esse RC que vc está se referindo é um antigão da BORLAND.

Use como todo mundo usa, escreve ele na DIALOG/WINDOW.

Saudações,
Itamar M. Lins Jr.

Iniciando com HWGUI

MensagemEnviado: 22 Set 2020 07:02
por Itamar M. Lins Jr.
Ola!

   @ 010,080 TAB oTab ITEMS {} SIZE 750,450 OF oDlg
   BEGIN PAGE "TAB 1" OF oTAB
   END PAGE OF oTAB
   BEGIN PAGE "TAB 2" OF oTAB
   END PAGE OF oTAB


É um OBJETO(controle) como qualquer outro! Tem como saber até em qual TAB o usuário está.
Quando tem muita coisa(gets) o recurso é usar TAB. Até para organizar melhor o CADASTRO.
TAB Endereços, TAB DOCUMENTOS... do cliente.

Saudações,
Itamar M. Lins Jr.

Iniciando com HWGUI

MensagemEnviado: 22 Set 2020 07:27
por Itamar M. Lins Jr.
Ola!
Exemplo com TAB e DESLIGANDO os controles:
#include "hwgui.ch"

Function Main
Local oDlg, oSay, oBtn1, oBtn2, oOwBtn
Local oBtn3, oPreco, nPreco:=123456789.1234, oBtn4

   INIT DIALOG oDlg TITLE "EVENTOS NO DIALOG" AT 0,0 SIZE 800,600 ;
     On INIT {||hwg_msginfo("Bloco do Inicio")} ;
     On EXIT {||oDlg:Hide(),hwg_msginfo("Bloco do EXIT")}

   @ 010,010 TAB oTab ITEMS {} SIZE 750,450 OF oDlg
   BEGIN PAGE "TAB 1" OF oTAB

      @ 300,040 SAY oSay CAPTION "Click no X para fechar" size 300,30

      @ 300,100 button oBtn1 Caption "SAIR Close" size 200,50 ON CLICK {||oDlg:Close()}
      @ 300,200 button oBtn2 Caption "SAIR EndDialog" size 200,50 ON CLICK {||hwg_EndDialog()}

      @ 300,300 OWNERBUTTON oOwBtn SIZE 200,50 TEXT "OwnerButton SAIR"
   END PAGE OF oTAB

   BEGIN PAGE "TAB 2" OF oTAB

      @ 300,100 button oBtn3 Caption "Ligar BUTTON e GET" size 200,50 ON CLICK {||oPreco:Enable(),oBtn4:Enable()}

      @ 300,200 GET oPreco VAR nPreco PICTURE "@e 999,999,999.9999"  size 150,30

      @ 300,300 BUTTON oBtn4 CAPTION "Desligar BOTAO e GET" size 200,50 ON CLICK {||oPreco:Disable(),oBtn4:Disable()}

   END PAGE OF oTAB

    oDlg : bActivate:={||oDlg:Show(), oOwBtn:Disable(), hwg_msginfo("Bloco do Activate")}

   ACTIVATE DIALOG oDlg CENTER
Return Nil

É só compilar e testar.

Saudações,
Itamar M. Lins Jr.

Iniciando com HWGUI

MensagemEnviado: 22 Set 2020 09:36
por asimoes
Itamar M. Lins Jr. escreveu:Sabe corrigir isso ?


É comparando HEdit da 2.17 com a atual, mas o ideal é o Alexander mexer nisso, se não acaba fazendo mer**, porque antes não precisa colocar esse "fantasma" e agora tem que colocar, dá a impressão que parte do código ficou perdido, enfim, se eu tivesse todo o conhecimento dessa lib me atreveria fazer funcionar e sairia da 2.17

Iniciando com HWGUI

MensagemEnviado: 22 Set 2020 10:30
por JoséQuintas
Posso tentar.
Tem horas que acho mais fácil mexer em fonte de LIB gráfica do que usá-la.

Iniciando com HWGUI

MensagemEnviado: 22 Set 2020 11:23
por JoséQuintas
Não deu.
Tá complicado mesmo.

Achei até que era hwg_GetSkip(), por estar muito mais simplificado, e na 2.17 testar se existem os eventos de GetFocus e LostFocus do próximo controle, mas não é somente aí.

Diferente da Getsys, isso não envolve somente alterar a ordem do GET.
Tem a questão do foco, que já pode ter ido pro controle seguinte, e precisa anulação, senão trava tudo.

No VB5 acontecia muito isso.

Tipo... só sai do campo se for válido, tem lá o evento lost_focus que não permite sair.
Mas o usuário já clicou no próximo campo... que tem o get_Focus que obriga a entrar.
se os dois estão obrigando a ficar nele.... aí é onde trava tudo.

Seria como dois programas: um cuidando do visual, e outro da parte interna. O programa da parte interna precisa primeiro avisar o da parte visual sobre o que fazer primeiro, ou vice-versa.

De repente, essa validação precisa ser no próximo controle que recebeu foco, e isso pode envolver mais controles do que o HEDIT.
E justamente quem mexeu nos fontes depois, deve ter visto um pedaço de fonte que não tinha nada a ver com o controle e considerou que era lixo.
Isso explicaria porque no último VALID não respeita, porque o próximo controle não é HEDIT.
Testem se acontece também com o primeiro, quando usa SHIFT-TAB. Se acontecer.... é isso.

Iniciando com HWGUI

MensagemEnviado: 22 Set 2020 11:37
por Fernando queiroz
JoséQuintas escreveu:Testem se acontece também com o primeiro, quando usa SHIFT-TAB. Se acontecer.... é isso.

o SHIFT+TAB no primeiro campo da tela funcionou normal comigo, mas eu tenho o campo fantasma no final, quando eu dou SHIFT+TAB ele pula para o campo fantasma.

Iniciando com HWGUI

MensagemEnviado: 22 Set 2020 14:40
por Itamar M. Lins Jr.
Ola!
ela exige que vc fique olhando os fontes para entender como funciona

Tem exemplos suficientes para aprender. A Hwgui é SIMPLES. Pegue qualquer controle da Minigui e compare com a Hwgui.
Simples de mais aprender a usar Hwgui segue o @ SAY e @ GET do CLIPPER. O problema é o pessoal que vê isso e dispersa seus minguados usuários.
Foi a PIONEIRA no DEBUG gráfico, Foi a PIONEIRA em XML(formulários) igual ao DELPHI, a melhor IDE, melhor gerador de relatórios... Tudo depois bagunçado pelos próprios usuários e intermediários(atravessadores) dela. Muitos querem ela só para si. A ponto dos usuários brasileiros dela ficarem cada um com o desenvolvedor "brasileiro" X... E o vilão passar a ser o próprio criador! Mas o bom do código livre é isso, já que é sem remuneração não tem como matar o projeto.

Saudações,
Itamar M. Lins Jr.

Iniciando com HWGUI

MensagemEnviado: 22 Set 2020 15:07
por Itamar M. Lins Jr.
Ola!
A mesma coisa fizeram com SQLMIX, ADO etc...
AGORA!!! depois que muita gente já caiu fora...Agora!!!! que muita gente já sabe e tem muita coisa na internet com o Harbour usando SQL... que o pessoal não tem nem mais o que DISCUTIR do SQLRDD essa GABIARRA para usar SQL SIMULANDO DBF. Tão vendo o estrago que fizeram.... Ao invés de ensinarem a usar ADO ou outra coisa... Inventaram esse produto para "emburrecer" os programadores do Harbour e ficarem presos nessa solução, que se for usar da forma adequada termina não precisando do próprio SQLRDD.
Todo mundo querendo se livrar do DO WHILE, REPLACE etc... e usa-se isso tudo. Vem e dizem: Mas é opcional, nisso já não precisamos mais do SQLRDD, porquê se vamos usar da forma tradicional, basta o ADO.
Já tem um tempo eu estou batendo na tecla do HTML + CSS + Javascript e o Harbour como BACKEND... Agora tem ModHarbour etc... Mas é TUDO HTML!
Caiu para internet, não tem para onde correr é HTML, e vem o pessoal querendo provar por A + B que a linguagem TAL faz maravilhas.... Não faz! Vai usar internet, quer fazer seus usuários disponibilizarem seus BANCOS de DADOS ? Só HTML filho... Mais as coisas que já tem. Porquê essas ferramentas estão ESCONDENDO o HTML com CSS, nada mais.
A maioria dos softwares comerciais diz “desenvolvido ativamente” enquanto for “lucrativo”.

Estava lendo um artigo exatamente sobre isso. O pessoal do software PAGO vai MATAR o produto quando ele parar de dar LUCRO ai a pessoa que ficou dias, meses para aprender e desenvolver algo usável fica a ver navios.

Saudações,
Itamar M. Lins Jr.

Iniciando com HWGUI

MensagemEnviado: 22 Set 2020 15:28
por Itamar M. Lins Jr.
Ola!
Achei até que era hwg_GetSkip(), por estar muito mais simplificado, e na 2.17

Colocaram, tanta coisa em alguns controles(hBrowse.prg) por exemplo, que o Alexander Kresin, teve que VOLTAR! para 2.16 pq ele disse que estava impossível de achar os defeitos... É só olhar os fontes da 2.17 e 2.18 vai ver que ele voltou para traz para poder melhorar a Hwgui... Mas como sempre o pessoal só enxerga aquilo que convém. Queriam que ele consertasse a Hwgui, com os códigos exclusivos para BCC etc e ninguém foi lá dizer para ele onde estavam os problemas.
Queriam apenas a solução!

Saudações,
Itamar M. Lins Jr.

Iniciando com HWGUI

MensagemEnviado: 22 Set 2020 17:19
por JoséQuintas
O CLANG seria pra isso, pra padronizar o C, independente de compilador C.
Mas isso exige uma versào mínima de compilador C, porque antigamente isso não existia.
Nem sei se com a nova padronização que está pra sair, se todo fonte atual não pode ter problema.

Iniciando com HWGUI

MensagemEnviado: 22 Set 2020 18:40
por Itamar M. Lins Jr.
Ola!
Isso explicaria porque no último VALID não respeita, porque o próximo controle não é HEDIT.

Anomalia por conta do VALID se o VALID tem .not. empty(), já precisa de tratamento. Com a função:

If hwg_Getkeystate(VK_RETURN) < 0 //Se teclou enter no get
Else
    Return .t.
EndIf

Eu trabalho da seguinte forma:
Tenho as funções PegaVar, UpGet, CriaVar. Normalmente trabalho com browse e uma tab com os gets ao lado. Vou ver se faço um exemplo depois.
Quando o usuário navega pelo browse eu vou mudando no TAB os GETS conforme a linha do browse.
Function CriaVar
cNome := space(len(cliente->nome))
...
Function UpGet //Atualizar o get na tela, faz um refresh
oNome : Refresh()
...
Function PegaVar
cNome : cliente->nome
...


Com isso ai tenho telas com gets enormes atualiza tudo super rápido. DBF com mais de 100 mil itens no estoque...

Saudações,
Itamar M. Lins Jr.

Iniciando com HWGUI

MensagemEnviado: 22 Set 2020 18:58
por asimoes
Solução é validar na rotina de gravação (click do botão) antes de incluir/alterar

Iniciando com HWGUI

MensagemEnviado: 23 Set 2020 10:47
por JoséQuintas
asimoes escreveu:Solução é validar na rotina de gravação (click do botão) antes de incluir/alterar


Fica feio, mas... outra, no estilo console, seria acrescentar um último campo pra confirmar S/N.

E por falar nisso...
Isso me deu outra idéia, ou possibilidade sobre a correção.
Se a HWGUI usa algo que simula a getsys, talvez ela tenha o array e baste acrescentar o elemento fantasma nesse array, pra fingir que tem um "get" a mais. Lógico, e confirmar alterações adicionais.

Iniciando com HWGUI

MensagemEnviado: 23 Set 2020 13:02
por JoséQuintas
Eu ainda estou relutando em usar GUI....
Tô achando muito trabalho pra pouca coisa.

Iniciando com HWGUI

MensagemEnviado: 23 Set 2020 15:58
por asimoes
JoséQuintas escreveu:Eu ainda estou relutando em usar GUI....
Tô achando muito trabalho pra pouca coisa.


Vai desistir fácil?

Eu fui migrando aos poucos antes era GTWVG depois GTWVT, depois fui migrando as rotinas para HWGUI (modal) no final a rotina principal (MAIN) virou estilo HWGUI e as rotinas não migradas ficaram como GT, isso tudo levou 1 ano, agora qq rotina nova 100% hwgui, eu uso muito a designer que ajuda muito na construção das telas, mas se fosse pra ser na unha talvez não estaria pronto. A fase 2 foi migrar DBF para SQL, tempo total migração 1 ano e meio. Agora só pego o cheque no final do mês no cliente, o objetivo foi alcançado

Iniciando com HWGUI

MensagemEnviado: 23 Set 2020 17:42
por JoséQuintas
asimoes escreveu:Vai desistir fácil?


Não, é que eu fico querendo mexer nos fontes da LIB.

Iniciando com HWGUI

MensagemEnviado: 23 Set 2020 17:47
por asimoes
JoséQuintas escreveu:Não, é que eu fico querendo mexer nos fontes da LIB.

Eu tinha esse receio, mas ninguém está proibido de mexer na lib, vai acabar descobrindo bugs
Essa parte eu comecei a fazer depois que consegui migrar tudo, tipo o que eu andei postando aqui, claro que vai ficar uma lib personalizada para você usar ou melhor um fork seu.
Se tem algo interessante é só fazer a sugestão pro Alexander

Iniciando com HWGUI

MensagemEnviado: 23 Set 2020 18:25
por JoséQuintas
A propósito...

Aqui tem todo histórico da HWGUI, mas só até maio.

https://github.com/mlacecilia/hwgui

Última alteração: ticket do Itamar

Iniciando com HWGUI

MensagemEnviado: 24 Set 2020 10:12
por JoséQuintas
Preciso de ajuda.
Vou precisar de window e vou precisar da main hwgui.

Preciso de uma main invisivel, e talvez que fique recebendo e executando codeblocks
Isso é possível?

Iniciando com HWGUI

MensagemEnviado: 24 Set 2020 10:24
por JoséQuintas
Talvez até vocês usem isso numa tela de login... ou não?

Iniciando com HWGUI

MensagemEnviado: 24 Set 2020 10:56
por JoséQuintas
HSayIcon ainda não está legal, tá faltando fundo transparente.

hwgui.png


era pra ter ficado assim

icon.png

Iniciando com HWGUI

MensagemEnviado: 24 Set 2020 12:18
por Itamar M. Lins Jr.
Ola!

#xcommand @ <x>,<y> BITMAP [ <oBmp> SHOW ] <bitmap> ;
            [<res: FROM RESOURCE>]     ;
            [ OF <oWnd> ]              ;
            [ ID <nId> ]               ;
            [ SIZE <width>, <height> ] ;
            [ BACKCOLOR <bcolor> ]     ;
            [ STRETCH <nStretch>]      ;
            [<lTransp: TRANSPARENT> [COLOR  <trcolor> ]] ;
            [ ON INIT <bInit> ]        ;
            [ ON SIZE <bSize> ]        ;
            [ ON CLICK <bClick> ]      ;
            [ ON DBLCLICK <bDblClick> ];
            [ TOOLTIP <ctoolt> ]       ;


Use esse pq tem transparência. (ICON/BMP) herdam hSayImage

Saudações,
Itamar M. Lins Jr.

Iniciando com HWGUI

MensagemEnviado: 25 Set 2020 18:43
por Itamar M. Lins Jr.
Ola!
Achei o browse com cores, o browse zebrado, e até um browse ADO com meu nome kkkkk

Já está no SVN a opção para ADO... Vc não está lendo as postagens.
Já tinha dito que na pasta samples tem exemplos.
Tem uns bugs em alguns exemplos. Mas isso quando o pessoal voltar a mexer vou avisando para eles.

Saudações,
Itamar M. Lins Jr.

Iniciando com HWGUI

MensagemEnviado: 27 Set 2020 14:12
por JoséQuintas
Tô chegando lá....
Ao invés de caçar manual.....

hbmk2 -doc hwindow

SYNTAX
------
INIT WINDOW <oWnd>
APPNAME <appname> TITLE <cTitle> AT <x>, <y> SIZE <nWidth>, <nHeight> ICON <ico>
SYSCOLOR <clr> COLOR <bColor> BACKGROUND BITMAP <oBmp> STYLE <nStyle> EXCLUDE <nExclude>
FONT <oFont> MENU <cMenu> MENUPOS <nPos>
ON INIT <bInit> ON SIZE <bSize> ON PAINT <bPaint> ON GETFOCUS <bGfocus>
ON LOSTFOCUS <bLfocus> ON OTHER MESSAGES <bOther> ON EXIT <bExit>
HELP <cHelp> HELPID <nHelpId>

SEEALSO
-------
hdialog

Iniciando com HWGUI

MensagemEnviado: 28 Set 2020 17:51
por JoséQuintas
Bom....

Quero fazer igual console.

Já tenho a tela do aplicativo inteiro, pra ser usada por herança.

Agora é a vez do browse: um browse único pro aplicativo inteiro, ou dois.

Vão ver o que um programador console consegue fazer em GUI ! kkkk

Iniciando com HWGUI

MensagemEnviado: 28 Set 2020 18:08
por JoséQuintas
Vai ficar quase igual em HWGUI.


#include "hbclass.ch"
#include "inkey.ch"

MEMVAR m_Prog

PROCEDURE pBancoCCusto

   LOCAL oFrm := JPBACCUSTOClass():New()

   IF ! AbreArquivos( "jpempresa", "jptabel", "jpconfi" )
      RETURN
   ENDIF
   oFrm:Execute()

   RETURN

CREATE CLASS JPBACCUSTOClass INHERIT FrmCadastroClass

   VAR axKeyValue INIT { 0 }
   VAR cDataTable INIT "JPBACCUSTO"
   VAR cDataField INIT "IDBACCUSTO"
   VAR cnSQL      INIT ADOClass():New( AppConexao() )
   METHOD Especifico( lExiste )
   METHOD TelaDados( lEdit )
   METHOD GridSelection()

   ENDCLASS

METHOD GridSelection() CLASS JPBACCUSTOClass

   LOCAL oTBrowse, bCode
   LOCAL cnSQL := ADOClass():New( AppConexao() )

   WITH OBJECT cnSQL
      :cSQL := "SELECT IDBACCUSTO, CUCCUSTO, CUGRUPO FROM JPBACCUSTO ORDER BY CUCCUSTO"
      :Execute()
      oTBrowse := { ;
         { "CCUSTO", { || :String( "CUCCUSTO", 10 ) } }, ;
         { "GRUPO",  { || :String( "CUGRUPO", 10 ) } }, ;
         { "#ID",    { || Str( :Number( "IDBACCUSTO" ), 6 ) } } }
      IF "ID" $ Upper( ReadVar() )
         bCode := { || Ltrim( Str( :Number( "IDBACCUSTO" ) ) ) }
      ELSE
         bCode := { || :String( "CUCCUSTO" ) }
      ENDIF
      BrowseADO( cnSQL, oTBrowse, "CUCCUSTO,CUGRUPO", bCode )
      :CloseRecordset()
   ENDWITH

   RETURN NIL

METHOD Especifico( lExiste ) CLASS JPBACCUSTOClass

   LOCAL GetList := {}, nIdbaCCusto := 0

   IF ::cOpc != "I"
      nIdBaCCusto := ::axKeyValue[ 1 ]
      @ Row() + 1, 20 GET nIdbaCCusto PICTURE "@K 999999" VALID nIdbaCCusto > 0
      Mensagem( "Digite código para cadastro, F9 Pesquisa, ESC sai" )
      READ
      Mensagem()
      IF LastKey() == K_ESC .OR. nidbaCCusto < 0
         RETURN .F.
      ENDIF
      IF ! ::EspecificoExiste( lExiste, ADORecCount( "JPBACCUSTO", "IDBACCUSTO = " + NumberSQL( nidBaCCusto ) ) == 0 )
         RETURN .F.
      ENDIF
   ENDIF
   ::axKeyValue := { nIdBaCCusto }

   RETURN .T.

METHOD TelaDados( lEdit ) CLASS JPBACCUSTOClass

   LOCAL GetList := {}, nidbaCCusto, mcuGrupo, mcuCCusto
   LOCAL cnSQL     := ADOClass():New( AppConexao() )

   nIdBaCCusto := ::axKeyValue[ 1 ]
   WITH OBJECT cnSQL
      :cSQL := "SELECT * FROM JPBACCUSTO WHERE IDBACCUSTO = " + NumberSQL( nIdbaCCusto )
      :Execute()
      mcuGrupo  := :String( "CUGRUPO", 10 )
      mcuCCusto := :String( "CUCCUSTO", 10 )
      :CloseRecordset()
   ENDWITH

   hb_Default( @lEdit, .F. )

   DO WHILE .T.
      ::ShowTabs()
      DO CASE
      CASE ::nNumTab == 1
         @ Row() + 1, 1 SAY "#ID..............:" GET nidbaCCusto PICTURE "999999" WHEN .F.
         @ Row() + 2, 1 SAY "Centro de Custo..:" GET mcuCCusto PICTURE "@K!"
         @ Row() + 2, 1 SAY "Grupo de CCusto..:" GET mcuGrupo  PICTURE "@K!"
      ENDCASE
      //SetPaintGetList( GetList )
      IF lEdit
         Mensagem( "Digite campos, F9 Pesquisa, ESC Sai" )
         READ
         Mensagem()
      ELSE
         CLEAR GETS
         EXIT
      ENDIF
      ::nNumTab += 1
      IF LastKey() == K_ESC .OR. ::nNumTab > 1
         EXIT
      ENDIF
   ENDDO
   IF ! lEdit .OR. LastKey() == K_ESC
      RETURN NIL
   ENDIF
   WITH OBJECT cnSQL
      :QueryCreate()
      :QueryAdd( "CUCCUSTO", mcuCCusto )
      :QueryAdd( "CUGRUPO",  mcuGrupo )
      IF ::cOpc == "I"
         :QueryAdd( "CUINFINC", LogInfo() )
         nidbaCCusto := :QueryExecuteInsert( "JPBACCUSTO" )
         ::axKeyValue := { nidbaCCusto }
      ELSE
         :QueryAdd( "CUINFALT", LogInfo() )
         :QueryExecuteUpdate( "JPBACCUSTO", "IDBACCUSTO= " + NumberSQL( nidbaCCusto ) )
      ENDIF
   ENDWITH

   RETURN NIL

FUNCTION ValidBancarioCCusto( cResumo )

   LOCAL lOk := .T.

   DO CASE
   CASE cResumo == Pad( "APLIC", 10 )
   CASE cResumo == Pad( "NENHUM", 10 )
   CASE Empty( cResumo ) .AND. m_Prog != "PBANCOGRAFICOMES"
   CASE ADORecCount( "JPBACCUSTO", "CUCCUSTO= " + StringSQL( cResumo ) ) == 0
      MsgWarning( "Despesa/Receita não cadastrada!" )
      lOk := .F.
   ENDCASE

   RETURN lOk

Iniciando com HWGUI

MensagemEnviado: 28 Set 2020 19:56
por JoséQuintas
Programar igual GTWVG é lindo....

Pensei que ia demorar mais.
Acrescentei funcionalidade.
Mas sem fonte, o módulo usa a programação default.

FUNCTION PTESHWGUI( cModule, cTitulo )

   LOCAL oFrm := UmaTelaClass():New( cTitulo, cModule, "CIAEPU+-", "d:\jpa\cordeiro\jpcidade" )
   oFrm:Execute()

   RETURN Nil


https://youtu.be/IkKPkP6SKCo

Iniciando com HWGUI

MensagemEnviado: 28 Set 2020 21:25
por JoséQuintas
Pra quem quiser brincar.
Fonte, ícones, manifest, EXE assinado...
Precisa chamar o EXE passando o nome de um DBF.
Ainda não sei colocar mensagem caso falte o nome do arquivo.

Como eu já disse por aqui, meus ícones são multiresolução, e o tamanho é grande, por isso o ZIP e o EXE são grandes.
Um único fonte, e o EXE ficou com quase 1MB compactado.

Acho que a parte interessante é o uso de classe, e não os recursos de hwgui, porque não tem quase nada de hwgui, só básico, só o que está no vídeo.
o fonte é "pelado", então deve usar DBFNTX. e não deve servir dbf com memo FPT ou campo lógico.
"pelado" significa que tirei do aplicativo e ficou sem a parte que configura set date, rdd, etc.

Só não esqueçam que precisa chamar passando o nome de um DBF qualquer

test.zip
(1.14 MiB) Baixado 52 vezes

Iniciando com HWGUI

MensagemEnviado: 13 Out 2020 20:14
por JoséQuintas
Melhorou, poluição movida pra "poluição sobre lib gráfica", no bate papo.

Iniciando com HWGUI

MensagemEnviado: 14 Out 2020 11:25
por RamonXHB
Vou dar uma fuçada, pra ver como é, embora eu use MiniGUI...