Página 1 de 2
MsgYesNo
Enviado: 17 Mai 2017 08:53
por janio
Bom dia a todos,
Alguém tem uma função parecida com a MsgYesNo (padrão hwgui) que se auto-dimensione conforme o tamanho do texto?
Acho a função padrão da lib LETRAS MUITO PEQUENAS e gostaria colocar avisos no sistema personalizados e com LETRAS MAIORES
Janio
MsgYesNo
Enviado: 17 Mai 2017 14:12
por gilbertosilverio
Ola Janio,
Nao e uma obra de arte comparada as mestres que existem aqui no forum, mais eu uso assim:
Código: Selecionar todos
MENUITEM "&MsgGet_YES" ;
ACTION {||xCOND:= .T., MsgGet_YES( [Teste Titulo], [Entre o que voce precisa], @xCOND ), ;
IF(xCOND = .t., hwg_msginfo([Verdadeiro]),hwg_msginfo([ Falso ]) ) }
Function MsgGet_YES( cTitle, cText, xCond)
Local oModDlg, oFont := HFont():Add( "MS Sans Serif",0,-16 )
INIT DIALOG oModDlg TITLE cTitle SIZE 300,140 ;
FONT oFont CLIPPER STYLE DS_MODALFRAME + WS_POPUP + WS_VISIBLE + WS_CAPTION + WS_SYSMENU + DS_CENTER
@ 20,10 SAY cText SIZE 260,22
@ 100,95 BUTTON "SIM" SIZE 80,24 ON CLICK {|| xCOND:=.T., HWG_ENDDIALOG() }
@ 200,95 BUTTON "NAO" SIZE 80,24 ON CLICK {|| xCOND:=.F., HWG_ENDDIALOG() }
ACTIVATE DIALOG oModDlg
oFont:Release()
Return xCOND
MsgYesNo
Enviado: 19 Mai 2017 17:53
por esbasso
Aqui tem uma função que permite até 5 botões de seleção
Exemplo
msginfo(str(DialogWask( "Selecione a Opção", {"um","dois","Três","quatro","cinco"} )))
msginfo(str(DialogWask( "Selecione a Opção", {"Sim","Não","Talvez"} )))
msginfo(str(DialogWask( "Confirme a operação", {"Ok","Cancelar"} )))
Código: Selecionar todos
FUNCTION DialogWask( cmsg, aSels )
LOCAL oDlg, oShape1, oBitmap1, ocmd1, ocmd2, oCmd3, oLabel1, oCmd4 ;
, oCmd5
INIT DIALOG oDlg TITLE "Selecionar opção ..." ;
COLOR 16777215 ;
AT 0, 0 SIZE 600,122 ;
FONT HFont():Add( 'Verdana',0,-15,400,,,) CLIPPER NOEXIT ;
STYLE WS_POPUP+WS_CAPTION+DS_CENTER ;
ON INIT {|This| onDlgInit( This ) }
__objAddData( oDlg, "cmsg" ); oDlg:cmsg := cmsg
__objAddData( oDlg, "aSels" ); oDlg:aSels := aSels
Thisform := oDlg
@ 15,71 SHAPE oShape1 SIZE 572,4 ;
BACKCOLOR 255 ;
BACKSTYLE 2;
BORDERWIDTH 1 CURVATURE 0 BORDERSTYLE 5 FILLSTYLE 10
@ 16,10 BITMAP oBitmap1 ;
SHOW 'bmp_qst' FROM RESOURCE STRETCH 0 ;
TRANSPARENT SIZE 48,48
@ 24,81 BUTTONEX ocmd1 CAPTION "&Sim" TRANSPARENT SIZE 110,34 ;
STYLE BS_CENTER +WS_TABSTOP ;
ON CLICK {|| ocmd1_onClick( ) }
@ 137,81 BUTTONEX ocmd2 CAPTION "&Sim" TRANSPARENT SIZE 110,34 ;
STYLE BS_CENTER +WS_TABSTOP ;
ON CLICK {|| ocmd2_onClick( ) }
@ 250,81 BUTTONEX oCmd3 CAPTION "&Sim" TRANSPARENT SIZE 110,34 ;
STYLE BS_CENTER +WS_TABSTOP ;
ON CLICK {|| oCmd3_onClick( ) }
@ 70,7 SAY oLabel1 CAPTION thisform:cmsg TRANSPARENT SIZE 508,60 ;
STYLE SS_CENTER ;
COLOR 16711680 ;
ON INIT {|This| oLabel1_onInit( This ) }
oLabel1:FontBold := .T.
@ 363,81 BUTTONEX oCmd4 CAPTION "&Não" TRANSPARENT SIZE 110,34 ;
STYLE BS_CENTER +WS_TABSTOP ;
ON CLICK {|| oCmd4_onClick( ) }
@ 476,81 BUTTONEX oCmd5 CAPTION "&Não" TRANSPARENT SIZE 110,34 ;
STYLE BS_CENTER +WS_TABSTOP ;
ON CLICK {|| oCmd5_onClick( ) }
ACTIVATE DIALOG oDlg
IF EMPTY( ThisForm:lresult )
thisform:lresult := 0
ENDIF
RETURN oDlg:lresult
STATIC FUNCTION onDlgInit( This )
// recalcular o tamnho dos botoes
PRIVATE nSize, nEspaco, nWbotao, nSels, nLeft, i, cBtn
If Empty( This:asels ) .OR. LEN( This:asels ) < 2
This:asels := {"Fechar"} //{"emitir","imprimir","desistir","cancelar"}
//RETURN .f.
ENDIF
nSize := 110 * 5
nEspaco := 3 // 12/4
nsels := LEN(This:asels)
nwbotao := MIN( 245, nSize / nSels )
nEspaco := IIF( nSels > 1, 12 / ( nSels - 1 ), 10) //nEspaco +
nLeft := This:nWidth - ( nwbotao * nSels + nEspaco * nSels )
i := 1
DO WHILE i <= 5
cBtn := "oCmd"+STR(i,1)
IF i <= nsels
this:&cBtn:CAPTION := This:aSels[ i ]
this:&cBtn:Move( nLeft,, nwBotao,,0)
nLeft += nwBotao + nEspaco
ELSE
this:&cBtn:Hide()
ENDIF
i ++
ENDDO
RETURN Nil
STATIC FUNCTION ocmd1_onClick
thisform:lresult := 1
THISFORM:CLOSE()
RETURN .T.
STATIC FUNCTION ocmd2_onClick
thisform:lresult := 2
THISFORM:CLOSE()
RETURN .T.
STATIC FUNCTION oCmd3_onClick
thisform:lresult := 3
THISFORM:CLOSE()
RETURN .T.
STATIC FUNCTION oLabel1_onInit( This )
If This:Caption != Nil .And. Len( This:Caption ) < 60
This:nHeight := 42
This:nTop += 20
This:Move( ,This:nTop,, This:nHeight )
Endif
RETURN .T.
STATIC FUNCTION oCmd4_onClick
thisform:lresult := 4
THISFORM:CLOSE()
RETURN .T.
STATIC FUNCTION oCmd5_onClick
thisform:lresult := 5
THISFORM:CLOSE()
RETURN .T.
MsgYesNo
Enviado: 21 Mai 2017 21:30
por janio
Basso,
Bateu na trave! rsrs
Além dos botões, preciso que a função redimensione também o tamanho do DIALOG conforme o numero de linhas da cMsg.
Tendo isso, fica perfeito!
Janio
MsgYesNo
Enviado: 22 Mai 2017 10:41
por esbasso
A mensagem ali tem 3 linhas
Para redimensionar só se tu tem mensagens muito grandes.
MsgYesNo
Enviado: 22 Mai 2017 11:51
por janio
As vezes as msg sao um pouco grandinhas rsrs, uma mistura de AVISO com pergunta do que o usuario quer FAZER.
As msg padrao da hwgui (msgstop, msgyesno) se auto-redimensionam conforme o numero de linhas, mas pra fazer esse auto-dimensionamento tem que mover todos os objetos do dialog... conhecimento q eu nao tenho rsrs
Mas vou me virando aqui
Janio
MsgYesNo
Enviado: 22 Mai 2017 12:57
por esbasso
Agora vai
Pode usar o chr(13) para quebra de linha
cTexto := "linha 1" + Chr(13) +"linha 2" + Chr(13) +"linha 3" + Chr(13) +"linha 4" +;
"linha 5" + Chr(13) +"linha 6" + Chr(13) +"linha 7" + Chr(13) +"linha 8"
Código: Selecionar todos
#Include "hwgui.ch"
STATIC Thisform
FUNCTION DialogWask( cmsg, aSels )
LOCAL oDlg, oShape1, oBitmap1, ocmd1, ocmd2, oCmd3, oLabel1, oCmd4 ;
, oCmd5
INIT DIALOG oDlg TITLE "Selecionar opção ..." ;
COLOR 16777215 ;
AT 0, 0 SIZE 600,122 ;
FONT HFont():Add( 'Verdana',0,-15,400,,,) CLIPPER NOEXIT ;
STYLE WS_POPUP+WS_CAPTION+DS_CENTER ;
ON INIT {|This| onDlgInit( This ) }
__objAddData( oDlg, "cmsg" ); oDlg:cmsg := cmsg
__objAddData( oDlg, "aSels" ); oDlg:aSels := aSels
Thisform := oDlg
@ 15,71 SHAPE oShape1 SIZE 572,4 ;
BACKCOLOR 255 ;
BACKSTYLE 2;
BORDERWIDTH 1 CURVATURE 0 BORDERSTYLE 5 FILLSTYLE 10
@ 16,10 BITMAP oBitmap1 SHOW 'bmp_qst' FROM RESOURCE STRETCH 0 ;
TRANSPARENT SIZE 48,48
@ 24,81 BUTTONEX ocmd1 CAPTION "&Sim" TRANSPARENT SIZE 110,34 ;
STYLE BS_CENTER +WS_TABSTOP ;
ON CLICK {|| ocmd1_onClick( ) }
@ 137,81 BUTTONEX ocmd2 CAPTION "&Sim" TRANSPARENT SIZE 110,34 ;
STYLE BS_CENTER +WS_TABSTOP ;
ON CLICK {|| ocmd2_onClick( ) }
@ 250,81 BUTTONEX oCmd3 CAPTION "&Sim" TRANSPARENT SIZE 110,34 ;
STYLE BS_CENTER +WS_TABSTOP ;
ON CLICK {|| oCmd3_onClick( ) }
@ 70,7 SAY oLabel1 CAPTION thisform:cmsg TRANSPARENT SIZE 508,60 ;
STYLE SS_CENTER ;
COLOR 16711680
oLabel1:FontBold := .T.
@ 363,81 BUTTONEX oCmd4 CAPTION "&Não" TRANSPARENT SIZE 110,34 ;
STYLE BS_CENTER +WS_TABSTOP ;
ON CLICK {|| oCmd4_onClick( ) }
@ 476,81 BUTTONEX oCmd5 CAPTION "&Não" TRANSPARENT SIZE 110,34 ;
STYLE BS_CENTER +WS_TABSTOP ;
ON CLICK {|| oCmd5_onClick( ) }
ACTIVATE DIALOG oDlg
IF EMPTY( ThisForm:lresult )
thisform:lresult := 0
ENDIF
RETURN oDlg:lresult
STATIC Function ResizeDlg
Local nTop, i, cBtn
Local cTexto := Thisform:oLabel1:Caption
Local nCr := Occurs( Chr(13), cTexto ) + 1
Local aTxtSize := Iif( ! Empty( cTexto ), TxtRect( cTexto, Thisform:oLabel1 ),{0,0} )
aTxtSize[2] := Max( aTxtSize[2], nCr * 20 )
If !Empty( cTexto) .And. aTxtSize[2] < 60
Thisform:oLabel1:nHeight := 42
Thisform:oLabel1:nTop += 20
Thisform:oLabel1:Move( ,Thisform:oLabel1:nTop,, Thisform:oLabel1:nHeight )
Return .t.
Endif
If aTxtSize[2] > 60
nTop := ( aTxtSize[2] - 60 )
Thisform:Move( ,,, Thisform:nHeight + nTop )
Thisform:oLabel1:Move( ,Thisform:oLabel1:nTop,, aTxtSize[2] + 5 )
Thisform:oShape1:Move( ,Thisform:oShape1:nTop + nTop )
i := 1
Do While i <= 5
cBtn := "oCmd"+Str(i,1)
Thisform:&cBtn:Move( , Thisform:&cBtn:nTop + nTop, , )
i ++
Enddo
Endif
Return .T.
STATIC FUNCTION onDlgInit( This )
// recalcular o tamnho dos botoes
Local nSize, nEspaco, nWbotao, nSels, nLeft, i, cBtn
If Empty( This:asels ) .OR. LEN( This:asels ) < 2
This:asels := {"Fechar"} //{"emitir","imprimir","desistir","cancelar"}
//RETURN .f.
ENDIF
nSize := 110 * 5
nEspaco := 3 // 12/4
nsels := LEN(This:asels)
nwbotao := MIN( 245, nSize / nSels )
nEspaco := IIF( nSels > 1, 12 / ( nSels - 1 ), 10) //nEspaco +
nLeft := This:nWidth - ( nwbotao * nSels + nEspaco * nSels )
i := 1
Do While i <= 5
cBtn := "oCmd"+STR(i,1)
IF i <= nsels
this:&cBtn:CAPTION := This:aSels[ i ]
this:&cBtn:Move( nLeft,, nwBotao,,0)
nLeft += nwBotao + nEspaco
ELSE
this:&cBtn:Hide()
ENDIF
i ++
ENDDO
If ! Empty( Thisform:oLabel1:Caption )
ResizeDlg()
Endif
RETURN Nil
STATIC FUNCTION ocmd1_onClick
thisform:lresult := 1
THISFORM:CLOSE()
RETURN .T.
STATIC FUNCTION ocmd2_onClick
thisform:lresult := 2
THISFORM:CLOSE()
RETURN .T.
STATIC FUNCTION oCmd3_onClick
thisform:lresult := 3
THISFORM:CLOSE()
RETURN .T.
STATIC FUNCTION oCmd4_onClick
thisform:lresult := 4
THISFORM:CLOSE()
RETURN .T.
STATIC FUNCTION oCmd5_onClick
thisform:lresult := 5
THISFORM:CLOSE()
RETURN .T.
MsgYesNo
Enviado: 22 Mai 2017 14:18
por janio
Basso,
Ta ficando muuuuuuuito bom! Exatamente o que eu queria.
So tem um probleminha:
Qndo varias linhas o Dialog ta ficando no
topo do video. Uma linha so blz, o dialog fica centralizado
Código: Selecionar todos
DialogWask("Teste funcao do Basso", { "SIM", "NAO", "CANCELA" } )
Código: Selecionar todos
DialogWask("Agora eu estou fazendo um teste para ver" + Quebra + ;
"se a função da Hwgui postada pelo Luis Basso" + Quebra + ;
"se auto-dimensiona para tantas linhas sejam necessarias!" + Quebra + ;
"" + Quebra + ;
"Se isso funcionar deve vez, ficara perfeito", { "SIM", "NAO", "CANCELA" } )
MsgYesNo
Enviado: 22 Mai 2017 14:44
por esbasso
Estranho
para mim fica centralizado
mas inclua uma nova linha
Onde tem
If aTxtSize[2] > 60
nTop := ( aTxtSize[2] - 60 )
Thisform:Move( ,,, Thisform:nHeight + nTop )
+ Thisform:Center() // <- ADICIONA ESTA LINHA
MsgYesNo
Enviado: 22 Mai 2017 14:55
por janio
Funcionou! Perfeito!
Muito obrigado, cara! Que bom que vc voltou ao forum. Estava fazendo falta.
:{ :{ :{ :{
Janio
MsgYesNo
Enviado: 26 Mai 2017 12:39
por gilbertosilverio
Ola Luiz,
Tentei compilar esta tua rotina, para pode testar aqui, mais da falta desta função na compilação...
TxtRect( cTexto, Thisform:oLabel1 )
Grato
MsgYesNo
Enviado: 26 Mai 2017 16:56
por esbasso
Se tu estiver usando a que o RUSSO já mexeu então é
FUNCTION hwg_TxtRect( cTxt, oWin, oFont )
MsgYesNo
Enviado: 26 Mai 2017 18:43
por gilbertosilverio
Luiz,
Obrigado, era isso mesmo...
Estou usando a 2.17, mais a que o Kresin incluiu o HWG_ nas funções.
Esta rotina ficou perfeita, agora a velharada para de reclamar que as letras das mensagens estão muito pequenas... rsrsrs
:-Y :-Y :-Y
MsgYesNo
Enviado: 26 Jun 2019 11:13
por edmarfrazao
Obrigado pela sua rotina era o que esta precisando.
MsgYesNo
Enviado: 26 Jun 2019 11:38
por JoséQuintas
gilbertosilverio escreveu:agora a velharada para de reclamar que as letras das mensagens estão muito pequenas... rsrsrs
Talvez, ou talvez sua máquina e seu software é que sejam velhos.
As máquinas evoluíram, o Windows não acompanhou, e os programas a base de API Windows menos ainda.
Só a GTWVG se destaca nisso.