FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Función MsgYesNoCancel()
Posts: 1464
Joined: Mon Oct 10, 2005 02:38 PM

Función MsgYesNoCancel()

Posted: Wed Jul 08, 2026 04:48 PM

Hola a todos,

Me podéis decir si la función MsgYesNoCancel() devuelve .T./.F.? Es de FWH? Es de Harbour?

**Editado. Si FWH Noviembre 2011

Yo la tenía definida como STATIC en un PRG antiguo, la he comentado, compila, linca pero al usarla parece ser que devuelve .T./.F.

// *************************************************** static function MsgYesNoCancel( cMsg, cTitle ) return MessageBox( GetActiveWindow(), cMsg, cTitle, ; nOR( MB_ICONQUESTION, MB_YESNOCANCEL ) ) // ***************************************************

Es eso correcto?

Si la descomento vuelve a funcionar como esperaba (devolvía 6, 7 ó 2, creo recordar) **Editado. Si Noviembre 2011 **Pués algo pasa, o me pasa.

Gracias,

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 8716
Joined: Tue Dec 20, 2005 07:36 PM

Re: Función MsgYesNoCancel()

Posted: Wed Jul 08, 2026 04:56 PM

No és mejor:

   MsgInfo( Alert( "a test", { "&Yes", "&No" }, "Select an option" ) == 1 )

?

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 8716
Joined: Tue Dec 20, 2005 07:36 PM

Re: Función MsgYesNoCancel()

Posted: Wed Jul 08, 2026 05:00 PM

Ó,

         IF MsgNoYes( OemToAnsi( "ATEN€ÇO:-> MOTIVO DE SEGURAN€A:       " ) +CRLF+ ;
                                                                            +CRLF+ ;
                      OemToAnsi( "DESEJA ALTERAR OS DADOS DE APROVAۂO? " ) +CRLF+ ;
                      OemToAnsi( "USE ESTA OPۂO, SE ERROU ALGUM DADO   " ) +CRLF+ ;
                      OemToAnsi( "NA APROVAۂO DA PROPOSTA.       ERROU?" ) +CRLF+ ;
                      OemToAnsi( "PROPOSTA Jµ APROVADA NO BANCO DE DADOS" ) +CRLF+ ;
                                                                            +CRLF+ ;
                      OemToAnsi( "<S>im Para Alterar os Dados Errado(s)." ) +CRLF+ ;
                      OemToAnsi( "<N>Æo Para NÆo Alterar os Dados.      " ),       ;
                      OemToAnsi( "ATENۂO: ALTERAR DADOS DA APROVAۂO?  " ) ) = .F.


        RETURN( .F. )

     ENDIF

  ENDIF

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 1464
Joined: Mon Oct 10, 2005 02:38 PM

Re: Función MsgYesNoCancel()

Posted: Wed Jul 08, 2026 05:18 PM
karinha wrote:

No és mejor:

   MsgInfo( Alert( "a test", { "&Yes", "&No" }, "Select an option" ) == 1 )

?

Regards, saludos.

Gracias Karinha,

Le daré unas vueltas, me permitirá poner los textos que yo quiera.

Pero aun así, MsgYesNoCancel() está funcionando correctamente?

Gracias de nuevo

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 8716
Joined: Tue Dec 20, 2005 07:36 PM

Re: Función MsgYesNoCancel()

Posted: Wed Jul 08, 2026 06:09 PM
FiveWiDi wrote:

No és mejor:

   MsgInfo( Alert( "a test", { "&Yes", "&No" }, "Select an option" ) == 1 )

?

Regards, saludos.

Gracias Karinha,

Le daré unas vueltas, me permitirá poner los textos que yo quiera.

Pero aun así, MsgYesNoCancel() está funcionando correctamente?

Gracias de nuevo

Prueba \SAMPLES\IDE.PRG, verás que NO FUNCIONA. ni con HARBOUR, ni com xHARBOUR.

Saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 44508
Joined: Thu Oct 06, 2005 05:47 PM

Re: Función MsgYesNoCancel()

Posted: Wed Jul 08, 2026 06:48 PM

Carlos,

HB_FUNC( MSGYESNOCANCEL )
{
   hb_retl( msg_box( "", "Select an option", MB_YESNOCANCEL | MB_ICONQUESTION ) );
}

