Página 1 de 1

ALERT() posicionável

Enviado: 15 Fev 2020 16:22
por Hasse
Boa tarde colegas

Faz um bom tempo vi que havia uma função ALERT(), ou NEWALERT() ou ainda ALERTNEW() que permitia estabelecer a sua posição na tela, e NÃO encontro mais.

Alguém lembra ou usa ?

ALERT() posicionável

Enviado: 15 Fev 2020 17:55
por Hasse
Acabei de encontrar:

Trata-se da FUNCTION MYALERT() disponibilizado por
/*
* Pritpal Bedi <bedipritpal@hotmail.com>
*/
está em:
..\Hmg.3.4.3\HARBOUR\contrib\gtwvg\tests\_modal.prg

A dificuldade é que está escrito para uso em GTWVG e preciso em Harbour nativo, podendo ser como uma função externa.

ALERT() posicionável

Enviado: 16 Fev 2020 14:38
por tonicm
Porque não usa a função wapi_MessageBox?

Pode encontrar mais info aqui:
https://pctoledo.org/forum/viewto ... =4&t=19647

ALERT() posicionável

Enviado: 16 Fev 2020 20:43
por JoséQuintas
As funções do Harbour tem fonte, nos fontes do Harbour.
Baixe e altere.

Ela deve usar as definições Top, Bottom, Left, Right, só alterar as posições.
Talvez alterar pra receber dois parâmetros indicando inicio/fim/centro pra altura e largura, indicando alinhamento, se isso resolver.
Na vertical pode querer encima, no meio ou embaixo.
Na horizontal pode querer no início, no meio ou no fim.

Não é tão complexo:
se for no início então inicio = 0, se for no meio inicio = ( total - largura ) / 2, e se for no fim inicio = total - tamanho
Alert( text, options, ALERT_STYLE_CENTER, ALERT_STYLE_CENTER )

ALERT() posicionável

Enviado: 17 Fev 2020 22:33
por Hasse
Boa noite Quintas.
Primeiramente, Obrigado pela atenção.

Qual a versão mínima necessária ?
Tenho instalado o Harbour 3.2.0 - Dev (r1601151502)
Uso o compilador MinGW GNU C 4.6.1 (32-bit)

Esta tua sugestão NÃO funcionou, apesar das dezenas de tentativas com alterações dos parâmetros.
Não apresentou qualquer erro.
A saída sempre foi a mesma, como se não existisse qualquer parâmetro.

ALERT() posicionável

Enviado: 18 Fev 2020 08:24
por JoséQuintas
Talvez pegar fonte do do Clipper.
Pelo que vi o do Harbour não é mais totalmente PRG.

Tem este exemplo do Clipper, só que usa enfeite demais, e talvez o fonte seja complicado.
Nota: é um exemplo que vinha com Clipper 5.2, de tbrowse.
cl52.png
sprdsht.zip
(12.16 KiB) Baixado 285 vezes

ALERT() posicionável

Enviado: 18 Fev 2020 21:58
por Hasse
Boa noite Quintas.

Você é incrível. Ajudando aos colegas SEMPRE. Obrigado.

Vamos aos fatos.

1)-A arquivo que você enviou não contém uma função Alert(). O serviço é feito de outra forma.

2)-Pesquisei nos fontes do xHarbour e encontrei na versão .1.2.1.
Lá o serviço é feito em 2 etapas. A primeira é em PRG normal (alert.prg), que por sua vez invoca uma rotina em C "HB_FUNC( HB_GTALERT )" no arquivo 'gtfunc.c'.
Aí ferrou para mim. Final de linha. Não entendo nadica de C.

Estou anexando os 2 arquivos, na esperança que haja alguma solução.

Alert.prg

Código: Selecionar todos

/*
 * $Id: alert.prg,v 1.28 2008/07/24 14:41:58 modalsist Exp $
 */

/*
 * Harbour Project source code:
 * ALERT() function
 *
 * Released to Public Domain by Vladimir Kazimirchik <v_kazimirchik@yahoo.com>
 * www - http://www.harbour-project.org
 *
 */

