domingo, 1 de abril de 2012

Directorio Temporal de Windows

Dentro de los requerimientos funcionales de un aplicativo, a menudo se tienen que realizar procesos en una carpeta con permisos de escritura (este es el caso de la carpeta temporal de windows).

A continuación se presenta el codigo de  Daniel Barnes, que obtiene la ruta del directorio temporal de windows:

Obtener el directorio temporal de Windows
Autor: Daniel Barnes

Cuando se tienen que crear ficheros temporales o de almacenamiento, el directorio temporal de Windows es el sitio idóneo para colocarlos.

Declarar la siguiente función local externa:
 
FUNCTION ulong GetTempPathA (long nBufferLength, ref string lpBuffer ) LIBRARY "KERNEL32.DLL"

Ahora escribe la siguiente función en cualquier lugar de tu aplicación.

constant long lcl_maxpath = 260
string ls_tempdir
ulong lul_retval
// Windows requiere rellenar esta cadena
ls_tempdir = Fill('0', lcl_maxpath)
// Llamada a la función local externa
lul_retval = THIS.GetTempPatha(lcl_maxpath, ls_tempdir)
// Windows devuelve la longitud de la cadena. Si es mayor que cero es que ha encontrado el directorio temporal de Windows.
IF lul_retval > 0 THEN

    ref_dir = ls_tempdir

    RETURN SUCCESS

END IF
// Si no lo encuentra o falla la llamada a la función
ref_dir = ''
RETURN FAILURE

Centrar una Ventana - GetEnvironment

Getenvironment, permite en tiempo de ejecución obtener valores del sistema operativo (tales como el Alto y Ancho del monitor, etc),

Como ejemplo se muestra una funcion para centrar una ventana (útil si es de tipo response).

Long ll_screenWidth,ll_screenHeight
environment lenv_display

if GetEnvironment(lenv_display) = 1 then
ll_screenWidth = PixelsToUnits(lenv_display.screenwidth,XPixelsToUnits!)
ll_screenHeight = PixelsToUnits(lenv_display.screenheight,YPixelsToUnits!)
this.x = (ll_screenWidth - this.width) / 2
this.y = (ll_screenHeight - this.height) / 2
end if


Messagebox - Varias Lineas

En PB, se pueden mostrar mensajes de multimples lineas insertando un retorno de carro en una cadena:

Se tiene que insertar en la parte de la cadena donde quieres hacer el retorno de carro lo siguiente:
~n~r

Es útil para Messagebox con varias líneas.

Ejemplo:

Messagebox ("Error", "La base de datos ~n~r no se ha actualizado correctamente")

Utilizar el Registro de Windows

Algunas implementaciones de Sistemas requieren validar el separador decimal, éste parámetro se encuentra en una ruta del Registro de Windows.

Desde powerbuilder se puede Leer y escribir valores en el Registro, a continuación un ejemplo obteniendo el Valor del Separador decimal:

Determinar en ejecución si el separador es decimal o de miles.

string ls_decimal, ls_thousand
string ls_regKey = "HKEY_CURRENT_USER/Control Panel/International"
RegistryGet(ls_regKey, "sDecimal", ls_decimal)
RegistryGet(ls_regKey, "sThousand", ls_thousand)

Llamar a una funcion de la API de Windows

A veces es necesario utilizar funciones del Sistema Operativo, esto se implementa con una llamada a una funcion de una DLL del Sistema:

A continuación un ejemplo para obtener el nombre de la PC donde se ejecuta el Programa:

Obtener el nombre de usuario y de la PC.

Se necesita declarar dos funciones API externas:

FUNCTION long GetComputerNameA(ref string ComputerName, ref ulong BufferLength) LIBRARY "KERNEL32.DLL"
FUNCTION long GetUserNameA(ref string UserName, ref ulong BufferLength) LIBRARY "ADVAPI32.DLL"

Implementación de la Función:

long ll_ret
string ls_ComputerName, ls_UserName
ulong BufferLength = 250
ls_ComputerName = Space(BufferLength)
ls_UserName = Space(BufferLength)
ll_ret = GetComputerNameA(ls_ComputerName, BufferLength)
ll_ret = GetuserNameA(ls_UserName, BufferLength)