Cómo usar .NET en tu aplicacion

1.- Crear la DLL y dejala en la carpeta /Exe Te recomiendo que uses .NET 2.0 que está en todas las máquinas Win 7 y superiores.

2.- Pulsa con el boton derecho en .NET Assemblies y añadela.

3.- Añadela a la lista

El resto ya es usar las funciones que tengas creadas con:

NombredelaLibreria.funcion()

La función SUM

Hoy le toca a la función SUM… que es distinta de la función SUM de Fox. En WD se usa para sumar valores numéricos de un array o elementos de una estructura. Mas info en http://doc.windev.com/?1000019892

Ejemplo de sumar elementos de un array unidimensional:

arrDatos is array of 0 int
ArrayAddLine(arrDatos,10)
ArrayAddLine(arrDatos,5)
AddLine(arrDatos,20)
Info(Sum(arrDatos))

AddlLine es parecido a ArrayAddLine

Ejemplo de sumar elementos de un array bidimensional:

arrDatos is array of 0,2 int
ArrayAddLine(arrDatos,1, 10)
ArrayAddLine(arrDatos,2, 5)
AddLine(arrDatos,3, 20)
Info(Sum(arrDatos,2))

Ejemplo de sumar elementos de una estructura:

strPersona is Structure
 Nombre is string
 Edad is int 
END

arrDatos is array of 0 strPersona
arrDatos[1].Nombre = "uno"
arrDatos[1].Edad = 30
arrDatos[2].Nombre = "dos"
arrDatos[2].Edad = 20
arrDatos[3].Nombre = "tres"
arrDatos[3].Edad = 25
 //* Otra forma de rellenar el array de estructuras :-)
//* Asigna valores al array. Cada Línea se corresponde con los valores de la estructura
//arrDatos = [
// ["uno", 30],
// ["dos",20],
// ["tres", 25]
//]
 Info(Sum(arrDatos, "Edad"))

Accede a datos Fox sin romper los indices

WinDev tiene una serie de funciones xBase pero tienen la cualidad de que siempre que escribes te rompen los indices *.CDX de Fox.

Pero hay una alternativa que sí funciona: OLE DB

OLE DB es una tecnologia de 32 bits que funciona también en 64.

Lo primero que tienes que hacer es bajarte el driver OLE DB para Fox:

https://www.microsoft.com/en-us/download/details.aspx?id=14839

Una vez instalado prueba el siguiente código:

gctMiConexion is Connection

// Completa valores generales de la conexión
gctMiConexion..User = ""
gctMiConexion..Password = ""
gctMiConexion..Database = ""
gctMiConexion..Access = hOReadWrite 
gctMiConexion..Provider = "VFPOLEDB.1"
gctMiConexion..Server = "localhost"
gctMiConexion..Source = CompleteDir(fExeDir()) + "\dbfs\data1.dbc"
gctMiConexion..ExtendedInfo = "Window Handle=0;Locale Identifier=1033;Mode=3;Prompt=4;Extended Properties=;Mask Password=False;Cache Authentication=False;Encrypt Password=False;OLE DB Services=-1;Collating Sequence=SPANISH;DSN=;DELETED=True"

// Abre la conexión
IF NOT HOpenConnection( gctMiConexion ) THEN
	Info(HErrorInfo())
	Close()
END

Ejecuta código externo

WinDev permite ejecutar código WinDev externo que tengas por ejemplo en un archivo de texto.

Mira este sencillo juego.

Copia en un fichero de texto que podemos llamar prueba.txt el siguiente código:

InitRandom()
nRandomNumber is int
nRandomNumber = Random(0, 10)
 nNumero is int=0
 Input("Pon un número del 0 al 10..",nNumero)
IF nNumero = nRandomNumber THEN
 info("¡Enhorabuena!, has acertado el número que he pensado")
else
 InfoBuild("¡Has fallado!, mi número era el %1",nRandomNumber)
END

A continuacón en WinDev create un boton en una pantalla con el siguiente código:

lcCadena is string = fLoadText("D:\prueba.txt")

ExecuteCode(lcCadena)

Más info en http://doc.windev.com/?1000019783

Usar el API de Windows

Por ejemplo, para saber el nombre del PC usariamos:

ppBuffer is string ASCIIZ on 256
pBytesReturned is int = 128

API("kernel32.dll", "GetComputerNameA" , &ppBuffer,&pBytesReturned)

sResult is string = ppBuffer

Info(sResult)

Como se sabe System32 tiene tanto las funciones de 32 como las de 64 y así con el resto.
Una lista de referencia de funciones la puedes tomar de: http://doc.pcsoft.fr/fr-FR/?6510002&productversion=01F150038E

Añadir propiedades a una clase

En tiempo de ejecución no se le pueden añadir propiedades a una clase, pero puedes hacerlo con este pequeño truco

STProperty is Structure
         _value is Variant // the value
         _name is string // property ID
         _targetType is int // use wlConstants  por ejemplo wlEntier ( france )
END

Resize is a Class

PRIVATE
         _properties is dynamic array of 0 STProperty
END


PROCEDURE  addProp(newProp is STProperty)
       Add(_properties,newProp)

PROCEDURE getProp(pName is string)
       vReturn is Variant
     
       // Busca la propiedad en el array y devuelve el valor
        FOR EACH stAProperty OF _properties WHERE _name = pName
	      vReturn = stAProperty._value
	      BREAK
         END

         RESULT vReturn

PROCEDURE  deleteProp(pName is string):boolean

      // Busca la propiedad en el array y devuelve el valor
      FOR EACH stAProperty,nIndex of _properties WHERE _name = pName
	ArrayDelete(_properties,nIndex)
	BREAK	
      END

      RESULT True

Variables GLOBAL

Tenemos variales globales y variables locales

Las variables globales son por defecto las que se ponen al inicio del proyecto. Puedes usar GLOBAL

Si al inicio del proyecto usas variables locales es mejor que le pongas LOCAL

Las variables que se ponen en el inicio de un formulaio (MyWindows) son publicas solo para ese formulario. Estan visibles en todos los objetos pero no pasan a otros formulario que se invoquen desde éste ni tampoco a los informes que invoquen desde éste.