MsgYesNo: Tem como descentralizar ?

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Vandi
Usuário Nível 2
Usuário Nível 2
Mensagens: 83
Registrado em: 16 Set 2011 23:26
Localização: Brasilia-DF

MsgYesNo: Tem como descentralizar ?

Mensagem 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
Editado pela última vez por Pablo César em 17 Out 2012 12:32, em um total de 1 vez.
Razão: Título re-editado
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

MsgYesNo: Tem como descentralizar ?

Mensagem 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.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

MsgYesNo: Tem como descentralizar ?

Mensagem 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
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Vandi
Usuário Nível 2
Usuário Nível 2
Mensagens: 83
Registrado em: 16 Set 2011 23:26
Localização: Brasilia-DF

MsgYesNo: Tem como descentralizar ?

Mensagem 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
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

MsgYesNo: Tem como descentralizar ?

Mensagem 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.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Vandi
Usuário Nível 2
Usuário Nível 2
Mensagens: 83
Registrado em: 16 Set 2011 23:26
Localização: Brasilia-DF

MsgYesNo: Tem como descentralizar ?

Mensagem 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
Vandi
Usuário Nível 2
Usuário Nível 2
Mensagens: 83
Registrado em: 16 Set 2011 23:26
Localização: Brasilia-DF

MsgYesNo: Tem como descentralizar ?

Mensagem 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
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

MsgYesNo: Tem como descentralizar ?

Mensagem 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.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Vandi
Usuário Nível 2
Usuário Nível 2
Mensagens: 83
Registrado em: 16 Set 2011 23:26
Localização: Brasilia-DF

MsgYesNo: Tem como descentralizar ?

Mensagem 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
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

MsgYesNo: Tem como descentralizar ?

Mensagem 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?
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

MsgYesNo: Tem como descentralizar ?

Mensagem 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!
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

MsgYesNo: Tem como descentralizar ?

Mensagem 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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

MsgYesNo: Tem como descentralizar ?

Mensagem 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!
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

MsgYesNo: Tem como descentralizar ?

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
microvolution
Usuário Nível 5
Usuário Nível 5
Mensagens: 1231
Registrado em: 02 Set 2011 22:17
Contato:

MsgYesNo: Tem como descentralizar ?

Mensagem 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?
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
Responder