Jump to content
Fivewin Brasil

tipo de Dialog


edutraini

Recommended Posts

Boa tarde, pode sim Edu, use DIALOG AS MDICHILD, ou WINDOW MDICHILD. Veja:

http://forums.fivetechsupport.com/viewtopic.php?f=3&t=36244&p=234396&hilit=dialog+mdichild#p234396

Particularmente, eu recomendo JANELAS(WINDOW) MDICHILD, dá mais trabalho, más o controle é total. Se precisar de exemplo, grite.

Abs.

 

Regards, saludos.

 

Link to comment
Share on other sites

Kapiaba vc viu que o problema não é minimizar e abrir outra rotina, o problema e deixar rodando uma rotina processando, minimizar a janela e ir fazendo outra coisa enquanto a rotina roda no background. 

Como falei, só com multithread pra fazer isso e xharbour não funciona bem nesse ponto.

Link to comment
Share on other sites

1 minuto atrás, kapiaba disse:

Vamos esperar ele se pronunciar, outra ideia é por o executável no TRAY(bandeja do windows).

Abs. 

 

Regards, saludos.

Ele escreveu isso na pergunta, ele quer minimizar a dialog enquanto a rotina segue processando e na mesma instancia continua fazendo outra coisa enquanto a rotina processa.

 

Colocar na tray tb não é solução pq se está na tray ele não consegue ficar usando a mesma instancia.

 

Como multithread não funciona legal com xharbour, a solução é mesmo abrir outra instancia do executável. Não vejo outra maneira.

Link to comment
Share on other sites

"clicar para atualizar ele possa minimizar e fazer outras tarefas no sistema", isso é perfeitamente possível com janelas MDICHILD, eu faço assim. Não consegui dominar a DIALOG AS MDICHILD, mas com WINDOW MDICHILD rola de boas, pelo menos para o meu caso. O usuário abre quantas JANELAS quiser, minimiza e vai para a outra trabalhar, termina, minimiza, abre outra e vai trabalhar, não precisa fechar nada, pois os DIALOGOS ficam NOWAIT e não MODAL FRAME. Vamos esperar ele tentar e se pronunciar, talkey()?

 

Abs.

 

Regards, saludos.

Link to comment
Share on other sites

Legal kapiaba, vms esperar o Edu se pronunciar sim, com certeza.

 

Mas enquanto ele não o faz me tira uma dúvida: nessa sua sugestão vc consegue deixar gerando um relatório que demora uns 5min pra processar, e enquanto está processando vc minimiza a dialog e, sem abrir outro executável, abrir o cadastro de cliente e incluir um novo cliente? 

Veja bem, tudo isso no mesmo executável, sem abrir outra instancia.

Eu pergunto isso pois foi isso que entendi da necessidade do Edu, que pode ser um relatório ou algum processamento mais demorado, que em vez do usuário abrir outro executável pra fazer outra operação ele deseja apenas minimizar e fazer outras coisas enquanto o processamento ocorre. Tudo isso sem abrir um novo executável.

 

E aí Edu, entendi errado o q vc pediu?

Link to comment
Share on other sites

Boa tarde Emotta e Kapi

Consegui fazer da seguinte forma. Peguei o exemplo que kapi e adptei 

Aparentemente funcionando perfeitamente 

So precisa tomar cuidado com o nome da variavel para nao misturar com outro programa que vai abrir

 

function tabela_precos()

   local  oBarPreco, oMenuPreco
    private pr_pro1,pr_pro2,pr_pro3,pr_pro4,pr_pro5,pr_reser
   SetGetColorFocus()
   DEFINE WINDOW oWndpreco FROM 19, 82 TO 20, 70 TITLE "Tabela de Precos "
    ACTIVATE WINDOW oWndPreco on init  browse_precos( AS_DIALOG )
    owndpreco:end()

return nil                                                 

