Página 1 de 1

fivewin xbrowse array

Enviado: 24 Fev 2025 19:51
por JoséQuintas
O que tá errado nisso.
Não é automático ?
É um browse simples de array.

Código: Selecionar todos

#include "fivewin.ch"

PROCEDURE ze_fwTextMsg

   LOCAL oVar, nCont // , oDialog

   hb_ThreadStart( { || oVar := DlgTextMsgClass():New(), oVar:Execute() } )
   Altd()
   Inkey(2)
   FOR nCont = 1 TO 50
      oVar:ShowText( "Test " + Ltrim( Str( nCont ) ) )
      Inkey(2)
   NEXT
   oVar:End()

   RETURN

CREATE CLASS DlgTextMsgClass

   VAR xDlg
   VAR xControl
   VAR cText
   VAR aText    INIT {}
   VAR nMaxRow  INIT 10
   VAR nStyle   INIT 2

   METHOD Execute()
   METHOD ShowText( cText )
   METHOD End() INLINE ::xDlg:End()

   ENDCLASS

METHOD Execute() CLASS DlgTextMsgClass

   LOCAL nDlgWidth, nDlgHeight, oFont // xStatusbar,
   LOCAL nFontSize

   nDlgWidth  := AppWindowInfo()[1]
   nDlgHeight := AppWindowInfo()[2]
   nFontSize  := Int( AppWindowInfo()[ 3 ] * 0.8 )
   ::nMaxRow  := Int( nDlgHeight / ( nFontSize + 2 ) - 2 )

   DEFINE FONT oFont NAME "ARIAL" SIZE 0, -nFontSize
   DEFINE DIALOG ::xDlg FROM 0, 0 TO nDlgHeight, nDlgWidth PIXEL ;
      FONT oFont ;
      TITLE "TextScroll" // COLOR COLOR_WHITE, CLR_JPA
   ::xDlg:SetIcon( TIcon():New(,,"APPICON" ) )
   ::xDlg:bValid := .F.

   IF ::nStyle == 1
      @ 10, 10 GET ::xControl VAR ::cText MEMO OF ::xDlg PIXEL ;
         SIZE nDlgWidth  - nFontSize, nDlgHeight - nFontSize FONT oFont COLOR CLR_BLACK, CLR_WHITE // TRANSPARENT BORDER
   ENDIF
   //::xGet:Disable()
   //Don't works for GET MEMO
   //::xGet:lDisColors := .F.
   //::xGet:nClrTextDis := RGB2N(20,20,20)
   IF ::nStyle == 2
      @ 10, 10 XBROWSE ::xControl ;
         Array Array(10) ;
         SIZE nDlgWidth  - nFontSize, nDlgHeight - nFontSize FONT oFont
         ::xControl:SetArray( ::aText )
   ENDIF

   ACTIVATE DIALOG ::xDlg CENTERED
      //ON INIT ( (Self), guistatusBarCreate( ::xDlg, @xStatusbar, "" ) )

   RETURN Nil

METHOD ShowText( cText ) CLASS DlgTextMsgClass

   LOCAL cItem

      IF Len( ::aText ) = ::nMaxRow
         ADel( ::aText, 1 )
         ::aText[ Len( ::aText ) ] := cText
      ELSE
         AAdd( ::aText, cText )
      ENDIF
      ::cText := ""
      FOR EACH cItem IN ::aText
         ::cText += cItem + hb_Eol()
      NEXT
   IF ::nStyle == 1
      ::xControl:VarPut( ::cText )
      ::xControl:Refresh()
   ELSE
      ::xControl:SetArray( ::aText )
      ::xControl:nArrayAt := Len( ::aText )
      ::xControl:Refresh()
   ENDIF

   RETURN Nil

//STATIC FUNCTION guiStatusBarCreate( xDlg, xStatusbar, cText )

   //DEFINE STATUSBAR xStatusBar PROMPT cText OF xDlg
   //xDlg:Refresh()

   //RETURN xStatusBar
xbrowse.png

fivewin xbrowse array

Enviado: 24 Fev 2025 20:31
por JoséQuintas
Esqueci do CreateFromCode()

Senão o fivewin não sabe que o fonte é pra ser usado.

fivewin xbrowse array