Actualmente devuelve un lógico que entiendo sería Si ó no si

Para distinguir los tres posibles valores: Si, No, Cancel, deberiamos hacer que devuelva un número en vez de un lógico

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 8716
Joined: Tue Dec 20, 2005 07:36 PM

Re: Función MsgYesNoCancel()

Posted: Wed Jul 08, 2026 07:21 PM
// By master Navarro

#include "fivewin.ch"

/* // duplicate? Porque?
#define MB_USERICON 128
#define MB_ICONASTERISK 64
#define MB_ICONEXCLAMATION 0x30
#define MB_ICONWARNING 0x30
#define MB_ICONERROR 16
#define MB_ICONHAND 16
#define MB_ICONQUESTION 32
#define MB_OK 0
#define MB_ABORTRETRYIGNORE 2
#define MB_APPLMODAL 0
#define MB_DEFAULT_DESKTOP_ONLY 0x20000
#define MB_HELP 0x4000
#define MB_RIGHT 0x80000
#define MB_RTLREADING 0x100000
#define MB_DEFBUTTON1 0
#define MB_DEFBUTTON2 256
#define MB_DEFBUTTON3 512
#define MB_DEFBUTTON4 0x300
#define MB_ICONINFORMATION 64
#define MB_ICONSTOP 16
#define MB_OKCANCEL 1
#define MB_RETRYCANCEL 5
*/

#define MB_SETFOREGROUND 0x10000

//duplicate? porque?
//#define MB_SYSTEMMODAL 4096
//#define MB_TASKMODAL 0x2000
//#define MB_YESNO 4
//#define MB_YESNOCANCEL 3
//#define MB_ICONMASK 240
//#define MB_DEFMASK 3840
//#define MB_MODEMASK 0x00003000
//#define MB_MISCMASK 0x0000C000
//#define MB_NOFOCUS 0x00008000
//#define MB_TYPEMASK 15
//#define MB_TOPMOST 0x40000
//#define MB_CANCELTRYCONTINUE 6

/* // duplicate? porque?
#define IDOK 1
#define IDCANCEL 2
#define IDABORT 3
#define IDRETRY 4
#define IDIGNORE 5
#define IDYES 6
#define IDNO 7
#define IDCLOSE 8
#define IDHELP 9
#define IDTRYAGAIN 10
#define IDCONTINUE 11
*/

#define MB_TIMEDOUT 32000

FUNCTION Main()

   MsgInfoTimeout( 3 )

   MsgYesNoTimeout( 5 )

   MsgOkCancelTimeout( 5 )

RETURN NIL

PROCEDURE MsgInfoTimeout( nTimeout )

   LOCAL nFlag, nMilliSeconds, nRet

   nFlag := MB_OK + MB_SETFOREGROUND + MB_SYSTEMMODAL + MB_ICONINFORMATION

   nMilliSeconds := nTimeout * 1000

   nRet := MessageBoxTimeout ( "Test a timeout of " + hb_ntos ( nTimeout ) + " seconds.", "MsgInfo Timeout", nFlag, nMilliSeconds )

   DO CASE
   CASE nRet == IDOK

  MsgInfo ( "OK" , "Result" )

   CASE nRet == MB_TIMEDOUT

  MsgInfo ( "TimeOut in " + hb_ntos ( nTimeout ) + " seconds." , "Result" )

   OTHERWISE

  MsgInfo ( "TimeOut --> nRet = " + hb_ntos ( nRet ) , "Result" )

   ENDCASE

RETURN

PROCEDURE MsgYesNoTimeout( nTimeout )

   LOCAL nFlag, nMilliSeconds, nRet

   nFlag := MB_YESNO + MB_SETFOREGROUND + MB_SYSTEMMODAL + MB_ICONQUESTION

   nMilliSeconds := nTimeout * 1000

   nRet := MessageBoxTimeout ( "Test a timeout of " + hb_ntos ( nTimeout ) + " seconds.", "MsgYesNo Timeout", nFlag, nMilliSeconds )

   DO CASE
   CASE nRet == IDYES

  MsgInfo ( "YES" , "Result" )

   CASE nRet == IDNO

  MsgInfo ( "NO" , "Result" )

   CASE nRet == MB_TIMEDOUT

  MsgInfo ( "TimeOut in " + hb_ntos ( nTimeout ) + " seconds." , "Result" )

   OTHERWISE

  MsgInfo ( "TimeOut --> nRet = " + hb_ntos ( nRet ) , "Result" )

   ENDCASE

