No se actualizan, los SAY.

No se actualizan, los SAY.

Postby JMFS-D » Thu Feb 16, 2006 12:23 am

Necesito ayuda, os reproduzco, un poco del codigo que no me funciona:

Code: Select all  Expand view  RUN
FUNCTION CrearIndic( cContab )

   *- Vectores y Matrices: Locales.

      LOCAL axFicheros := {}
      LOCAL anVal        := ARRAY( 4 )

      LOCAL oDlg1
      LOCAL oDlg2

   *- Vectores Objeto: Locales.
     
      LOCAL aoSay        := ARRAY( 4 )
      LOCAL aoMeterInd := ARRAY( 4 )

   *- Borramos los Indices antiguos.

      axFicheros := DIRECTORY( "*.NTX" )

      IF LEN( axFicheros ) > 0
         AEVAL( axFicheros, { | fichero | FERASE( fichero[ F_NAME ] ) } )

         axFicheros := {}
      ENDIF

   DEFINE DIALOG oDlg1 RESOURCE "Indices_Creacion"
      REDEFINE SAY PROMPT OemToAnsi( "CREACIÓN DE LOS INDICES DEL AÑO: "  + cContab )      ID 101 OF oDlg1

   ACTIVATE DIALOG oDlg1 CENTERED NOWAIT

      *- Creación de los Indices de la Base de Datos: CLIENTES.DBF

         AEVAL( anVal, { | elemento, n | anVal[ n ] := 0 } )

         DEFINE DIALOG oDlg2 RESOURCE "Indices_Base_de_Datos"
            REDEFINE SAY    aoSay[ 1 ]                                         ;
                     PROMPT "BASE DE DATOS: CLIENTES.DBF"  ID 101 OF      oDlg2 UPDATE
            REDEFINE SAY    aoSay[ 2 ]                                         ;
                     PROMPT "POR: EL CODIGO DEL CLIENTE"   ID 102 OF oDlg2 UPDATE
            REDEFINE SAY    aoSay[ 3 ]                                         ;
                     PROMPT "POR: EL NOMBRE DEL CLIENTE"   ID 104 OF oDlg2 UPDATE
            REDEFINE SAY    aoSay[ 4 ]                                         ;
                     PROMPT "POR: EL TELEFONO DEL CLIENTE" ID 106 OF oDlg2 UPDATE

            REDEFINE METER aoMeterInd[ 1 ] VAR anVal[ 1 ] ID 103 OF oDlg2
            REDEFINE METER aoMeterInd[ 2 ] VAR anVal[ 2 ] ID 105 OF oDlg2
            REDEFINE METER aoMeterInd[ 3 ] VAR anVal[ 3 ] ID 107 OF oDlg2
            REDEFINE METER aoMeterInd[ 4 ] VAR anVal[ 4 ] ID 109 OF oDlg2
         ACTIVATE DIALOG oDlg2 CENTERED NOWAIT
.
.   Me genera los indices, y realizo una pausa, para ver que muestra el DIALOG. Hasta aquí todo correcto.
.
           MsgInfo( "Pausa..." )

*- Tras la Pausa, pasamos a otra DBF. Por lo que cambio, los SAY del DIALOG. Pero no los cambia, se queda como, cuando se activo el DIALOG. Le pogo la pausa, para verlo, pero nada.

            AEVAL( anVal, { | elemento, n | anVal[ n ] := 0 } )

            aoSay[ 1 ]:SetText( OemToAnsi( "BASE DE DATOS: PRESUPUE.DBF" ) )
            aoSay[ 1 ]:Refresh()
            aoSay[ 2 ]:SetText( OemToAnsi( "POR EL CODIGO DEL CLIENTE" ) )
            aoSay[ 2 ]:Refresh()
            aoSay[ 3 ]:SetText( OemToAnsi( "POR: EL NÚMERO DE PRESUPUESTO" ) )
            aoSay[ 3 ]:Refresh()
            aoSay[ 4 ]:SetText( OemToAnsi( "POR: EL NÚMERO DE PRESUPUESTO"   + ;
                                           " SIN REPETIR"                 ) )
            aoSay[ 4 ]:Refresh()

            oDlg2:UpDate()
            SysReFresh()