function browse_precos( nAs)

   local oDlgpre, oCbx, oChk, oFontpre, oBrushpre
   local cVar1, cVar2, cVar3
   local lSwitch1, lSwitch2, lSwitch3
   local cVar     := "Two"
   local aGrad    := {{1, CLR_WHITE, CLR_HBLUE }}


   
    pr_pro1:=spac(20)
   pr_pro2:=spac(2)
   pr_pro3:=0.00                            
   pr_pro4:=0.00
   pr_pro5:=spac(3)
   pr_reser :=0

   cVar1 := cVar2 := Space( 50 )
   lSwitch1 := lSwitch2 := lSwitch3 := .f.
    *
   IF SELECT("prepre") != 0
      prepre->(DbCloseArea())
   ENDIF                                                   
    if m->sql = "S"
      USE DPROPRO0 shared INDEX XPROPRO1,XPROPRO2 ALIAS PREPRE NEW via "Sqlrdd"
    Else
      USE DPROPRO0 INDEX XPROPRO1,XPROPRO2 ALIAS PREPRE NEW 
    Endif
    
    dbsetorder(2)
    *
   DEFINE BRUSH oBrushpre GRADIENT aGrad
   DEFINE FONT oFontpre NAME "Segoe UI" SIZE 0,-12

   DEFINE DIALOG oDlgpre RESOURCE "MDIDLG" FONT oFontpre TITLE "Tabela de Preços" BRUSH oBrushpre

   RELEASE FONT oFontpre
   RELEASE BRUSH oBrushpre

   REDEFINE SAY oSayPre6  VAR prepre->estqatual  PICTURE "999999.999" ID 26 OF oDlgpre FONT FT_ESTQ
   REDEFINE SAY oSayPre7  VAR pr_reser PICTURE "999999.999" ID 27 OF oDlgpre FONT FT_ESTQ
   REDEFINE SAY oSayPre8  VAR prepre->estqatual-pr_reser  PICTURE "999999.999" ID 28 OF oDlgpre FONT FT_ESTQ
   REDEFINE SAY oSayPre9  VAR prepre->estqcpa     PICTURE "999999.999" ID 29 OF oDlgpre FONT FT_ESTQ
   REDEFINE SAY oSayPre10  VAR prepre->Texto MEMO  ID 4004  OF oDlgpre update

    *
   REDEFINE listbox oBrwPre ;
   FIELDS STR(PREPRE->CODPROD,7)+'-'+PREPRE->LOTE,;
              PREPRE->TIPO,;
                 PREPRE->SECAO,;
                 PREPRE->BITOLA,;
             PREPRE->ACAB,;
                 TRANS(PREPRE->ESTQATUAL,"999999.999"),;  
             PREPRE->OBS,;
             PREPRE->LOCAL,;
             TRATAMENTO(PREPRE->TRATAMENTO),;
             STR(PREPRE->COMPRIMENT,6)+" a "+STR(PREPRE->COMPRIMENF,6),;
                 PREPRE->FORNECEDOR,;
             PREPRE->CORRIDA+' '+PREPRE->SEQCORRIDA ;
             HEADERS 'Código','Tipo','SE','Bitola','Acab','Estq.Atual','Observacao','Local','Tratamento','Comprimento','Fornecedor','Corrida';
             SIZES 50,150,30,120,35,60,100,50,50,80,100,80;
             ALIAS  PREPRE->(Alias()) ID 150 OF  oDlgpre  UPDATE 
   WITH OBJECT oBrwPre
   :aJustify      :={.t.,.f.,.f.,.f.,.f.,.t.,.f.,.f.,.f.,.f.,.f.,.f.,.f.}
   :bChange    := {|| ESTQ_VENDA(prepre->codprod,prepre->lote,@pr_reser),oSaypre6:Refresh(),oSaypre7:Refresh(),oSaypre8:Refresh()}
   :bClrStd       := {|| iif(prepre->marcalista=.t.,{CLR_BLACK,nRGB(255,0,0)},{CLR_BLACK,CLR_WHITE})}

   END                                                                  
   REDEFINE GET oGetPre1  VAR pr_pro1         ID 1020  OF oDlgpre PICTURE "@!"      VALID BuscaPro(pr_pro1,pr_pro2,pr_pro3,pr_pro4,pr_pro5,IF(M->BUSCA_PROD="2","6","1"),oBrwPre)
   REDEFINE COMBOBOX oGetPre2 VAR pr_pro2 ITEMS vn_TPsecao  ID 1015 OF oDlgpre      VALID BuscaPro(pr_pro1,pr_pro2,pr_pro3,pr_pro4,pr_pro5,IF(M->BUSCA_PROD="2","6","1"),oBrwPre)
   REDEFINE GET oGetPre3  VAR pr_pro3         ID 1005 OF oDlgpre PICTURE "9999.99" VALID BuscaPro(pr_pro1,pr_pro2,pr_pro3,pr_pro4,pr_pro5,IF(M->BUSCA_PROD="2","6","1"),oBrwPre)
   REDEFINE GET oGetPre4  VAR pr_pro4         ID 18   OF oDlgpre PICTURE "9999.99" VALID BuscaPro(pr_pro1,pr_pro2,pr_pro3,pr_pro4,pr_pro5,IF(M->BUSCA_PROD="2","6","1"),oBrwPre,xsetfocus(oBrwPre) )


                                                                              

   REDEFINE SAY ID 1200 OF oDlgpre TRANSPARENT COLOR CLR_WHITE,CLR_WHITE


   REDEFINE BTNBMP PROMPT "FECHAR" ID 2001 OF oDlgpre CENTER 2007 ACTION (oDlgpre:End(),oWndPreco:end())

   REDEFINE BUTTON oPrePre1 ID 4011 OF oDlgpre ACTION(Kardex(prepre->codprod,prepre->lote),oBrwPre:SetFocus()) // Mostra Ficha Kardex

   if nAs == AS_MDICHILD

      ACTIVATE DIALOG oDlgpre AS MDICHILD ;
         ON PAINT oDlgpre:Box( 8,8, 373, 584, CLR_HRED ) ;
         ON RIGHT CLICK MsgInfo( oDlgpre:ClassName(), "oDlgpre:ClassName" )

   elseif nAs == AS_DIALOG

      ACTIVATE DIALOG oDlgpre CENTERED

   endif                                     

                                                                                 
