Acceso a variables y campos de Visual FoxPro
Puede tener acceso a los valores de variables o campos de Visual FoxPro en el control ActiveX o función FLL, para leerlos o establecerlos. Además, puede crear nuevas variables a las que se puede tener acceso desde Visual FoxPro.
Las variables y los campos están disponibles en Visual FoxPro en una tabla de nombres, que es una matriz que contiene los nombres de todas las variables y todos los campos definidos actualmente. Puede tener acceso a un elemento individual de la matriz mediante un índice de tabla de nombres (Name Table Index, NTI). Una función especial de la API, _NameTableIndex( ), devuelve el índice de una variable o un campo existente en función del nombre proporcionado. Después de haber determinado el NTI para una variable dada, puede leerla mediante la función _Load( ) de la API o establecerla mediante la función _Store( ) de la API. Para crear una variable nueva, puede llamar a la función _NewVar( ) de la API.
Para tener acceso a las variables o campos de Visual FoxPro, se usan las estructuras Value y Locator definidas en Pro_ext.h. Si está creando una biblioteca FLL, puede usar la misma técnica que ha usado para tener acceso a parámetros transferidos a sus funciones. Para obtener detalles acerca de las estructuras Value y Locator, vea Transmitir y recibir parámetros.
El ejemplo siguiente, extraído del programa Foxtlibctl.cpp que se encuentra en el directorio Api\Samples\Foxtlib de Visual FoxPro, ilustra cómo puede usar las estructuras Value y Locator de un control ActiveX para tener acceso a las variables de Visual FoxPro:
long CFoxtlibCtrl::TLGetTypeAttr(long pTypeInfo, LPCTSTR szArrName)
{
int nResult = 1;
TYPEATTR *lpTypeAttr;
Locator loc;
Value val;
OLECHAR szGuid[128];
char *szBuff;
__try {
if (_FindVar(_NameTableIndex(( char *)szArrName),-1,&loc)) {
((ITypeInfo *)pTypeInfo)->GetTypeAttr(&lpTypeAttr);
if (_ALen(loc.l_NTI, AL_ELEMENTS) < 16) {
_Error(631); //Array argument not of proper size.
}
//1 = Guid
StringFromGUID2(lpTypeAttr->guid, (LPOLESTR )&szGuid,sizeof(szGuid));
OLEOleToAnsiString(szGuid,&szBuff);
val.ev_type = 'C';
val.ev_length = strlen(szBuff);
val.ev_handle = _AllocHand(val.ev_length);
_HLock(val.ev_handle);
_MemMove((char *) _HandToPtr( val.ev_handle ), szBuff, val.ev_length);
OLEFreeString((void **)&szBuff);
_HUnLock(val.ev_handle);
loc.l_sub1 = 1;
_Store(&loc,&val);
_FreeHand(val.ev_handle);
//2 = LCID
loc.l_sub1 = 2;
val.ev_type = 'I';
val.ev_long = lpTypeAttr->lcid;
_Store(&loc,&val);
// code for values 3 - 16 here
((ITypeInfo *)pTypeInfo) -> ReleaseTypeAttr(lpTypeAttr);
}
} __except (EXCEPTION_EXECUTE_HANDLER) {
nResult = 0;
}
return nResult;
Vea también
Transferir parámetros a funciones de la API de Visual FoxPro | Administrar la memoria | Acceso a la API de Visual FoxPro | Ampliar Visual FoxPro con bibliotecas externas | Generar y depurar bibliotecas y controles ActiveX | _NameTableIndex( )