Crear tipo de datos definido por usuario

spin
21 de Octubre del 2005
Hola a todos.

Estamos desarrollando un proyecto en el que comunicamos con una OCX, algunos metodos de esta OCX usan como parametros variables de tipo definidos por el usuario (la OCX esta desarrollada en VB), es decir no son tipos definidos en VFpro
(character,integer,...).
Lo que me gustaria saber es si en VFpro hay alguna forma de definir estos tipos al igual que se definen en otros muchos leguajes, es decir si hay algo parecido a lo que se hace por ejemplo en VB:

public type tprueba
index as integer
estado as integer
fecha as date
modelo as string
unarray() as otrotipo
end type

Este tipo "tprueba" por ejemplo seria el parametro que hay que pasar a la OCX.

gabrield
21 de Octubre del 2005
Estimado Spin:
VFP no permite la utilización de tipos definidos por el usuario.
De todos modos es posible llamar a funciones externas que admitan parámetros estructurales, pero es un poco
complicado.
Esto está en la ayuda de VFP 8

------------------------------------------------------------------------------------------
Archivo: ...SamplesSolutionWinapiSystime.scx

Este ejemplo muestra la llamada a la función de la API de Windows GetSystemTime. GetSystemTime rellena una estructura de tipo WORD (un entero de 16 bits sin signo) con información de la hora del sistema.

Declaración de la función C y definición de la estructura
VOID GetSystemTime(
LPSYSTEMTIME lpSystemTime // dirección de la estructura del tiempo del sistema
);
Esta es la definición de la estructura:

typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME;
Llamar a funciones en Visual FoxPro
EL código de Visual FoxPro pasa una referencia de GetSystemTime a una variable de tipo carácter, que se rellena con los valores de tipo WORD.

* Visual FoxPro Code: cmdSystemTime.Click
DECLARE INTEGER GetSystemTime IN win32api STRING @
cBuff=SPACE(40)
GetSystemTime(@cBuff)
Para obtener la información de la variable de tipo carácter cBuff, el siguiente código convierte caracteres ASCII de 8 bits del año y mes en variables equivalentes de 16 bits.

THIS.Parent.lblYear.Caption = ALLTRIM(STR(ASC(SUBSTR(cBuff,2)) * 256 + ASC(SUBSTR(cBuff,1))))
THIS.Parent.lblMonth.Caption = MONTH_LOC + ALLTRIM(STR(ASC(SUBSTR(cBuff,4)) * 256 + ASC(SUBSTR(cBuff,3))))
------------------------------------------------------------------------------------------

Las dos últimas líneas te muestran cómo preparar una cadena de caracteres que sea equivalente a la estructura que necesitas. En realidad, debes pasa el parámetro como una posición de memoria (la variable de cadena) constituída como la estructura, pero a bajo nivel.

Para más información, en la ayuda de VFP 8, en la solapa "Búsqueda" escribe

Utilizar funciones de la API que requieren punteros a matrices (Ejemplo)

y te traerá dos temas que te podrán dar una pista.

Saludos cordiales.
Gabriel Dameñov
www.gdmsargentina.com.ar