Compartir a través de


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( )