*- Y así con una tercera DBF. Tampoco cambía



El DIALOG, tiene definidos los SAY, de manera que no sean de solo escritura, pues pensando que influía, desactive en el WORKSOP, READ ONLY. Pero nada, activado, o no. No me funciona.

¿Que debo hacer?

Saludos, José Mª
Last edited by JMFS-D on Tue Feb 21, 2006 5:15 pm, edited 3 times in total.
JMFS-D
 
Posts: 40
Joined: Thu Jan 12, 2006 5:10 pm

Sigo haciendo pruebas.

Postby JMFS-D » Sun Feb 19, 2006 11:37 am

No, se que sucede. Sigo haciendo pruebas, y no hay forma.

Los SAY, continuan si actualizarse.

¿Me podeís dar, una pequeña orientación?

Gracias anticipadas. Saludos, José Mª
JMFS-D
 
Posts: 40
Joined: Thu Jan 12, 2006 5:10 pm

Postby Antonio Linares » Sun Feb 19, 2006 11:49 am

José Mª,

Este ejemplo funciona correctamente. Quizá te sirva de orientación:
Code: Select all  Expand view  RUN
#include "FiveWin.ch"

function Main()

   local oDlg1, oDlg2, oTimer
   
   DEFINE DIALOG oDlg1 TITLE "First"
   
   @ 2, 2 SAY oSay PROMPT Time()
   
   ACTIVATE DIALOG oDlg1 NOMODAL CENTERED
           
   DEFINE TIMER oTimer ACTION oSay:SetText( Time() )
   
   ACTIVATE TIMER oTimer
   
   DEFINE DIALOG oDlg2 TITLE "Second"
   
   ACTIVATE DIALOG oDlg2
           
return nil
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42107
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Gracias Antonio.

Postby JMFS-D » Mon Feb 20, 2006 6:15 pm

Parece, que ya va en camino.

Espero no molestar, en algún tiempo.

Pero ya se sabe, basta que digas algo, para que ocurra lo contrario.

Saludos, José Mª
JMFS-D
 
Posts: 40
Joined: Thu Jan 12, 2006 5:10 pm

Quita update

Postby leandro » Tue Feb 21, 2006 1:29 pm

Amigo, a mi en alguna oportunidad me sucedio lo mismo y se debia a la clausula UPDATE, intenta quitarla, creo que esto te solucionara el problema.
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Lo que decía.

Postby JMFS-D » Thu Feb 23, 2006 5:44 pm

Antes de nada, ¡Gracias!, por la respuesta Leandro.

Con lo que me respondio Antonio, ¡Gracias! de nuevo, por ello. Y lo que Vd. me contesto, se soluciono el problema.

Pero, "siempre hay un pero", ahora surgio uno nuevo.

La función funciona, hasta que llega el momento de salir, y en vez de seguir a la línea siguiente a la llamada, hace un RETURN a la función que la llamo.

Lo extraño es que si, le pongo un MsgInfo( "Pausa, antes de salir..." ). Antes del RETURN, este no se muestra, y entonces si funciona:

Code: Select all  Expand view  RUN

*- Ficheros de cabecera:

       #INCLUDE "DIRECTRY.CH"
       #INCLUDE "FiveWin.CH"
       #INCLUDE "MESDBF.CH"   // Clase: TDbf
       #INCLUDE "..\..\Include\Comunes.CH"

*- Variables: Estaticas.

   *- Utilizada por la función: PorcentInd.

      STATIC lPrimerVez := TRUE