return oDlgpre

 

Link to comment
Share on other sites

Edu se colocar isso em produção e funcionar bem reporte aqui por favor.

Tudo está rodando na mesma thread e em todos testes que já fiz de coisas semelhantes, inclusive multithread, tive problemas.

Mas se der certo em produção tenho que tirar o chapéu pro Kapiaba, procurei uma solução dessa por anos e nunca encontrei.

Link to comment
Share on other sites

Edu tá tranquilo, estou com o sistema na web agora, uso o xharbour console apenas pra fazer processamento de fila apenas. A versão desktop que tínhamos foi descontinuada 

Mas se isso realmente funcionar bem eu queria ter visto a 10 anos atrás, teria sido importante pois foi qdo fiz os testes de multithread em que o objetivo era exatamente esse (na época).

Em aplicações web a coisa muda completamente, é praticamente nativo possibilitar o usuário abrir várias janelas no browser e processar coisas em paralelo.

 

 

Link to comment
Share on other sites

Very good Edu. Agora, para ficar mais Show(), coloque uma xBrowse() no lugar da wBrowse(), para veres o show() de pelota que é o xBrowse().

Depois, com mais tempo, teste janelas MDI com MDICHILD, todo o seu sistema fica como se fosse o xDev.exe  do Vailton, usuário ilimitado. Abre, minimiza, abre, minimiza, maximiza, impede abir a mesma janela novamente(parece difícil, mas não é), fecha a que quiser ou só fecha todas as janelas ao sair do programa principal. Só faço programas assim agora. Nada de diálogos FIXOS.

