Página 1 de 4

MsgYesNo: Tem como descentralizar ?

Enviado: 17 Out 2012 12:04
por Vandi
Bom dia,

Alguém sabe me dizer se tem como colocar a caixa de diálogo MSGYESNO em outra posição da tela que não seja o centro, ou seja, colocar na parte inferior da tela e mais a direita?

Agradecimentos antecipados,

Gilvandi

MsgYesNo: Tem como descentralizar ?

Enviado: 17 Out 2012 12:30
por Pablo César
Eu tenho feito uma função própria pra isso. No prg aplicativo STRU (disponível na seção de Downloads) tem uma função chamada MyAlert, onde o terceiro parâmetro coloca nRow abaixo. Talvez possa dar uma idéia.

MsgYesNo: Tem como descentralizar ?

Enviado: 17 Out 2012 13:43
por Pablo César
Mover a janela seria o caso, se fosse possível. Não fiz nenhum teste, mas acredito que obtendo o handle da janela, seja através do título, você poderia utilizar o MoveWindow( FormHandle, 0, 0, Width, Height, .t. ) ou SetWindowPos como esta ultima função que é apresentada na função C abaixo:

Código: Selecionar todos

#pragma BEGINDUMP

#define HB_OS_WIN_USED
#define _WIN32_WINNT   0x0400

#include <windows.h>
#include "hbapi.h"
#include "hbapiitm.h"


HB_FUNC ( C_CENTER ) 
{
	RECT rect;
	int w, h, x, y;
	GetWindowRect((HWND) hb_parnl (1), &rect);
	w  = rect.right  - rect.left;
	h = rect.bottom - rect.top;
	SystemParametersInfo( SPI_GETWORKAREA, 1, &rect, 0 );
	x = rect.right - rect.left;
	y = rect.bottom - rect.top;
	SetWindowPos( (HWND) hb_parnl (1), HWND_TOP, (x - w) / 2, (y - h) / 2 + 1, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE ) ;
}
#pragma ENDDUMP

MsgYesNo: Tem como descentralizar ?

Enviado: 17 Out 2012 15:00
por Vandi
Pablo,

Boa tarde,

Não conseguí compilar o STRU.PRG, deu vários erros, inclusive nas cláusulas:

PICTALIGNMENT TOP
ROWSOURCE NIL
COLUMNFIELDS NIL
entre outras...

Estou usando o HARBOUR 3.1.0dev (Ref. 17094)


Gilvandi

MsgYesNo: Tem como descentralizar ?

Enviado: 17 Out 2012 16:55
por Pablo César
Vandi escreveu:Não conseguí compilar o STRU.PRG, deu vários erros
Você pode até compilar o STRU, sempre e quando você utilizar o HMG de preferência a versão 3.0.44, pois o arquivo Stru.hbp encontra-se no pacote. Mas não foi isso que eu indiquei. Eu disse para você procurar a Function MyAlert() e você poderia controlar adicionando o valor no terceiro parâmetro.

MsgYesNo: Tem como descentralizar ?

Enviado: 17 Out 2012 17:11
por Vandi
Ok, Pablo,

Já havia entendido que era apenas para usar a função MyAlert, mas eu tentei compilar simplesmente porque queria ver antecipadamente o funcionamento da mesma.

Gilvandi

MsgYesNo: Tem como descentralizar ?

Enviado: 17 Out 2012 17:49
por Vandi
Pablo,

Boa tarde,

Desculpe incomodá-lo com um assunto tão "pequeno", mas é que coloquei a função MyAlert no meu sistema, fiz alguns teste mas não funcionou. Mudei o terceiro parâmetro da função (nRow), ora para 200 e ora para 4, porém não surtiu qualquer efeito. A janela de diálogo permaneceu centralizada.
Onde foi que eu errei?


Gilvandi

MsgYesNo: Tem como descentralizar ?

Enviado: 17 Out 2012 21:00
por Pablo César
Vandi escreveu:Desculpe incomodá-lo com um assunto tão "pequeno"
Imagina, não é incômodo. Inclusive esta experiência que passamos juntos, conseguimos detectar uma pequena carência no código STRU.
coloquei a função MyAlert no meu sistema, fiz alguns teste mas não funcionou. Mudei o terceiro parâmetro da função (nRow), ora para 200 e ora para 4, porém não surtiu qualquer efeito.
Você está certo, está faltando o código diferenciando o código interno C_CENTER, pois eu não incluído outro de forma diferenciada.

Então nessa mesma Function MyAlert, altere a linha onde chama C_CENTER(GetFormHandle( "MyAlert"),nRow) por W_CENTER(GetFormHandle( "MyAlert"),nRow)

E inclua este código no pragma:

Código: Selecionar todos