FUNCTION CrearIndic( cContab )

   *- Vectores: Locales.

      LOCAL axFicheros := {}
      LOCAL anVal      := ARRAY( 5 )

   *- Constantes Objeto: Locales.

      LOCAL oDlg1
      LOCAL oDlg2

   *- Vectores Objeto: Locales.
     
      LOCAL aoSay      := ARRAY( 5 )
      LOCAL aoMeter    := ARRAY( 5 )

   *- Borramos los Indices antiguos.

      axFicheros := DIRECTORY( "*.NTX" )

      IF LEN( axFicheros ) > 0
         AEVAL( axFicheros, ;
                  { | fichero | FERASE( fichero[ F_NAME ] ) } )

         axFicheros := {}
      ENDIF

   DEFINE DIALOG oDlg1 RESOURCE "Indices_Creacion"
      REDEFINE SAY PROMPT OemToAnsi( "CREACIÓN DE LOS INDI" + ;
                "CES DEL AÑO: " + cContab ) ID 101 OF oDlg1

   ACTIVATE DIALOG oDlg1 CENTERED NOWAIT

      DEFINE DIALOG oDlg2 RESOURCE "Indices_Base_de_Datos"
         REDEFINE SAY aoSay[ 1 ] ID 101 OF oDlg2
         REDEFINE SAY aoSay[ 2 ] ID 102 OF oDlg2
         REDEFINE SAY aoSay[ 3 ] ID 104 OF oDlg2
         REDEFINE SAY aoSay[ 4 ] ID 106 OF oDlg2
         REDEFINE SAY aoSay[ 5 ] ID 110 OF oDlg2

         REDEFINE METER aoMeter[ 1 ] VAR anVal[ 1 ] ;
                        ID       103 OF oDlg2
         REDEFINE METER aoMeter[ 2 ] VAR anVal[ 2 ] :
                         ID 105 OF oDlg2
         REDEFINE METER aoMeter[ 3 ] VAR anVal[ 3 ] ;
                        ID 107 OF oDlg2
         REDEFINE METER aoMeter[ 4 ] VAR anVal[ 4 ] ;
                        ID 109 OF oDlg2
         REDEFINE METER aoMeter[ 5 ] VAR anVal[ 5 ] ;
                        ID 111 OF oDlg2
      ACTIVATE DIALOG   oDlg2                               ;
               CENTERED                                  ;
               ON PAINT ( Indexar( aoSay, aoMeter, ;
                           anVal ), oDlg2:End(), oDlg1:End() )
   MsgInfo( "Antes de Salir..." ) // Si lo quito, no funciona
RETURN NIL