Abs.

Regards, saludos.

Link to comment
Share on other sites

4 horas atrás, kapiaba disse:

Very good Edu. Agora, para ficar mais Show(), coloque uma xBrowse() no lugar da wBrowse(), para veres o show() de pelota que é o xBrowse().

Depois, com mais tempo, teste janelas MDI com MDICHILD, todo o seu sistema fica como se fosse o xDev.exe  do Vailton, usuário ilimitado. Abre, minimiza, abre, minimiza, maximiza, impede abir a mesma janela novamente(parece difícil, mas não é), fecha a que quiser ou só fecha todas as janelas ao sair do programa principal. Só faço programas assim agora. Nada de diálogos FIXOS.

Abs.

Regards, saludos.

Por Kapiaba, gostei da sua expertise! Conheço uso da MDI, mas não pensei da forma e objetivo que vc usou. Eu uso multithread para fazer processamento paralelo, no meu caso funciona bem, apesar do @Emotta dizer que tem problemas.

Link to comment
Share on other sites

3 minutos atrás, Jmsilva disse:

Por Kapiaba, gostei da sua expertise! Conheço uso da MDI, mas não pensei da forma e objetivo que vc usou. Eu uso multithread para fazer processamento paralelo, no meu caso funciona bem, apesar do @Emotta dizer que tem problemas.

Não faço nem ideia do que seja multithread, nunca vi um exemplo na prática. Poderias por favor provocar meu cérebro de minhocas e mostrar algo na prática? Não que eu vá usar, mas conhecimento, dinheiro e várias mulheres( Rochinhas, infarta. kkkkkkk ) nunca é demais. kkkkkkkkkkkkkk

 

Obg. abs.

 

Regards, saludos.

Link to comment
Share on other sites

11 minutos atrás, Jmsilva disse:

Por Kapiaba, gostei da sua expertise! Conheço uso da MDI, mas não pensei da forma e objetivo que vc usou. Eu uso multithread para fazer processamento paralelo, no meu caso funciona bem, apesar do @Emotta dizer que tem problemas.

Eu tive experiências ruins com multithread em xharbour, mas em harbour usei com sucesso.

Vc tá usando bem em xharbour ou harbour?

Link to comment
Share on other sites

8 minutos atrás, kapiaba disse:

Não faço nem ideia do que seja multithread, nunca vi um exemplo na prática. Poderias por favor provocar meu cérebro de minhocas e mostrar algo na prática? Não que eu vá usar, mas conhecimento, dinheiro e várias mulheres( Rochinhas, infarta. kkkkkkk ) nunca é demais. kkkkkkkkkkkkkk

 

Obg. abs.

 

Regards, saludos.

Se for pra usar em xharbour não recomendo, embora o JMsilva diga o contrário. Mas no meu caso tive problemas com o sistema fechando do nada por nenhum motivo aparente. 

 Em harbour funciona legal, tanto é que tive um aplicativo de catracas comunicando simultaneamente com várias via TCP/IP. Então em Harbour vc vai conseguir ter sucesso 

 

Multithread é uma forma de vc criar vários processos dentro do mesmo executável (único PID) e com memória separada pra cada thread. Por exemplo: vc pode colocar o sistema pra fazer uma atualização de preços e em paralelo colocar pra gerar um relatório, mesmo a rotina de atualização de preço ainda sendo processada.

O fato da sua solução ter funcionado me deu um nó na cabeça pq não está separando a memória entre os processos, talvez por isso o Edu tenha mencionado que as variáveis tem que ter outros nomes pra não dar erro. 

 

Se vc se interessar eu posto uns exemplos aqui posteriormente, aí vc vai ver na prática. Faça o teste em xharbour e dps em harbour, no meu caso só tive sucesso em harbour.