HB_FUNC ( W_CENTER ) 
{
	RECT rect;
	int w, h, x, y;
	GetWindowRect((HWND) hb_parnl( 1 ), &rect);
	w  = rect.right  - rect.left;
	h = rect.bottom - rect.top;
	SystemParametersInfo( SPI_GETWORKAREA, 1, &rect, 0 );
	x = rect.right - rect.left;
	y = rect.bottom - rect.top;
	SetWindowPos( (HWND) hb_parnl (1), HWND_TOP, (x - w) / 2, ((y - h) / 2 + 1)+(16*hb_parnl( 2 )), 0, 0, SWP_NOSIZE | SWP_NOACTIVATE ) ;
}
A janela de diálogo permaneceu centralizada.
Caso você não queira horizontalmente centralizada, você poderia passar outro parâmetro informando a coluna on deve começar. Aí terá que substituir rect.top por hb_parnl( 3 ) caso passe 3 parâmetros no W_CENTER.

MsgYesNo: Tem como descentralizar ?

Enviado: 20 Out 2012 18:51
por Vandi
Pablo,

Boa noite...

Primeiramente peço desculpas pela demora em responder... e depois quero dizer que com a alteração sugerida o sistema ficou 100%, ótimo mesmo...
Obrigado,

Gilvandi

MsgYesNo: Tem como descentralizar ?

Enviado: 05 Dez 2015 23:02
por microvolution
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:

Código: Selecionar todos

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:

Código: Selecionar todos

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:

Código: Selecionar todos

               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):

Código: Selecionar todos

      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?

MsgYesNo: Tem como descentralizar ?

Enviado: 05 Dez 2015 23:22
por microvolution
uma última informação que acabo de descobrir no google, mas que também não funcionou. foi modificar o MSGyesno para:

Código: Selecionar todos

     MsgYesNo (TEXTO,PROGRAMA,{'Yes','No'})
vlw mais uma vez!

MsgYesNo: Tem como descentralizar ?

Enviado: 06 Dez 2015 08:50
por asimoes
Uma outra forma de exibir caixa de diálogo usando api do windows.

Código: Selecionar todos

IF MensagemGui("Deseja realmente sair?", 1) == 1
  QUIT
ENDIF

Código: Selecionar todos

#include "hbdyn.ch"
#define MB_OK                       0x00000000
#define MB_OKCANCEL                 0x00000001
#define MB_ABORTRETRYIGNORE         0x00000002
#define MB_YESNOCANCEL              0x00000003
#define MB_YESNO                    0x00000004
#define MB_RETRYCANCEL              0x00000005
#define MB_CANCELTRYCONTINUE        0x00000006
#define MB_ICONHAND                 0x00000010
#define MB_ICONQUESTION             0x00000020
#define MB_ICONEXCLAMATION          0x00000030
#define MB_ICONASTERISK             0x00000040
#define MB_USERICON                 0x00000080
#define MB_DEFBUTTON2               0x00000100
#define MB_DEFBUTTON3               0x00000200
#define MB_DEFBUTTON4               0x00000300
#define MB_SYSTEMMODAL              0x00001000
#define MB_TASKMODAL                0x00002000
#define MB_HELP                     0x00004000
#define MB_NOFOCUS                  0x00008000
#define MB_SETFOREGROUND            0x00010000
#define MB_DEFAULT_DESKTOP_ONLY     0x00020000
#define MB_TOPMOST                  0x00040000
#define MB_RIGHT                    0x00080000
#define MB_RTLREADING               0x00100000


FUNCTION MensagemGui(cMensagem,nPergunta)
LOCAL nEscolha:=0
   SWITCH nPergunta
   CASE 1
        nEscolha:=hb_dynCall( { "MessageBoxA", "user32.dll",HB_DYN_CALLCONV_STDCALL},0,cMensagem, "Aviso do Sistema",hb_bitOr( MB_YESNO, MB_ICONASTERISK ))
        IF nEscolha = 6
           nEscolha:=1
        ELSEIF nEscolha = 7
           nEscolha:=2
        ENDIF
        EXIT   
   CASE 2
        nEscolha:=hb_dynCall( { "MessageBoxA", "user32.dll",HB_DYN_CALLCONV_STDCALL},0,cMensagem, "Aviso do Sistema",hb_bitOr( MB_YESNO, MB_ICONASTERISK, MB_DEFBUTTON2 ))
        IF nEscolha = 6
           nEscolha:=1
        ELSEIF nEscolha = 7
           nEscolha:=2
        ENDIF
        EXIT   
   CASE 3
        nEscolha:=hb_dynCall( { "MessageBoxA", "user32.dll",HB_DYN_CALLCONV_STDCALL},0,cMensagem, "Aviso do Sistema",hb_bitOr( MB_YESNOCANCEL, MB_ICONASTERISK ))
        IF nEscolha = 6
           nEscolha:=1
        ELSEIF nEscolha = 7
           nEscolha:=2
        ELSE
           nEscolha:=-1
        ENDIF
        EXIT
   CASE 4
        nEscolha:=hb_dynCall( { "MessageBoxA", "user32.dll",HB_DYN_CALLCONV_STDCALL},0,cMensagem, "Aviso do Sistema",hb_bitOr( MB_YESNOCANCEL, MB_ICONASTERISK, MB_DEFBUTTON3 ))
        IF nEscolha = 6
           nEscolha:=1
        ELSEIF nEscolha = 7
           nEscolha:=2
        ELSE
           nEscolha:=-1
        ENDIF
        EXIT   
   ENDSWITCH
   hb_LibFree("user32.dll")