FUNCTION Indexar( aoSay, aoMeter, anVal )

   *- Vectores: Locales.

      LOCAL acMensajes := ARRAY( 4 )

   *- Constantes Objeto: Locales.

      LOCAL oDbfClient  // Para: CLIENTES.DBF
      LOCAL oDbfPresup // Para: PRESUPUE.DBF
      LOCAL oDbfFactC  // Para: FACTCLIE.DBF
      LOCAL oDbfProv   // Para: PROVEEDO.DBF
      LOCAL oDbfFactP  // Para: FACTPROV.DBF
      LOCAL oDbfDevoP  // Para: DEVOPROV.DBF

        // Codigo OOP para la generación
        // del fichero: CLIENTES.DBF

         DEFINE DATABASE oDbfClient FILE "CLIENTES.DBF"   ;
                                            ALIAS "CLIENTES"
            FIELD NAME "CODIGO" TYPE "C" LEN 7 DEC 0 OF oDbfClient
            FIELD NAME "NOMBRE"     TYPE "C" LEN 20  DEC 0 OF oDbfClient
            FIELD NAME "APELLIDO1" TYPE "C" LEN  30 DEC 0 OF oDbfClient
            FIELD NAME "APELLIDO2" TYPE "C" LEN  30 DEC 0 OF DbfClient
            FIELD NAME "DOMICILIO" TYPE "C" LEN  40 DEC 0 OF oDbfClient
            FIELD NAME "COD_POSTAL" TYPE "N" LEN 5 DEC 0 OF oDbfClient
            FIELD NAME "POBLACION" TYPE "C" LEN  30 DEC 0 OF oDbfClient
            FIELD NAME "PROVINCIA" TYPE "C" LEN 30  DEC 0 OF oDbfClient
            FIELD NAME "NIF"          TYPE "C" LEN 12 DEC 0 OF oDbfClient
            FIELD NAME "TELEFONO1" TYPE "N" LEN 9 DEC 0 OF oDbfClient
            FIELD NAME "TELEFONO2" TYPE "N" LEN 9 DEC 0 OF oDbfClient

         // Indices del objeto TDbf oDbfClient

            acMensajes := { "BASE DE DATOS: CLIENTES.DBF" , ;
                           "POR: EL CÓDIGO DEL CLIENTE" , ;
                           "POR: EL NOMBRE DEL CLIENTE" , ;
                           "POR: EL TELÉFONO DEL CLIENTE" }

            *- Indice: ClieCod = Clientes Codigo del Cliente.

               INDEX FILE ClieCod ;
                TAG  Codigo ;
                ON    codigo ;
                EVAL ( lPrimerVez := TRUE  , ;
                  PorcentInd( oDbfClient, aoMeter[ 1 ], ;
                       anVal, acMensajes, aoSay ) )  ;
                OF       oDbfClient

            *- Indice: ClieNomb = Clientes Nombre del Cliente.

               INDEX FILE ClieNomb                 ;
               TAG Nombre                        ;
               ON   apellido1 + apellido2 + ;
                       nombre + codigo         ;
               EVAL ( lPrimerVez := TRUE   , ;
                   PorcentInd( oDbfClient, aoMeter[ 2 ] ) )  ;
               OF     oDbfClient

            /* Indice: ClieTele = Clientes
                                       Teléfono del Cliente. */

               INDEX FILE ClieTele ;
               TAG  Telefono ;
               ON PADL( telefono1, 9, "0" ) + ;
                    PADL( telefono2, 9, "0" ) + ;
                    PADL( movil, 9, "0" ) + ;
                    PADL( fax, 9, "0" ) + ;
                   codigo ;
               EVAL ( lPrimerVez := TRUE, ;
                PorcentInd( oDbfClient, aoMeter[ 3 ] ) ) ;
               OF   oDbfClient
           END DATABASE oDbfClient

      ACTIVATE DATABASE oDbfClient // NORECYCLE

      oDbfClient:Close()

       // Codigo OOP para la generación del fichero: PRESUPUE.DBF

     DEFINE DATABASE oDbfPresup FILE "PRESUPUE.DBF" ;
                                 ALIAS "PRESUPUE"
        FIELD NAME "TIPO"            TYPE "N" LEN   1 DEC 0   OF oDbfPresup
        FIELD NAME "ESTADO"        TYPE "N" LEN   1 DEC 0   OF oDbfPresup
        FIELD NAME "CODIGO"        TYPE "C" LEN  7 DEC 0  OF oDbfPresup
        FIELD NAME "NUMPRESUPU" TYPE "C" LEN  5 DEC 0  OF oDbfPresup
        FIELD NAME "FECHAPRESU" TYPE "D" LEN   8 DEC 0 OF oDbfPresup
        FIELD NAME "DESCRIPCIO" TYPE "C" LEN 200 DEC 0 OF oDbfPresup
        FIELD NAME "CANTIDAD"    TYPE "N" LEN   3 DEC 0 OF oDbfPresup
        FIELD NAME "PRECIO"         TYPE "N" LEN   8 DEC 3  OF oDbfPresup
       
        // Indices del objeto TDbf oDbfPresup

            acMensajes := { "BASE DE DATOS: PRESUPUE.DBF" , ;
                "POR: EL CÓDIGO DEL CLIENTE"      , ;
                "POR: EL NÚMERO DE PRESUPUESTO" , ;
                "POR: EL NÚMERO DE PRESUPUESTO, SIN REPETIR" }

            *- Indice: CPCodCli = Clientes Presupuestos Codigo del Cliente.

               INDEX FILE CPCodCli ;
               TAG  Codigo        ;
               ON   codigo          ;
               EVAL ( lPrimerVez := TRUE, ;
                   PorcentInd( oDbfPresup, aoMeter[ 1 ] , ;
                        anVal, acMensajes, aoSay ) )  ;
               OF   oDbfPresup

            /* Indice: CPPresup = Clientes Presupuestos
                               Codigo del Cliente
                               y Número de Presupuesto                      */

               INDEX FILE CPPresup ;
               TAG  Presupu      ;
               ON   codigo + numpresupu   ;
               EVAL ( lPrimerVez := TRUE   , ;
                  PorcentInd( oDbfPresup, aoMeter[ 2 ] ) )  ;
               OF   oDbfPresup

            /* Indice: CPPresuU = Clientes Presupuestos
                                 Codigo del Cliente
                                 y Número de Presupuesto
                                 SIN REPETIR.     */

               INDEX FILE CPPresuU ;
               TAG  PresupuU ;
               ON   codigo + numpresupu UNIQUE ;
               EVAL ( lPrimerVez := TRUE, ;
                   PorcentInd( oDbfPresup, aoMeter[ 3 ] ) )  ;
               OF   oDbfPresup
             END DATABASE oDbfPresup

     ACTIVATE DATABASE oDbfPresup // NORECYCLE

     oDbfPresup:Close()

