Ayuda en programa

colthop
Posts: 505
Joined: Sat Apr 22, 2006 9:09 am
Location: Madrid - España

Ayuda en programa

Post by colthop »

Hola a todos:

Hoy os pido, ayuda sobre todo a los master, por un motivo no relacionado con FiveWin sino con C++:

Estoy haciendo un programa en el cual quiero hacer una cosa que en FiveWin lo hace muy sencillo y en C++ no se como se hace y si es posible hacerlo.

Me explico:

Yo con FiveWin hago

a = "función()"
&a

y lo que resulta es que ejecuta "función()". Esto no se como se hace y si es posible hacerlo en C++, es una cosa parecida a lo que hace el GET cuando ponemos la clausula VALID con una función, que ejecuta esa función.

Un saludo y gracias.

Carlos
Colt Hop ED, S.L.
Carlos Blas Fernández Domínguez
Tlfo: 645847093
E-Mail: carlos@colthop.es

Nunca se termina de aprender, por eso necesito siempre ayuda.
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: Ayuda en programa

Post by Carlos Mora »

Hola Carlos,

hasta donde sé, eso no es posible. C++ es un lenguaje compilado, puro, donde los simbolos y variable se reemplazan por su dirección en tiempo de compilación.
De la misma forma que no existen PUBLICs ni PRIVATEs, me temo que eso no sería viable.
Desconozco que problema quieres resolver con una macro, tal vez puedas usar metodos virtuales si estas haciendo POO.

Un saludo
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Ayuda en programa

Post by Antonio Linares »

El nombre de una función en C es su puntero. Es decir si tenemos la función Test(), Test es la dirección de Test()
y por lo tanto se puede "saltar" a ella y ejecutarla, dada su puntero.

En realidad la diferencia entre C++ y C, es un array "invisible" (lpVtbl) que C++ construye de punteros a funciones
(que se convierten en métodos al recibir automaticamente Self como primer parámetro).

Clipper 5 heredó mucho esta filosofía de C++, y en los RDDs, en los GT, etc. usó esta técnica de arrays de punteros
a funciones. Es la forma en que se puede simular el C++ usando solo C. Harbour lo usa igualmente.
regards, saludos

Antonio Linares
www.fivetechsoft.com
colthop
Posts: 505
Joined: Sat Apr 22, 2006 9:09 am
Location: Madrid - España

Re: Ayuda en programa

Post by colthop »

Hola a todos:

Gracias por vuestras respuestas.

Antonio no se si me estas diciendo que se puede o que no se puede.

Si Harbour y Clipper se realizaron C tendrán una manera de realizar la operativa y si es así podrías orientarme con algún ejemplo.

Un saludo

Carlos
Colt Hop ED, S.L.
Carlos Blas Fernández Domínguez
Tlfo: 645847093
E-Mail: carlos@colthop.es

Nunca se termina de aprender, por eso necesito siempre ayuda.
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Ayuda en programa

Post by Antonio Linares »

Carlos,

Claro que se puede. Aqui tienes un ejemplo:

Code: Select all

#include "FiveWin.ch"

function Main()

   Test()

return nil

#pragma BEGINDUMP

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

static void Test( void )
{
   MessageBox( 0, "dentro de Test()", "ok", 0 );
}

typedef void ( * PFUNC ) ( void );

HB_FUNC( TEST )
{
   PFUNC pFunction = Test;

   pFunction();
}

#pragma ENDDUMP  
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
carlos vargas
Posts: 1421
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Ayuda en programa

Post by carlos vargas »

Son babosadas, el que sabe, sabe.
:-)
estas son las explicaciones que vale siempre tener a mano, a guardar post.

gracias antonio.

salu2
carlos vargas
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
sysctrl2
Posts: 833
Joined: Mon Feb 05, 2007 7:15 pm
Contact:

Re: Ayuda en programa

Post by sysctrl2 »

Maestro !
Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
colthop
Posts: 505
Joined: Sat Apr 22, 2006 9:09 am
Location: Madrid - España

Re: Ayuda en programa

Post by colthop »

Hola Antonio:

Ante todo disculpa por la tardanza pero la semana pasada no pude hacer nada sobre este tema:

Y gracias por tu respuesta el que sabe, sabe.

Solo dos preguntas:

1.- En tu ejemplo en el Main() pones solo Test(), como yo expuse era que una variable valiese "Test()" y después siempre pongo & y la variable, para ejecutar esa variable por lo que si modifico tu código a:

Code: Select all

#include "FiveWin.ch"

function Main()

   cVar = "Test()"
   &cVar

return nil

#pragma BEGINDUMP

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

static void Test( void )
{
   MessageBox( 0, "dentro de Test()", "ok", 0 );
}

typedef void ( * PFUNC ) ( void );

HB_FUNC( TEST )
{
   PFUNC pFunction = Test;

   pFunction();
}

#pragma ENDDUMP
 
¿Esto funcionaría?. Pero lo utilizo para mas cosas como la declaración de variables o para quitar OBJETOS de pantalla. Por ejemplo:

Code: Select all

