Página 1 de 1

Mensagem Processamento

Enviado: 14 Out 2010 08:19
por asimoes
Amigos,

Eu fiz uma rotina para exibir mensagens de processamento baseado nos exemplos postados aqui no forum, mas estou com um problema.

A função é a seguinte:

MsgIni é para mostrar a mensagem.

Código: Selecionar todos

FUNCTION MsgIni( cMensagem, cTitulo, nTempo )
   LOCAL oFonte := HFont():Add( "Courier New" , 0 ,-15,500,255 ), oSayMsg
   LOCAL nLenMensagem:=0
   DEFAULT cTitulo   To "Aviso do Sistema",;
           cMensagem To "Aguarde, em Processamento.",;
           nTempo    To 0 
   nLenMensagem:=(Len(cMensagem) * 15) + 20
   INIT DIALOG oDlgHabla       ;
   TITLE HB_OemToAnsi(cTitulo) ;
   SIZE nLenMensagem, 80       ;
   STYLE DS_CENTER + WS_VISIBLE
   @ 0,16  SAY oSayMsg Caption HB_OemToAnsi(cMensagem) Of oDlgHabla SIZE nLenMensagem, 20 STYLE SS_CENTER FONT HFont():Add( 'Lucida Console',0,-19,700,,,) COLOR "N+/W"
   oSayMsg:Name := 'oSayMsg' 
   IF nTempo > 0
      SET TIMER oTimer OF oDlgHabla VALUE nTempo ACTION {|| MsgFim(.T.) } //{|| oDlgHabla:CLOSE() }
   ENDIF
   ACTIVATE DIALOG oDlgHabla NOMODAL
RETURN .T.
MsgFim é para fechar a dialog:

Código: Selecionar todos

FUNCTION MsgFim(lTime)
DEFAULT lTime TO .F.
IF oDlgHabla#Nil
   IF lTime
      oDlgHabla:oTimer:End()
   ENDIF
   EndDialog()
   oDlgHabla:Close()
   hwg_SetForegroundWindow(hWnd)
ENDIF
RETURN Nil
O código onde estou com problema:
A dialog é exibida com o titulo sem a mensagem que é passada para o parâmetro.
MsgIni("Criando indice para Cliente.")

Código: Selecionar todos

FUNCTION MONT_ARQ
CLOSE ALL
if adir('clie*.ntx')<5
   MsgIni("Criando indice para Cliente.")
   netuse('cliente',.t.,0,'')
   pack
   index on cnpj       to clieA 
   index on nom        to clieB
   index on bairro     to clieC
   index on cid+bairro to clieD
   index on cod_vend   to clieE
   MsgFim()
endif
//Existem outros indices além deste, este primeiro é só para exemplificar.
RETURN Nil

Re: Mensagem Processamento

Enviado: 15 Out 2010 11:49
por esbasso
coloque isso
ACTIVATE DIALOG oDlgHabla NOMODAL
--> UPDATEWINDOW( oDlgHabla:handle )

Re: Mensagem Processamento

Enviado: 15 Out 2010 13:09
por asimoes
Esbasso,

Resolvido pela sua dica.

Tenho uma pergunta: Tem como alterar o SIZE da dialog de forma dianamica?

[]´s

Re: Mensagem Processamento

Enviado: 15 Out 2010 13:37
por esbasso
odlg:move( left,top,width,height)

em relação a resposta acima se atualizar do CVS verá que nem precisa por aquela linha a mais updatewindow

Re: Mensagem Processamento

Enviado: 15 Out 2010 14:16
por asimoes
Esbasso,

Tem como somente alterar o valor da width para deixar a dialog centralizada dinamicamente na tela, conforme o len(mensagem) que é passada para a função?

INIT DIALOG oDlgHabla ;
TITLE HB_OemToAnsi(cTitulo) ;
SIZE 40, 80 ;
STYLE DS_CENTER + WS_VISIBLE

Eu atualizo a mensagem usando a função:

Código: Selecionar todos

FUNCTION MsgTroca(cMensagem)
   oDlgHabla:aControls[1]:SetText(HB_OemToAnsi(cMensagem))
RETURN Nil 
A ideia é atualizar o tamanho da dialog (horizontal) com o tamanho da string de forma que fique centralizada.

[]´s

Re: Mensagem Processamento

Enviado: 15 Out 2010 15:01
por esbasso
tenta assim

FUNCTION MsgTroca(cMensagem)
local ASize := TxtRect( cMensagem, oDlgHabla:aControls[1] )
oDlgHabla:aControls[1]:nWidth := asize[ 1 ] + 2
oDlgHabla:aControls[1]:SetText(HB_OemToAnsi(cMensagem))
oDlgHabla:aControls[1]:move( , , This:oMsg:nWidth + 2 , )
oDlgHabla:center()
RETURN Nil

Re: Mensagem Processamento

Enviado: 15 Out 2010 15:13
por esbasso
faltou
-->oDlgHabla:move( , , This:oMsg:nWidth + 2 , )
oDlgHabla:aControls[1]:move( , , This:oMsg:nWidth + 2 , )

Re: Mensagem Processamento

Enviado: 15 Out 2010 15:14
por asimoes
Olá Esbasso,

Está dando erro em This:oMsg:nWidth + 2, informa que a variável this não existe.

Re: Mensagem Processamento

Enviado: 15 Out 2010 15:56
por esbasso
bah esqueci de alterar
This:oMsg: = oDlgHabla:aControls[1]

Re: Mensagem Processamento

Enviado: 15 Out 2010 17:31
por asimoes
Olá Esbasso,

Em primeiro lugar, obrigado pelas dicas que você me passou e que resolveram o problema.
Eu ainda não tinha atualizado a hwgui pela cvs, quando eu baixei, quando fui compilar apareceu isto:

source\hdialog.prg(339) Warning W0001 Ambiguous reference 'WM_QUERYUISTATE'

Re: Mensagem Processamento

Enviado: 15 Out 2010 18:17
por esbasso
adicione no windows.ch
linha 65
#define WM_QUERYUISTATE 297 // 0x0129

maos tarde irei colocar no cvs a linha que faltou