RETURN NIL

//-----------------------------------------------------------//

*- Función: PorcentInd.

STATIC FUNCTION PorcentInd( oDbf, oMeter, anVal, acMensajes, aoSay )

   *- Variables: Locales.

      LOCAL nRegistro := 0

   IF lPrimerVez
      lPrimerVez    := FALSE

      oMeter:nTotal := oDbf:LastRec()

      IF VALTYPE( acMensajes ) = "A"
         IF LEN( acMensajes ) = 4
            ASIZE( acMensajes, 5 )

            acMensajes[ 5 ] := ""
         ENDIF

         AEVAL( anVal, { | elemento, n | anVal[ n ] := 0 } )
         AEVAL( aoSay, { | elemento, n |                                                 ;
                       aoSay[ n ]:SetText( OemToAnsi( acMensajes[ n ] ) )    , ;
                       aoSay[ n ]:Refresh()                               } )
      ENDIF
   ENDIF

   nRegistro := oDbf:RecNo()
   oMeter:Set( nRegistro )
   SysRefresh()

   SI nRegistro = oMeter:nTotal ENTONCES lPrimerVez := TRUE
RETURN TRUE


¿Por que?. ¿Le ha ocurrido alguien lo mismo?

Saludos, José M
Last edited by JMFS-D on Thu Feb 23, 2006 9:41 pm, edited 30 times in total.
JMFS-D
 
Posts: 40
Joined: Thu Jan 12, 2006 5:10 pm

No entendi?

Postby leandro » Thu Feb 23, 2006 7:21 pm

Amigo, la verdad no entendi, lo que quieres si mandas algun pedazo de codigo?
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Postby Antonio Linares » Fri Feb 24, 2006 2:15 pm

Jose Mª,

>
Lo extraño es que si, le pongo un MsgInfo( "Pausa, antes de salir..." ). Antes del RETURN, este no se muestra, y entonces si funciona:
>

Llama a SysRefresh() en vez de a MsgInfo()
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42107
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Gracias Antonio.

Postby JMFS-D » Sun Feb 26, 2006 8:14 pm

Lo acabo de probar, efectivamente, de momento funciona.

¡Gracias!, de nuevo. José Mª
JMFS-D
 
Posts: 40
Joined: Thu Jan 12, 2006 5:10 pm


Return to FiveWin para CA-Clipper

Who is online

Users browsing this forum: No registered users and 15 guests