RETURN

PROCEDURE MsgOkCancelTimeout( nTimeout )

   LOCAL nFlag, nMilliSeconds, nRet

   nFlag := MB_OKCANCEL + MB_SETFOREGROUND + MB_SYSTEMMODAL + MB_ICONQUESTION

   nMilliSeconds := nTimeout * 1000

   nRet := MessageBoxTimeout ( "Test a timeout of " + hb_ntos ( nTimeout ) + " seconds.", "MsgOkCancel Timeout", nFlag, nMilliSeconds )

   DO CASE
   CASE nRet == IDOK

  MsgInfo ( "OK" , "Result" )

   CASE nRet == IDCANCEL

  MsgInfo ( "CANCEL" , "Result" )

   CASE nRet == MB_TIMEDOUT

  MsgInfo ( "TimeOut in " + hb_ntos ( nTimeout ) + " seconds." , "Result" )

   OTHERWISE

  MsgInfo ( "TimeOut --> nRet = " + hb_ntos ( nRet ) , "Result" )

   ENDCASE

RETURN

#pragma BEGINDUMP

#ifdef __POCC__
#define _WIN32_WINNT  0x0500
#else
#define _WIN32_WINNT  0x0400
#endif

#include <windows.h>

#include "hbapi.h"

#ifdef __XHARBOUR__
   #include "hbverbld.h"
   #if defined( HB_VER_CVSID ) && ( HB_VER_CVSID < 9639 )
      #define HB_ISCHAR( n )  ISCHAR( n )
   #endif
   #if defined( HB_VER_CVSID ) && ( HB_VER_CVSID < 9798 )
      #define HB_ISNIL( n )   ISNIL( n )
   #endif
#endif

// JK HMG 1.2 Experimental Build 16g
// MessageBoxIndirect( [hWnd], cText, [cCaption], [nStyle], [xIcon], [hInst], [nHelpId], [nProc], [nLang] )
// Contributed by Andy Wos <andywos@unwired.com.au>

HB_FUNC( MESSAGEBOXINDIRECT )
{
   MSGBOXPARAMS mbp;

   mbp.cbSize             = sizeof( MSGBOXPARAMS );
   mbp.hwndOwner          = HB_ISNIL( 1 ) ? GetActiveWindow() : ( HWND ) hb_parnl( 1 );
   mbp.hInstance          = HB_ISNIL( 6 ) ? GetModuleHandle( NULL ) : ( HINSTANCE ) hb_parnl( 6 );
   mbp.lpszText           = HB_ISCHAR( 2 ) ? hb_parc( 2 ) : ( HB_ISNIL( 2 ) ? NULL : MAKEINTRESOURCE( hb_parni( 2 ) ) );
   mbp.lpszCaption        = HB_ISCHAR( 3 ) ? hb_parc( 3 ) : ( HB_ISNIL( 3 ) ? "" : MAKEINTRESOURCE( hb_parni( 3 ) ) );
   mbp.dwStyle            = ( DWORD ) hb_parni( 4 );
   mbp.lpszIcon           = HB_ISCHAR( 5 ) ? hb_parc( 5 ) : ( HB_ISNIL( 5 ) ? NULL : MAKEINTRESOURCE( hb_parni( 5 ) ) );
   mbp.dwContextHelpId    = HB_ISNIL( 7 ) ? 0 : ( DWORD ) hb_parni( 7 );
   mbp.lpfnMsgBoxCallback = HB_ISNIL( 8 ) ? NULL : ( MSGBOXCALLBACK ) hb_parnl( 8 );
   mbp.dwLanguageId       = HB_ISNIL( 9 ) ? MAKELANGID( LANG_NEUTRAL, SUBLANG_NEUTRAL ) : ( DWORD ) hb_parni( 9 );

   hb_retni( ( int ) MessageBoxIndirect( &mbp ) );
}

typedef int ( WINAPI * PMessageBoxTimeout )( HWND, LPCSTR, LPCSTR, UINT, WORD, DWORD );
static PMessageBoxTimeout pMessageBoxTimeout = NULL;

