Mapping Clipper Alert() to MsgYesNo()

General Help regarding HMG, Compilation, Linking, Samples

Moderator: Rathinagiri

User avatar
gfilatov
Posts: 1090
Joined: Fri Aug 01, 2008 5:42 am
Location: Ukraine
Contact:

Re: Mapping Clipper Alert() to MsgYesNo()

Post by gfilatov »

CCH4CLIPPER wrote:Hi Grigory

Yup, no come error but testing out alert() does not give any response

Function ReindexAll()
nChoice:=Alert('Reindex All Files',{'Yes','No'})
Alert(Str(nChoice))

Return
...
Would appreciate any help here.

CCH
Hi,

Please take a look for this remark from original author:
* In case of translate from original Clipper code to ooHG/Minigui code
* only replace "ALERT" word for "WALERT" word.
I hope that helps.
Kind Regards,
Grigory Filatov

"Everything should be made as simple as possible, but no simpler." Albert Einstein
CCH4CLIPPER
Posts: 140
Joined: Tue Mar 03, 2009 8:59 am

Re: Mapping Clipper Alert() to MsgYesNo()

Post by CCH4CLIPPER »

Hi

Yes, it now works when I renamed Alert() to Walert() but the Dialog is not look proportionate and also it hangs (no response) when I click OK or Cancel. :(
User avatar
mol
Posts: 3774
Joined: Thu Sep 11, 2008 5:31 am
Location: Myszków, Poland
Contact:

Re: Mapping Clipper Alert() to MsgYesNo()

Post by mol »

Hi!
I've modyfied a few WALERT function for my need.
I wanna post my changes:
FUNCTION walert( cMessage, aItems, cTitle )
LOCAL I:=0 , J:=0 , nStart:=1 , nValue:=0
local nHeight

DEFAULT aItems TO {}
DEFAULT cMessage TO ' '

if isWindowDefined("WALERT")
Walert.Release
endif

IF SET( _SET_LANGUAGE )=='POLISH'
DEFAULT cTitle TO 'Wybór...'
ELSE
DEFAULT cTitle TO 'Please, select'
ENDIF

// 250 - minimal height
nHeight := max( MLCount(cMessage,50,8,.t.)*20 + 10+25 + 30+10, 250)

nItemCount := len(aItems)
if nItemCount < 2
// one button on center of the window
nStart := 160
else
// 80 - width of Button
// 20 - space between buttons
// 200 half of width of walert window
nStart := 200 - (nItemCount*80 + (nItemCount-1)*20)/2
endif


DEFINE WINDOW WALERT ;
AT 0,0 ;
WIDTH 400 HEIGHT nHeight ;
TITLE cTitle ;
ICON 'MAIN' ;
MODAL ;
NOSIZE


//******************** DISPLAY MESSAGE *******************************
FOR i:=1 TO MLCount(cMessage,50,8,.f.)
cTexLabel := 'text'+str(i,1)
@ (i*20)-10,016 LABEL &cTexLabel WIDTH 368 HEIGHT 20 VALUE MemoLine(cMessage, 50, i, 8, .t.) ;
FONT 'ARIAL' SIZE 10 CENTERALIGN
NEXT i

//******************** DRAW BUTTONS ***********************************
if nItemCount <= 1
@ 150,160 BUTTON Button_1 ;
CAPTION '&OK' ;
ACTION {|| nValue := 0, walert.Release } ;
WIDTH 80 HEIGHT 30
else
aBlocks := array(nItemCount)
for i:=1 to nItemCount
@ nHeight-60, nStart+100*(i-1) BUTTON &("Button_"+str(i,1)) ;
CAPTION '&'+aItems ;
ACTION { || nValue := val(right(this.name,1)),walert.release} ;
WIDTH 80 HEIGHT 30

next i
endif

END WINDOW
CENTER WINDOW walert
ON KEY ESCAPE of WALERT ACTION walert.release
ACTIVATE WINDOW walert
RETURN(nValue)


I wanted to dynamically compile ACTION block:


(not working example)
bActionBlock :=("{ || nValue := " + str( i,1 ) + ",ThisWindow.Release }")
...
ACTION &bActionBlock


but it generated runtime error.
I don't know why...


Marek
User avatar
Pablo César
Posts: 4059
Joined: Wed Sep 08, 2010 1:18 pm
Location: Curitiba - Brasil

Walert

Post by Pablo César »

I make some changings and hope to be usefull for someones:

Code: Select all

FUNCTION Walert( cMessage, aItems, cTitle )
LOCAL I:=0 , J:=0 , nStart:=1 , nValue:=0
local nHeight

DEFAULT aItems TO {}
DEFAULT cMessage TO ' '

if isWindowDefined(upper("WALERT"))
   Thiswindow.Release()
endif
IF SET( _SET_LANGUAGE )=='PORTUGUESE'
   DEFAULT cTitle TO 'Favor escolha...'
ELSE
   DEFAULT cTitle TO 'Please, select'
ENDIF
nHeight := Int((Round((len(cMessage)/50),0)))* 120 // minimal nHeight := 120
nItemCount := len(aItems)
if nItemCount < 2
   nStart := 160 // one button on center of the window
else
   nStart := 200 - (nItemCount*80 + (nItemCount-1)*20)/2
   /*
   80 - width of Button
   20 - space between buttons
   200 half of width of walert window
   */
endif
DEFINE WINDOW WALERT     ;
AT 0,0                   ;
WIDTH 400 HEIGHT nHeight ;
TITLE cTitle             ;
ICON 'MAIN'              ;
MODAL                    ;
NOSIZE
// DISPLAY MESSAGE
FOR i:=1 TO MLCount(cMessage,50,8,.f.)
    cTexLabel := 'text'+str(i,1)
    @ (i*20)-10,016 LABEL &cTexLabel WIDTH 368 HEIGHT 20 VALUE PADC(Alltrim(MemoLine(cMessage, 50, i, 8, .t.)),50) ;
    FONT 'ARIAL' SIZE 10 CENTERALIGN
NEXT i
// DRAW BUTTONS
if nItemCount <= 1
   @ 150,260 BUTTON Button_1                  ;
     CAPTION '&OK'                            ;
     ACTION {|| nValue := 0, walert.Release } ;
     WIDTH 80 HEIGHT 30
else
   aBlocks := array(nItemCount)
   for i:=1 to nItemCount
       @ nHeight-70, nStart+100*(i-1) BUTTON &("Button_"+str(i,1))     ;
         CAPTION '&'+aItems[i]                                         ;
         ACTION { || nValue := val(right(this.name,1)),walert.release} ;
         WIDTH 80 HEIGHT 30
   next i
endif
END WINDOW
CENTER WINDOW walert
ON KEY ESCAPE of WALERT ACTION walert.release
ACTIVATE WINDOW walert
RETURN(nValue)
Changing made to attends to Height of alert window basically.
HMGing a better world
"Matter tells space how to curve, space tells matter how to move."
Albert Einstein
MICROVOLUTION
Posts: 146
Joined: Sat May 30, 2015 5:15 am

Re: Mapping Clipper Alert() to MsgYesNo()

Post by MICROVOLUTION »

portuguese:
pessoal, boa noite!
estou agora migrando aos poucos de CONSOLE p/ GUI, e, usando a HMG 3.0.xx descobri que é possível no lugar de usar mensagens comuns ao usuário, é possível que elas estejam já modo GRÁFICO. Isso é ótimo!
São as MSG + yesno, okcancel, info, exclamation, box, etc...

Estou implementando tudo aos poucos, e, a começar com a MSGYESNO e MSGINFO. Só que tem um problema.
Vejamos o código antigo abaixo no modo CONSOLE:

Code: Select all

function CONFIRMA (TEXTO)
     local LIN               := 16,;
           COL               := 0,;
           CENTRO            := 0,;
           LARG_JAN          := 0,;
           CONTROLE          := 2,;
           SALVA_COR         := setcolor (),;
           SALVA_TELA        := nil,;
           SALVA_INTENSIDADE := set (_SET_INTENSITY)

     if len (TEXTO) + 2 < 16
		  TEXTO := TEXTO + SPACE(16-(LEN(TEXTO)+2))
     endif     set (_SET_INTENSITY,.t.)
     TEXTO := TEXTO + ' ? '
     LARG_JAN = len (TEXTO) + 2
     if LARG_JAN < 16
          LARG_JAN = 16
     endif
     COL := (80 - LARG_JAN) / 2
     SALVA_TELA := savescreen (LIN,0,LIN + 5,maxcol ())
     setcolor (COR_CONFIRMA)
     setcolor (COR_REVERSA ())
     @ LIN,COL clear to LIN + 3,COL + LARG_JAN
     SOMBRA (LIN,COL,LIN + 3,COL + LARG_JAN)
     @ LIN,COL to LIN + 3,COL + LARG_JAN
     setcolor (COR_CONFIRMA)
     @ LIN + 1,COL + 2 say TEXTO
     CENTRO := (LARG_JAN - 9) / 2
     @ LIN + 2,COL + CENTRO prompt 'Sim'
     @ LIN + 2,COL + CENTRO + 6 prompt 'N„o'
     menu to CONTROLE
     if CONTROLE = 1
          CONTROLE := .t.
     else
          CONTROLE := .f.
     endif
     setcolor (SALVA_COR)
     set (_SET_INTENSITY,SALVA_INTENSIDADE)
     restscreen (LIN,0,LIN + 5,maxcol (),SALVA_TELA)
return (CONTROLE)
Agora observem que no modo GRÁFICO, eliminei bastante coisa:

Code: Select all

function CONFIRMA (TEXTO,PROGRAMA)
     local LIN               := 16,;
           COL               := 0,;
           CENTRO            := 0,;
           LARG_JAN          := 0,;
           CONTROLE          := 2,;
           SALVA_COR         := setcolor (),;
           SALVA_TELA        := nil,;
           SALVA_INTENSIDADE := set (_SET_INTENSITY)
     if len (TEXTO) + 2 < 16
		  TEXTO := TEXTO + SPACE(16-(LEN(TEXTO)+2))
     endif
     MsgYesNo (TEXTO,PROGRAMA)
return // (CONTROLE)
Na MSGYesNo, o resultado esperado às vezes não é o mesmo do modo CONSOLE.

Descobri que se eu usar .not. o resultado é estranho.
Por exemplo, no código abaixo:

Code: Select all

               if .not. CONFIRMA ('Confirma Dados')
                    loop
               endif
No modo CONSOLE tá tudo certo, o processador harbour no RUN-TIME entende corretamente que foi pressionado o não e então é pra desfazer um possível ESC que fo pressionado e volta para o do while .t. .
Mas essa mesma coisa no modo GUI, além de o pressionamento do SIM ele entender como NÃO, se pressionarmos NÃO (já que está aceitando o contrário), ele deveria apenas sair do GET em questão e ir para outro lugar, mas, estranhamente é como se fosse pressionado vários ESCs para sair de todas as telas e voltar ao início do módulo.

O código que contém o CONFIRMA acima e o while .t. é (só pra efeito didático):

Code: Select all

      do while .t.
           CAN_TECLA_F3  := .t.
           set key TECLA_CONT_ANT to
   	   mIND := achoice (12,01,16,77,mLINHA,.T.,'fACH_004',mIND)
           set key TECLA_CONT_ANT to CONTEUDO_ANTERIOR
           CAN_TECLA_F3  := .f.
           if lastkey () = 27
               SALVA_CP := savescreen (0,0,maxrow (),maxcol ())
               // if .not. CONFIRMA ('Confirma Dados')
               if CONFIRMA ('Confirma Dados')
                    exit
               else
                    loop
               endif
               // exit
           elseif lastkey () = 13
                mCDPRODUTO := val (substr (mLINHA [mIND],01,13))
                * Consulta se j  existe o produto/grade na venda
                EXISTE_PRD := EXISTE_PRDUTO ()
                @ 12 + nLinGet,01 get mCDPRODUTO picture pCDPRODUTO  when empty (mCDPRODUTO)      valid fCDPRODUTO () 
                read
                mVT_MERCAD := 0
                mVR_DESCON := 0
                mVT_VENDA  := 0
                for mI = 1 to 15
                     *mQT_VENDA  := val (substr (mLINHA [mI],52,06))
                     mQT_VENDA  := val (substr (mLINHA [mI],51,07))   // Modificado p/Mim em 09/05/01, p/ poder func. cm,kg.
                     mVR_UNITAR := val (substr (mLINHA [mI],59,01) +;
                                   substr (mLINHA [mI],61,03) + '.'+;
                                   substr (mLINHA [mI],65,02))
                     mVR_TOTAL  := val (str (mQT_VENDA * mVR_UNITAR,8,2))
                     mVT_MERCAD += mVR_TOTAL
                next  
                mVR_DESCON := mVT_MERCAD * (mVR_PERDES/100)
                mVT_VENDA  := mVT_MERCAD - mVR_DESCON
                MOSTRA_COMPLEMENTO ()
           endif
      enddo
Bom, alguém aqui, sabe me dizer por que isso acontece e como resolver?
MICROVOLUTION
Posts: 146
Joined: Sat May 30, 2015 5:15 am

Re: Mapping Clipper Alert() to MsgYesNo()

Post by MICROVOLUTION »

boa noite!
por padrão a MSGYESNO() vem marcado o YES.
Tem como habilitar para vir marcado o NO?

Estou usando a HMG 3.5
franco
Posts: 877
Joined: Sat Nov 02, 2013 5:42 am
DBs Used: DBF
Location: Canada

Re: Mapping Clipper Alert() to MsgYesNo()

Post by franco »

Post by edk » Wed Apr 04, 2018 11:18 am

MsgYesNo ( <xData> , [<cTitle>] , [<lRevertDefault>] ) --> lResponse

MsgYesNo ( <xData> , [<cTitle>] ) or MsgYesNo ( <xData> , [<cTitle>], .F. ) default "Yes" button
MsgYesNo ( <xData> , [<cTitle>] , .T. ) default "No" button

I use
if .not. msgyesno('Confirma Dados'," ",.T.) // for no
loop
endif
continue .........program
All The Best,
Franco
Canada
MICROVOLUTION
Posts: 146
Joined: Sat May 30, 2015 5:15 am

Re: Mapping Clipper Alert() to MsgYesNo()

Post by MICROVOLUTION »

franco wrote: Tue Dec 29, 2020 6:44 am Post by edk » Wed Apr 04, 2018 11:18 am

msgyesno('Confirma Dados'," ",.T.) // for no
ah sim! vou experimentar e trago aqui o resultado
MICROVOLUTION
Posts: 146
Joined: Sat May 30, 2015 5:15 am

Re: Mapping Clipper Alert() to MsgYesNo()

Post by MICROVOLUTION »

MICROVOLUTION wrote: Tue Dec 29, 2020 4:39 pm ah sim! vou experimentar e trago aqui o resultado
grato, deu certo! Feliz 2021 a todos(as)!
congratulations... thanks.
happy new year for all!
Post Reply