PROCEDURE QuiBotPan(zOpc,zOpc1)
zNum = zOpc
do While .T.
  do case
    case zNum > 9
      zVar = "xPul"  + str(zNum,2,0)
    otherwise
      zVar = "xPul0" + str(zNum,1,0)
  endcase
  &zVar:End()
  zNum = zNum + 1
  if zNum = zOpc1+1
    exit
  endif
enddo
RETURN (NIL)
Que lo que hace es quitar botones desde un numero a otro. Aquí también funcionaría.

2.- En tu ejemplo usas una función de harbour "HB_FUNC" para llamar a la otra y usas "hbapi.h" como expresé yo lo quiero hacer en C++, tendría que incluir esta .h para poder hacerlo o lo tendría que hacer de otra manera.

Un saludo y gracias de nuevo.

Carlos
Colt Hop ED, S.L.
Carlos Blas Fernández Domínguez
Tlfo: 645847093
E-Mail: carlos@colthop.es

Nunca se termina de aprender, por eso necesito siempre ayuda.
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Ayuda en programa

Post by Antonio Linares »

Carlos,

Necesito que me muestres un ejemplo en C++ de lo que estás haciendo o de lo que quieres hacer
regards, saludos

Antonio Linares
www.fivetechsoft.com
colthop
Posts: 505
Joined: Sat Apr 22, 2006 9:09 am
Location: Madrid - España

Re: Ayuda en programa

Post by colthop »

Hola Antonio:

El ejemplo puede ser lo mismo que te expuse en el otro post pero en C++, algo asi:

Code: Select all

....
void  QuiBotPan(int, int)
....

Main()
....
QuiBotPan(2, 6)
....


void  QuiBotPan(int zOpc, int zOpc1)
{
char* zVar;
zNum = zOpc;
do  
{
  if (zNum > 9)
    {
      zVarC = "xPul";
      itoc(zNum,zNumC,2);
    }
  else
    {
      zVarC = "xPul0";
      itoc(zNum,zNumC,1);
    }
  strcpy(&zVar[ strlen(zVarC) ], zNumC); 
  CloseWindow(&zVar);
  zNum++
}
While zNum < zOpc1+1;
}
Imaginemos una Ventana Principal en donde tengamos otras 10 llamadas secuencialmente desde xPul01 a xPul10. Esta función debería cerrar las ventanas creadas desde xPul02 a xPul06, con la función "CloseWindow(&zVar)".

Que es básicamente lo que quiero que yo creo una variable ("zVar")con unos valores ("xPul02", "xPul03", "xPul04", "xPul05" y "xPul06") y después mediante una opción ("&" o lo que sea) el programa reemplace en la función lo que vale la variable ("CloseWindow(xPul02)", "CloseWindow(xPul03)", "CloseWindow(xPul04)", "CloseWindow(xPul05)", "CloseWindow(xPul06)").

Un saludo

Carlos
Colt Hop ED, S.L.
Carlos Blas Fernández Domínguez
Tlfo: 645847093
E-Mail: carlos@colthop.es

Nunca se termina de aprender, por eso necesito siempre ayuda.
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Ayuda en programa

Post by Antonio Linares »

Carlos,

Tendrias que mantener un array y recorrer el array cerrando las ventanas.

Por los nombres con comillas no puedes hacerlo. C++ no mantiene una tabla de símbolos como en Harbour.
regards, saludos

Antonio Linares
www.fivetechsoft.com
colthop
Posts: 505
Joined: Sat Apr 22, 2006 9:09 am
Location: Madrid - España

Re: Ayuda en programa

Post by colthop »

Hola Antonio:

Gracias por tu orientación, esto funcionaría con el primer caso crear un array con "test()" y luego poner:

array [1];

Ejecutaría "test()"

Un saludo

Y gracias.

Carlos
Colt Hop ED, S.L.
Carlos Blas Fernández Domínguez
Tlfo: 645847093
E-Mail: carlos@colthop.es

Nunca se termina de aprender, por eso necesito siempre ayuda.
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Ayuda en programa

Post by Antonio Linares »

Puedes declarar un array del tipo que quieras, por ejemplo "punteros a funciones" y luego
usar esos valores para lo que necesites.

Tienes algo ya funcionando que pueda probar aqui ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
colthop
Posts: 505
Joined: Sat Apr 22, 2006 9:09 am
Location: Madrid - España

Re: Ayuda en programa

Post by colthop »

Hola Antonio:

Todavía no estoy buscando todo lo que necesito y no tengo nada enlazado.

Pero ya me has orientado y si necesito mas ayuda te la pediré.

Gracias por todo.

Un saludo

Calros
Colt Hop ED, S.L.
Carlos Blas Fernández Domínguez
Tlfo: 645847093
E-Mail: carlos@colthop.es

Nunca se termina de aprender, por eso necesito siempre ayuda.
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Ayuda en programa

Post by Antonio Linares »

Carlos,

En el 2012 y por probar, comencé a escribir una librería en C++ a la que llamé FiveCpp
que simulaba un poco el comportamiento de FWH pero desarrollada en C++.

Tal vez pueda interesarte. Aun no se con certeza lo que necesitas :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
Post Reply