int WINAPI MessageBoxTimeout( HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType, WORD wLanguageId, DWORD dwMilliseconds )
{
   if( pMessageBoxTimeout == NULL )
   {
      HMODULE hLib = LoadLibrary( "User32.dll" );

  pMessageBoxTimeout = ( PMessageBoxTimeout ) GetProcAddress( hLib, "MessageBoxTimeoutA" );
   }

   if( pMessageBoxTimeout == NULL )
      return FALSE;

   return pMessageBoxTimeout( hWnd, lpText, lpCaption, uType, wLanguageId, dwMilliseconds );
}

//       HMG_MessageBoxTimeout (Text, Caption, nTypeButton, nMilliseconds) ---> Return iRetButton
HB_FUNC( MESSAGEBOXTIMEOUT )
{
   HWND         hWnd           = GetActiveWindow();
   const char * lpText         = ( const char * ) hb_parc( 1 );
   const char * lpCaption      = ( const char * ) hb_parc( 2 );
   UINT         uType          = HB_ISNIL( 3 ) ? MB_OK : ( UINT ) hb_parnl( 3 );
   WORD         wLanguageId    = MAKELANGID( LANG_NEUTRAL, SUBLANG_NEUTRAL );
   DWORD        dwMilliseconds = HB_ISNIL( 4 ) ? ( DWORD ) 0xFFFFFFFF : ( DWORD ) hb_parnl( 4 );

   int iRet = MessageBoxTimeout( hWnd, lpText, lpCaption, uType, wLanguageId, dwMilliseconds );

   hb_retni( iRet );
}

#pragma ENDDUMP

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 1464
Joined: Mon Oct 10, 2005 02:38 PM

Re: Función MsgYesNoCancel()

Posted: Thu Jul 09, 2026 08:07 AM
Antonio Linares wrote:

Carlos,

HB_FUNC( MSGYESNOCANCEL )
{
   hb_retl( msg_box( "", "Select an option", MB_YESNOCANCEL | MB_ICONQUESTION ) );
}

Actualmente devuelve un lógico que entiendo sería Si ó no si

Para distinguir los tres posibles valores: Si, No, Cancel, deberiamos hacer que devuelva un número en vez de un lógico

Y eso? Cuando cambió? Se sabe? Y porqué?
Si su comportamiento es .T. ó .F. entonces ya tenemos MsgYesNo() y MsgNoYes().
En el whatsnew de noviembre de 2011 se menciona MsgYesNoCancel() y posibles valores de retorno ( 6, 7 ó 2 )

Tal como está ahora y viendo este código (yo no sé C), no devolverá siempre .T.?

Un Saludo

Carlos G.



FiveWin 25.12 + Harbour 3.2.0dev (r2502110321), BCC 7.7 Windows 11 Home

Posts: 44508
Joined: Thu Oct 06, 2005 05:47 PM

Re: Función MsgYesNoCancel()

Posted: Thu Jul 09, 2026 08:39 AM

Estimado Carlos,

1. Creación — 23 nov 2011
Commit: a6b5be6017 (antonio)
Mensaje: * New: function MsgYesNoCancel( cMsg, cTitle ) --> 6 (Yes), 7 (No), 2 (Cancel)

Se implementó con hb_retnl, devolviendo el código numérico de MessageBox:

hb_retnl( MessageBox( GetActiveWindow(), szMsg, szTitle,
MB_YESNOCANCEL | MB_ICONQUESTION ) );

  1. Cambio a hb_retl — 19 sep 2015
    Commit: e76bcf25da (Nageswararao Gunupudi)
    Mensaje: msgs.c: Enhancement: Unicode support for common messageboxes...

Refactor que introdujo el helper msg_box() y simplificó todas las funciones Msg*. En MSGYESNOCANCEL quedó así:

hb_retl( msg_box( "", "Select an option", MB_YESNOCANCEL | MB_ICONQUESTION ) );

Estamos corrigiendolo para que devuelva los valores numéricos correctos:

HB_FUNC( MSGYESNOCANCEL )
{
   hb_retni( msg_box( "", "Select an option", MB_YESNOCANCEL | MB_ICONQUESTION ) );
}
regards, saludos

Antonio Linares
www.fivetechsoft.com

Continue the discussion