/*
 * The following parts are Copyright of the individual authors.
 * www - http://www.harbour-project.org
 *
 * Copyright 1999-2001 Viktor Szakats <viktor.szakats@syenar.hu>
 *    Changes for higher Clipper compatibility, console mode, extensions
 *    __NONOALERT()
 *
 * See doc/license.txt for licensing terms.
 *
 */

#include "box.ch"
#include "common.ch"
#include "inkey.ch"
#include "setcurs.ch"
#include "hbgtinfo.ch"

/* TOFIX: Clipper defines a clipped window for Alert() [vszakats] */

/* NOTE: Clipper will return NIL if the first parameter is not a string, but
         this is not documented. This implementation converts the first
         parameter to a string if another type was passed. You can switch back
         to Clipper compatible mode by undefining constant HB_EXTENSION. [vszakats] */

/* NOTE: Clipper handles these buttons { "Ok", "", "Cancel" } in a buggy way.
         This is fixed. [vszakats] */

/* NOTE: nDelay parameter is a Harbour extension. */

#ifdef HB_C52_UNDOC
STATIC s_lNoAlert
#endif

FUNCTION Alert( xMessage, aOptions, cColor, nDelay )
   LOCAL cMessage
   LOCAL cColorBox
   LOCAL cColorButton
   LOCAL aOptionsOK
   LOCAL nEval
   LOCAL nAt
#ifdef HB_EXTENSION
   LOCAL lFirst
   LOCAL cLine
#endif

#ifdef HB_C52_UNDOC

   DEFAULT s_lNoAlert TO hb_argCheck( "NOALERT" )

   IF s_lNoAlert
      RETURN NIL
   ENDIF

#endif

#ifdef HB_EXTENSION

   IF PCount() == 0
      RETURN NIL
   ENDIF

   cMessage := ""

   IF ISARRAY( xMessage )

      lFirst := .T.
      FOR nEval := 1 TO Len( xMessage )
         IF ISCHARACTER( cLine := xMessage[ nEval ] )
            cMessage += iif( lFirst, "", Chr( 10 ) ) + cLine
            lFirst := .F.
         ENDIF
      NEXT

   ELSE

      DO CASE
      CASE ValType( xMessage ) $ "CM" ; cMessage := StrTran( xMessage, ";", Chr( 10 ) )
      CASE ValType( xMessage ) == "N" ; cMessage := LTrim( Str( xMessage ) )
      CASE ValType( xMessage ) == "D" ; cMessage := DToC( xMessage )
      CASE ValType( xMessage ) == "L" ; cMessage := iif( xMessage, ".T.", ".F." )
      CASE ValType( xMessage ) == "O" ; cMessage := xMessage:className + " Object"
      CASE ValType( xMessage ) == "S" ; cMessage := "@" + xMessage:Name + "()"
      CASE ValType( xMessage ) == "B" ; cMessage := "{||...}"
      OTHERWISE                       ; cMessage := "NIL"
      ENDCASE

   ENDIF

#else

   IF !ISCHARACTER( xMessage )
      RETURN NIL
   ENDIF

   cMessage := StrTran( xMessage, ";", Chr( 10 ) )

#endif

   IF ! ISARRAY( aOptions )
      aOptions := {}
   ENDIF


   IF ! ISCHARACTER( cColor ) .or. EMPTY( cColor )
      cColorBox    := "W+/R"  // first color pair:  (Box)
      cColorButton := "W+/B"  // second color pair: (Buttons)
   ELSE