RETURN nEscolha

MsgYesNo: Tem como descentralizar ?

Enviado: 06 Dez 2015 11:45
por microvolution
prezado professor "asimoes", fiz o teste de sua sugestão, conforme código abaixo:

Código: Selecionar todos

     do while .t.
          INICIO      := .t.
          if INTEGRIDADE_OK ()
               TELA_PADRAO (procname (),DESC_SIST,COR_DESKTOP,chr (189))
               aadd (TECLAS,{'Esc','Retorna'})
               aadd (TECLAS,{'F4','Consulta'})
               TECLAS_FUNCAO (TECLAS)
               if VERIFICOU_SENHA ()
                    TECLAS := {}
                    aadd (TECLAS,{'Esc','Retorna'})
                    aadd (TECLAS,{'F1','Help'})
                    aadd (TECLAS,{'F2','Utilit rios'})
                    aadd (TECLAS,{'F4','Consultas'})
                    TECLAS_FUNCAO (TECLAS)
                    setcolor (COR_NORMAL)
                    ABRE_ARQ_ACESSO ()
                    MCI10000 ()
               else
                    // if CONFIRMA2 ('Confirma a sa¡da do sistema') // modificado p/modo gráfico 2/12/15w
                    // if MsgYesNo ('Confirma a Saída do Sistema ?')
                    IF MensagemGui ("Deseja realmente sair?", 1) == 1                    // if CONFIRMA ('Confirma a saída do sistema')
                         setcolor (SALVA_COR)
                         @ 00,00 clear to maxrow (),maxcol ()
                         @ 00,00 say 'MVinfo Sistemas & Automa‡Æo ...'
                         @ 01,00 say 'Obrigado pelo acesso. Volte Sempre !'
                         inkey(3)
                         exit
                    else
                         loop
                    endif
               endif
          else
               setcolor (SALVA_COR)
               @ 00,00 clear to maxrow (),maxcol ()
               @ 00,00 say 'Acesso negado ...'
               @ 01,00 say 'Arquivo de Controle Alterado !'
               @ 02,00 say "Pressione <ENTER> para encerrar..." // acrescentada em 05/09/11w
      	       inkey(0) // coloquei provisoriamente pra ver onde o SiCCA deu erro - 06/09/11w
               exit
          endif
          close all
     enddo
Então, o resultado foi o mesmo usando o MSGYESNO, o qual é:
se pressionar, clicar em SIM o sistema realmente sai.
Mas, se clicarmos em NÃO o sistema não sai, mas, também a mensagem fica ali em loop, e, de acordo com o ELSE acima, deveria voltar ao início do do while .t. e não a MENSAGEM ficar em LOOP, pois é isso que está acontencendo.

Aguardo mais instruções prezado parceiro e colaborador!

MsgYesNo: Tem como descentralizar ?

Enviado: 06 Dez 2015 14:01
por JoséQuintas
Não precisa rotinas especiais pra usar muitas funções da API do Windows, porque já fazem parte da hbwin.

Teste se passando referência da janela atual resolve.
Uso assim no Harbour 3.4, mas sinceramente nunca reparei como fica a posição da mensagem:

Código: Selecionar todos

FUNCTION MsgYesNo( cText )

   LOCAL lValue

   lValue := wapi_MessageBox( wapi_GetActiveWindow(), cText, "Confirmação", MB_YESNO + WIN_MB_ICONQUESTION + WIN_MB_DEFBUTTON2 ) == IDYES
   RETURN lValue
incluir no hbp a linha hbwin.hbc

Mas tem um detalhe que mencionou:
Está passando aos poucos de console pra GUI.
Se é assim, melhor não se preocupar com essa mensagem em estilo Windows agora.
Apenas deixe como rotina separada, e depois vai trocar quando quiser.

MsgYesNo: Tem como descentralizar ?

Enviado: 06 Dez 2015 18:00
por microvolution
Prezado JQuintas, testei seu exemplo, mas a mensagem de erro foi:
BASE/1003 variable does not exist: MB_YESNO (na linha 5 do exemplo).

E agora patrão?