Enviado: 24 Fev 2025 20:43
por JoséQuintas
debug.png
Pois é....
Enquanto o restante do aplicativo roda de fundo...
Debug do harbour na dialog FIVEWIN.

Lembrando: fivewin 25.01 oficial, o mesmo de todo mundo, deixou de ser versão diferente.

fivewin xbrowse array

Enviado: 25 Fev 2025 15:04
por developer
Pois é....
Enquanto o restante do aplicativo roda de fundo...
Debug do harbour na dialog FIVEWIN.
Ficou bem interessante, poder ver o debug separado assim.
Eu tenho tentado fazer o debug funcionar em uma janela separada sem precisar do fivewin, hwgui, etc... somente usando gtwvg ou gtwvt mas não tenho conseguido acertar, tenho feito alguns testes, com modificações no código até que saiu alguma coisa, mas ainda não está bom, está faltando acertar varios detalhes importantes.
Screenshot_2.jpg
Screenshot_1.jpg
Screenshot_3.jpg

fivewin xbrowse array

Enviado: 25 Fev 2025 18:56
por JoséQuintas
Aí estào rodando vários test.exe

No meu caso é um único EXE multithread.
O aplicativo continua executando, mesmo com uma janela em debug.

O aplicativo é assim mesmo: abre janelas à vontade, independentes, e pode ou não fazer debug em cada uma de forma isolada.
Somente a janela em debug fica em pausa, as demais continuam funcionando normalmente.
Multithread é isso, só não costuma ficar visível desse jeito.

fivewin xbrowse array

Enviado: 25 Fev 2025 19:20
por alxsts
Olá!
developer
Estava olhando teu código em uma das janelas e tem algo que pode ser otimizado.

Não precisa fazer:

Código: Selecionar todos

cColor := SetColor()
SetColor( "...." )
Sabendo-se que SetColor() sempre retorna as configurações de cor atuais, basta fazer:

Código: Selecionar todos

cColor := SetColor( "..." )

fivewin xbrowse array

Enviado: 26 Fev 2025 10:23
por developer
Aí estào rodando vários test.exe
É somente um EXE e está rodando em multithread, quando fecha o principal, fecha tudo.
De qualquer maneira não ficou bom e não está funcionando como eu quero, como acontece com hwgui ou fivewin, procuro independência destas bibliotecas. Depois vou tentar um pouco mais.

Código: Selecionar todos

cColor := SetColor( "..." )
O código não é meu, só peguei um exemplo para um teste, mas você está certo.

fivewin xbrowse array

Enviado: 26 Fev 2025 11:38
por JoséQuintas
O que uso pra deixar independente é um módulo invisível.
Atenção, que pode começar a experimentar módulos zumbis, vai ser normal, já que tudo vira independente.
Nesse caso vai precisar fechar no gerenciador de tarefas.
Pode configurar antes de chamar a thread, senão todas começam sem configuração (RDD,SET DATE, etc)
Descobri esta parte só neste último ano.

Código: Selecionar todos

PROCEDURE Main

   hb_ThreadStart( { || principal() } )
   hb_ThreadWaitForAll()
   RETURN

PROCEDURE HB_GTSYS
   REQUEST HB_GT_WVG_DEFAULT
   RETURN
O módulo principal vai ficar sem tela, e aguardando todas threads fecharem.

Uso GTWVG, mas tem a GTWVT, e outra em Linux, não são todas as LIBs que aceitam multithread, GTWIN não aceita.
Só posso dizer sobre GTWVG, que é meu uso normal, as outras só testando.

fivewin xbrowse array

Enviado: 26 Fev 2025 19:02
por developer
José, obrigado pelo exemplo e explicações, isto eu até estou conseguindo fazer, bem semelhante ao que você faz, inclusive vou mostrar um exemplo abaixo, seguindo suas orientações para você conseguir acompanhar (o código de 'Main2' é só para ter algum conteúdo...):

Código: Selecionar todos

// ISO 8859-1 

// hbmk2: -mt -b 

#include 'box.ch'
#include 'inkey.ch'
#include 'hbgtinfo.ch'
#include 'hbthread.ch'

REQUEST HB_CODEPAGE_PTISO

///////////////////////////////////////
PROCEDURE Main
   SETMODE( 30, 100 )
   AltD(1)
   AltD()

   hb_ThreadStart( { || Main2() } )