/*
      cColorButton := StrTran( StrTran( iif( At( "/", cColor ) == 0, "N", SubStr( cColor, At( "/", cColor ) + 1 ) ) + "/" +;
                                        iif( At( "/", cColor ) == 0, cColor, Left( cColor, At( "/", cColor ) - 1 ) ), "+", "" ), "*", "" )
*/  
      nAt := At(",",cColor)
      if nAt == 0
         cColorBox := cColor
         nAt := At("/",cColor)
         if nAt != 0
            cColorButton := SubStr( cColor, nAt+1 )+"/"+ SubStr( cColor, 1, nAt - 1 ) 
            cColorButton := StrTran( cColorButton, "+","") 
            cColorButton := StrTran( cColorButton, "*","") 
         else
            cColorButton := "W+/B" 
         endif
      else
         cColorBox    := Left( cColor, nAt - 1 )
         cColorButton := SubStr( cColor, nAt + 1 )
      endif

   ENDIF

   IF nDelay == NIL
      nDelay := 0
   ENDIF

   aOptionsOK := {}
   FOR nEval := 1 TO Len( aOptions )
      IF ISCHARACTER( aOptions[ nEval ] ) .AND. !Empty( aOptions[ nEval ] )
         AAdd( aOptionsOK, aOptions[ nEval ] )
      ENDIF
   NEXT

   IF Len( aOptionsOK ) == 0
      aOptionsOK := { 'Ok' }
#ifdef HB_C52_STRICT
   /* NOTE: Clipper allows only four options [vszakats] */
   ELSEIF Len( aOpitonsOK ) > 4
      ASize( aOptionsOK, 4 )
#endif
   ENDIF

   RETURN hb_gtAlert( cMessage, aOptionsOK, cColorBox, cColorButton, nDelay );

#ifdef HB_C52_UNDOC

PROCEDURE __NONOALERT()

   s_lNoAlert := .F.

   RETURN

#endif
gtfunc.c - a função HB_FUNC( HB_GTALERT ) está na linha 120

Código: Selecionar todos

/*
 * $Id: gtfunc.c,v 1.3 2008/12/01 11:45:00 marchuet Exp $
 */

/*
 * Harbour Project source code:
 * Harbour extended GT functions
 *
 * Copyright 2006 Przemyslaw Czerpak < druzus /at/ priv.onet.pl >
 * www - http://www.harbour-project.org
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this software; see the file COPYING.  If not, write to
 * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
 * Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/).
 *
 * As a special exception, the Harbour Project gives permission for
 * additional uses of the text contained in its release of Harbour.
 *
 * The exception is that, if you link the Harbour libraries with other
 * files to produce an executable, this does not by itself cause the
 * resulting executable to be covered by the GNU General Public License.
 * Your use of that executable is in no way restricted on account of
 * linking the Harbour library code into it.
 *
 * This exception does not however invalidate any other reasons why
 * the executable file might be covered by the GNU General Public License.
 *
 * This exception applies only to the code released by the Harbour
 * Project under the name Harbour.  If you copy code from other
 * Harbour Project or Free Software Foundation releases into a copy of
 * Harbour, as the General Public License permits, the exception does
 * not apply to the code that you add in this way.  To avoid misleading
 * anyone as to the status of such modified files, you must delete
 * this exception notice from them.
 *
 * If you write modifications of your own for Harbour, it is your choice
 * whether to permit this exception to apply to your modifications.
 * If you do not wish that, delete this exception notice.
 *
 */

#include "hbapigt.h"
#include "hbapiitm.h"
#include "hbapierr.h"

HB_FUNC( HB_SETDISPCP )
{
   if( ISCHAR( 1 ) )
   {
      if( hb_pcount() == 2 && ISLOG( 2 ) )
         hb_gtSetDispCP( hb_parc( 1 ), NULL, hb_parl( 2 ) );
      else
         hb_gtSetDispCP( hb_parc( 1 ), hb_parc( 2 ), hb_parl( 3 ) );
   }
   else
      hb_errRT_BASE_SubstR( EG_ARG, 1089, NULL, "HB_SETDISPCP", HB_ERR_ARGS_BASEPARAMS );
}

HB_FUNC( HB_SETKEYCP )
{
   if( ISCHAR( 1 ) )
      hb_gtSetKeyCP( hb_parc( 1 ), hb_parc( 2 ) );
   else
      hb_errRT_BASE_SubstR( EG_ARG, 1089, NULL, "HB_SETKEYCP", HB_ERR_ARGS_BASEPARAMS );
}