Link to comment
Share on other sites

Vixyyyyy, já começou mal no primeiro teste, compilando com Harbour:


Application
===========
   Path and name: C:\FWH1905\samples\MULTI01.exe (32 bits)
   Size: 3,976,704 bytes
   Compiler version: Harbour 3.2.0dev (r1603082110)
   FiveWin  version: FWH 19.05
   C compiler version: Borland/Embarcadero C++ 7.0 (32-bit)
   Windows version: 6.1, Build 7601 Service Pack 1
	   Time from start: 0 hours 0 mins 1 secs 
   Error occurred at: 02/06/22, 11:28:25
   Error description: Error BASE/3012  Argument error: HB_THREADJOIN
   Args:
     [   1] = U   
     [   2] = U   
	Stack Calls
===========
   Called from:  => HB_THREADJOIN( 0 )
   Called from: MULTI01.prg => MAIN( 22 )
	/*
 * demonstration/test code for thread return complex values
 *    and detached locals created by thread and used after thread
 *    termination.
 *
 * Copyright 2008 Przemyslaw Czerpak <druzus / at / priv.onet.pl>
 *
 */
	#include "FiveWin.ch"
	#ifdef __XHARBOUR__
   #xtranslate hb_threadStart( <x,...> ) => StartThread( <x> )
   #xtranslate hb_threadJoin( <x,...> ) => JoinThread( <x> )
#endif
	static s_var
	proc main()
   local xResult
   ? Version()
   ? "join:", hb_threadJoin( hb_threadStart( @thFunc() ), @xResult )
   ? "result:", xResult
   ? "static var type:", valtype( s_var )
   ? eval( s_var )
   ? eval( s_var )
return
	func thFunc()
   local i := 12345.678
   s_var := {|| i++ }
return replicate( "Hello World!!! ", 3 )

Regards, saludos.

Link to comment
Share on other sites

2 horas atrás, kapiaba disse:

Vixyyyyy, já começou mal no primeiro teste, compilando com Harbour:

 


Application
===========
   Path and name: C:\FWH1905\samples\MULTI01.exe (32 bits)
   Size: 3,976,704 bytes
   Compiler version: Harbour 3.2.0dev (r1603082110)
   FiveWin  version: FWH 19.05
   C compiler version: Borland/Embarcadero C++ 7.0 (32-bit)
   Windows version: 6.1, Build 7601 Service Pack 1
	   Time from start: 0 hours 0 mins 1 secs 
   Error occurred at: 02/06/22, 11:28:25
   Error description: Error BASE/3012  Argument error: HB_THREADJOIN
   Args:
     [   1] = U   
     [   2] = U   
	Stack Calls
===========
   Called from:  => HB_THREADJOIN( 0 )
   Called from: MULTI01.prg => MAIN( 22 )
	/*
 * demonstration/test code for thread return complex values
 *    and detached locals created by thread and used after thread
 *    termination.
 *
 * Copyright 2008 Przemyslaw Czerpak <druzus / at / priv.onet.pl>
 *
 */
	#include "FiveWin.ch"
	#ifdef __XHARBOUR__
   #xtranslate hb_threadStart( <x,...> ) => StartThread( <x> )
   #xtranslate hb_threadJoin( <x,...> ) => JoinThread( <x> )
#endif
	static s_var
	proc main()
   local xResult
   ? Version()
   ? "join:", hb_threadJoin( hb_threadStart( @thFunc() ), @xResult )
   ? "result:", xResult
   ? "static var type:", valtype( s_var )
   ? eval( s_var )
   ? eval( s_var )
return
	func thFunc()
   local i := 12345.678
   s_var := {|| i++ }
return replicate( "Hello World!!! ", 3 )

 

Regards, saludos.

No script de compilação vc precisa setar que o executável gerado será multithread. Precisa pesquisar como faz essa setagem pq eu não me lembro o de tem que mudar.

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...