// hb_ThreadWaitForAll()

   @ 1,1 say 'Hello World!'
   Inkey(0)

RETURN

///////////////////////////////////////
PROCEDURE Main2
   
   hb_gtReload( 'WVT' )
   SETMODE(25,80)
   
   HB_CDPSELECT('PTISO')
   
   HB_GTINFO(HB_GTI_FONTNAME, 'Lucida Console')
   hb_gtInfo( HB_GTI_COMPATBUFFER, .F. )
   hb_gtInfo( HB_GTI_MSGBOX, .t. )
   
   Set Century On
   Set Date BRITISH
   Set ScoreBoard Off
   Set Wrap On
   
   Tela()
   SetCursor(0)
   
   SetColor( 'W/N*')
   @ 04, 04, MaxRow()-3, MaxCol()-5 BOX B_DOUBLE 
      
   clear typeahead
   Do While .T.  
      If InKey(1) == 27
         If Confirma('Abandonar o sistema ?')==1
            Return
        EndIf
      EndIf  
   EndDo
   
RETURN
   
  
///////////////////////////////////////
Function Tela()
   SetColor('N/N*')
   @ 02,00 CLEAR TO 23,79
   SetColor('W+/N')
   @ 00,01  Say SubStr('EMPRESA ABC',1,27)
   @ 00,27 Say '|'
   @ 00,28 Say PadC('SISTEMA TESTE',30)
   @ 00,57 Say '|'
   @ 00,59 Say Date()
   @ 00,70 Say '|'
   @ 01,00 Say Replicate( ' ', 80 ) Color 'N/W*'
   @ 24,00 Say Replicate( ' ', 80 ) Color 'N/W*'

   
Return(Nil)
   
///////////////////////////////////////
Function Confirma(cTexto)

   Local cOldTela:= SaveScreen(24,00,24,79)
   cColor:= SetColor('N/W*,W+/N')
   nCol:= (80-Len(cTexto))/2-6
   @24,00 Clear To 24,79
   @24,nCol Say cTexto
   @24,nCol+Len(cTexto)+2 Prompt 'Sim'
   @24,nCol+Len(cTexto)+7 Prompt 'Não'
   Menu To Confirm
   SetColor(cColor)
   RestScreen(24,00,24,79,cOldTela)

Return(Confirm)

///////////////////////////////////////
FUNCTION hb_GTSys()
   REQUEST HB_GT_WVT_DEFAULT
RETURN NIL
O meu problema é que eu quero acompanhar o andamento do código no DEBUG (usando "Step F8") que está rodando na outra thread (janela), porém o DEBUG vai mostrar o andamento da thread atual (janela principal). Não preciso que apenas mostre o conteúdo do código (isso faço com qualquer editor de código fonte).

Não sei se entendeu o meu objetivo: Programa rodando em uma janela e o DEBUG rodando em outra - porém seguindo os passos (pointer) da janela do programa.

Você sabe como obter este resultado? O problema é que o DEBUG mostra o conteúdo e PROGRESSO (Pointer) da janela (thread) que ele está mas não da outra janela (thread). Estou tentando fazer isso em GTWVT ou GTWVG (não importa), sem precisar de outras libs (HWGUI, FIVEWIN, etc...).

No seu exemplo parece que funciona mais ou menos como estou querendo, apesar que também não mostra no DEBUG o andamento do que acontece na 'CLASS DlgTextMsgClass', nem no programa principal (no background) - não testei aqui (não uso Fivewin).

fivewin xbrowse array

Enviado: 26 Fev 2025 22:41
por JoséQuintas
Cada thread é independente.
Altd() na outra thread.

Veja no vídeo deste post

https://pctoledo.org/forum/viewto ... ad#p167278

fivewin xbrowse array

Enviado: 27 Fev 2025 00:31
por developer
Cada thread é independente.
Altd() na outra thread.
Creio que é este o problema, não tem como fazer o que eu quero por meio de outra thread pois são independentes.
Parece que eu quero é duas janelas na mesma thread, sendo janela-1 o programa e janela-2 o debug, mas isso não é possível.

fivewin xbrowse array

Enviado: 27 Fev 2025 08:03
por JoséQuintas
F4 pra olhar a tela.