HB_FUNC( HB_SETTERMCP )
{
   if( ISCHAR( 1 ) )
   {
      if( hb_pcount() == 2 && ISLOG( 2 ) )
      {
         hb_gtSetDispCP( hb_parc( 1 ), NULL, hb_parl( 2 ) );
         hb_gtSetKeyCP( hb_parc( 1 ), NULL );
      }
      else
      {
         hb_gtSetDispCP( hb_parc( 1 ), hb_parc( 2 ), hb_parl( 3 ) );
         hb_gtSetKeyCP( hb_parc( 1 ), hb_parc( 2 ) );
      }
   }
   else
      hb_errRT_BASE_SubstR( EG_ARG, 1089, NULL, "HB_SETTERMCP", HB_ERR_ARGS_BASEPARAMS );
}

HB_FUNC( HB_GTINFO )
{
   if( ISNUM( 1 ) )
   {
      HB_GT_INFO gtInfo;

      gtInfo.pNewVal  = hb_param( 2, HB_IT_ANY );
      gtInfo.pNewVal2 = hb_param( 3, HB_IT_ANY );
      gtInfo.pResult  = NULL;

      hb_gtInfo( hb_parni( 1 ), &gtInfo );
      if( gtInfo.pResult )
         hb_itemReturnRelease( gtInfo.pResult );
   }
   else
      hb_errRT_BASE_SubstR( EG_ARG, 3012, NULL, "HB_GTINFO", HB_ERR_ARGS_BASEPARAMS );
}

HB_FUNC( HB_GTVERSION )
{
   hb_retc( hb_gtVersion( hb_parni( 1 ) ) );
}

HB_FUNC( HB_GTALERT )
{
   int iClrNorm = ISCHAR( 3 ) ? hb_gtColorToN( hb_parc( 3 ) ) : hb_parni( 3 ),
       iClrHigh = ISCHAR( 4 ) ? hb_gtColorToN( hb_parc( 4 ) ) : hb_parni( 4 );

   hb_retni( hb_gtAlert( hb_param( 1, HB_IT_ANY ), hb_param( 2, HB_IT_ANY ),
                         iClrNorm, iClrHigh, hb_parnd( 5 ) ) );
}

HB_FUNC( HB_GFXPRIMITIVE )
{
   PHB_ITEM pType   = hb_param( 1, HB_IT_NUMERIC );
   PHB_ITEM pTop    = hb_param( 2, HB_IT_NUMERIC );
   PHB_ITEM pLeft   = hb_param( 3, HB_IT_NUMERIC );
   PHB_ITEM pBottom = hb_param( 4, HB_IT_NUMERIC );
   PHB_ITEM pRight  = hb_param( 5, HB_IT_NUMERIC );
   PHB_ITEM pColor  = hb_param( 6, HB_IT_NUMERIC );

   hb_retni( hb_gtGfxPrimitive( hb_itemGetNI(pType),
                                hb_itemGetNI(pTop), hb_itemGetNI(pLeft),
                                hb_itemGetNI(pBottom), hb_itemGetNI(pRight),
                                hb_itemGetNI(pColor) ) );
}

HB_FUNC( HB_GFXTEXT )
{
   PHB_ITEM pTop    = hb_param( 1, HB_IT_NUMERIC );
   PHB_ITEM pLeft   = hb_param( 2, HB_IT_NUMERIC );
   char *cText      = hb_parc(3);
   PHB_ITEM pColor  = hb_param( 4, HB_IT_NUMERIC );
   PHB_ITEM pSize   = hb_param( 5, HB_IT_NUMERIC );
   PHB_ITEM pWidth  = hb_param( 6, HB_IT_NUMERIC );

   hb_gtGfxText( hb_itemGetNI(pTop),
                 hb_itemGetNI(pLeft), cText, hb_itemGetNI(pColor),
                 hb_itemGetNI(pSize), hb_itemGetNI(pWidth) );
}