Funciones en power builder

Me pregunto si puedes ayudarme con unos problemitas que tengo. Resulta que estoy tratando de utilizar unas funciones de la librería Kernel32, pero tengo varios errores que no se en que consisten, creo que es problema de llamado o algo así, me tomo el atrevimiento de enviarte el código de lo que he avanzado para ver si puedes darme alguna sugerencia al respecto, te agradezco de antemano y espero una pronta respuesta. Gracias.
Protoripos de las funciones:
Locales:
Function ulong FindFirstFile (string lpFileName, ref WIN32_FIND_DATAA
lpFindFileData) LIBRARY "KERNEL32.DLL"
Function boolean FileTimeToSystemTime (ref FILETIME lpFileTime, ref SYSTEMTIME lpSystemTime)
LIBRARY "KERNEL32.DLL"
Function boolean FileTimeToLocalFileTime (ref FILETIME lpFileTime, ref FILETIME lpLocalFileTime)
LIBRARY "KERNEL32.DLL"
Externas:
FUNCTION uint FindWindowA (long classname, string windowname) LIBRARY "user32.dll"
Estructuras utilizadas:
global type filetime from structure
ulong dwlowdatetime
ulong dwhighdatetime
end type
global type systemtime from structure
long wyear
long wmonth
long wdayofweek
long wday
long whour
long wminute
long wsecond
long wmillisecond
end type
global type win32_find_dataa from structure
unsignedlong dwfileattributes
filetime ftcreationtime
filetime ftlastaccesstime
filetime ftlastwritetime
unsignedlong nfilesizehigh
unsignedlong nfilesizelow
unsignedlong dwreserved0
unsignedlong dwreserved1
character cfilename[260]
character calternatefilename[14]
end type
codigo:
WIN32_FIND_DATAA lfd_lpFindFileData, lfd_lpFindFileData_Local
systemtime lst_lpSystemTime
string ls_pathname
boolean prueba
datetime fversion
ls_pathname = "c:salida empeje1.exe"
prueba = FileExists (ls_pathname)
IF prueba THEN
FindFirstFile (ls_pathname, lfd_lpFindFileData)
FileTimeToLocalFileTime (lfd_lpFindFileData.ftlastwritetime, lfd_lpFindFileData_Local.ftlastwritetime)
if FileTimeToSystemTime (lfd_lpFindFileData_Local.ftlastwritetime, lst_lpSystemTime) then
fversion = (datetime (date (lst_lpSystemTime.wyear, lst_lpSystemTime.wmonth, lst_lpSystemTime.wday), &
time (lst_lpSystemTime.whour, lst_lpSystemTime.wmimute)) , "mm/dd/yyyy hh:ss")
end if
END IF
messagebox ("Fecha archivo", ls_pathname + " - " + string(fversion))

1 respuesta

Respuesta
1
El valor que pintas entre comillas significa que la variable contiene un valor NULL, por ejemplo un valor NULL en una variable tipo fecha es "01/01/1900"
Lo que sucede es que cuando comentas la función FindFirstFile, simplemente dejas que el messagebox(), pinte lo que tiene contenido, en este caso la variable tiene un NULL, y eso es lo que pinta.
Ahora con respecto a colocar la función en un objeto no visible, eso depende.
Power builder contiene 2 tipos de objetos, visibles e invisibles, o no visibles. Los primeros ya los conoces, sin embargo creo que la laguna que tienes se encuentra en como definir los objetos invisibles o no visibles.
Bien,
un objeto no visible, no es más que una clase, recuerda que en la programación orientada a objetos, todo esta basado en clases, ya sabes, estas a su vez, se componen de propiedades, métodos, eventos, etc., entre un objeto y otro
la diferencia estriba simplemente que uno se ve y el otro no
El manejo de clases u objetos no visuales desde mi punto de vista es recomendable, o mejor dicho muy recomendable.
La ventaja de utilizar este tipo de técnica, es que por ejemplo puedes utilizar una clase como parámetro o argumento, en una función o procedimiento
otra ventaja es que cuando necesitas utilizarla simplemente creas una instancia y simplemente la destruyes cuando dejas de utilizarla,
teóricamente esto debería dinamizar la memoria, versatilidad de tus aplicaciones, y hasta más liviana.
La generación de un objeto del tipo no visual es muy simple.
Primero creas el objeto haciendo click en la parte de nuevo, del menu principal, en la pantalla que aparezca, simplemente
eliges la pestaña de PBOBJECT, y entre los iconos vistos, encuentras uno que pone CUSTOM CLASS, haces click sobre ella, y aparecerá una pantalla de edición similar a la
que utiliza power builder, para sus objetos en general. En esta pantalla de edición tienes todas las pestañas necesarias, funciones, eventos, variables, etc.
El comportamiento de creación de funciones y eventos es totalmente el mismo en cualquier caso.
Por ejemplo.
Digamos que ya tienes creada una clase u objeto no visual, y en el vas a crear una función que lleve el nombre de pinta_fecha()
La cual tiene el alcance de PUBLICA.
Dentro de esta función, simplemente escribes.
MESSAGEBOX('FECHA', STRING(TODAY()))
Ahora grabas la clase, con el nombre que quieras, mi recomendación es que siempre utilices, UO_ por delante,
esto significa USER OBJECT, o objeto de usuario, (recomiendo programar con la técnica de puntuación húngara)
Y ya tienes tu primer clase u objeto no visual,
la pregunta sera "bueno y ahora que hago con esto"
La respuesta:
En una pantalla cualquiera, coloca un botón. Dentro del evento click de dicho botón escribes:
UO_MI_CLASE luo_mi_clase
luo_mi_clase = CREATE UO_MI_CLASE
luo_mi_clase.pinta_fecha()
DESTROY luo_mi_clase
El efecto sera que cuando pulses el botón, aparecerá la fecha del sistema.
El script propuesto para tu botón hace lo siguiente.
primero: determina una instancia de la clase UO_MI_CLASE en la variable luo_mi_clase
segundo: crea la instancia luo_mi_clase con todas las caracteristicas de UO_MI_CLASE
tercero: ejecuta la funcion PINTA_FECHA() que se encuentra en la clase instanciada.
Ultimo: destruye la instancia y libera la memoria.
En el ejemplo solo incluí una simple función, como ejemplo, recuerda que en un objeto las funciones
pueden tener alcances como puclicas, privadas o protegidas, estas ultimas dos no pueden ser referenciadas
por una instancia, sino que son funciones propias de la clase que solo puede ser utilizadas por ella.
Como te dije al principio, yo me inclino mucho por esta técnica, porque de esta forma puedo tener
mis clases ordenadas, y puedo centralizar mis procesos.
Ademas que prefiero utilizar una clase del tipo publico que un conjunto de funciones igualmente publicas
que seguramente me van a ocupar más espacio en memoria que una simple clase.
Ademas si es una clase la puedo heredar, y añadir nuevas cosas
Primero que todo gracias por responderme, tu respuesta en de gran ayuda.
Te cuento: la asignación a la variable ls_pathname esta correcta, no se porque razón las diagonales no quedaron visibles en el código que te envíe.
Por otra parte te cuento que el error que encuentro cada vez que corro el programa es en la función FindFirstFile, el messegebox muestra que hay un error al llamar la función, así que decidí comentariar ésta y visualizar la asignación que queda cargada en fversion y es "1/1/1900 00:00:00". Ahora bien, no se exactamente desde donde debo hacer el llamado de esta función, pues encontré que debía ser desde un objeto no visible, pero no se que hacer estoy confundida, ¿Si el llamado de hace desde el objeto no visible Desde donde y como llamo a este?.
No se que pienses de todo esto, si crees que puedes ayudarme te lo agradecería mucho.
En tu código veo algunas cosas que no me convencen.
1- ls_pathname = "c:salida empeje1.exe"
La asignación de esta variable es un poco confusa primero porque la unidad no tiene la diagonal para indicar la separación del archivo y la unidad, segundo existe un espacio en blanco entre salida y empeje1.exe
2- La función TIME() en power builder no utiliza números para convertir una hora sino que un valor tipo string, por ejemplo "00:00:00"
3- Estas utilizando en la ultima linea un formato de fecha-tiempo "mm/dd/yyyy hh:ss")
donde no aparecen los minutos.
4- Fversion es una variable del tipo datetime, en la conversión, no encuentro que tiene que ver el formato "mm/dd/yyyy hh:ss" pues la función DATETIME() no utiliza un formato, en todo caso la función STRING() sin embargo esta asigna un valor string y no un tipo datetime.
Mi recomendación es que verifiques y correjas para empezar estos errores,
y luego vuelvas a probar
Creo que los errores que estas teniendo no son de ejecución sino que se sintaxis en el momento de la compilación.
Discúlpame al ser tan insistente, muchas gracias por tu ayuda.
Ok, la aclaración anterior fue de gran ayuda y así muchas dudas se aclararon, pero no se que pasa con la función FindFirstFile, no se si es que estoy bloqueada o que pero desde un principio he tenido tantos problemas con esta que ya no se que hacer.
Cambie la sintaxis y los llamados de la función como me indicas, pero tengo un error justo en la función antes mencionada, me dice que existe una referencia nula a esta. La funcion recibe un string y una estructura y devuelve un ulong, pero no se el funcionamiento realmente como sea, el prototipo esta definido : Function ulong FindFirstFile(string lpFileName, ref WIN32_FIND_DATAA lpFindFileData) LIBRARY "KERNEL32.DLL" Alias for "FindFirstFileA". En el momento de ser llamada el string posee una asignación, pero la estructura esta vacía, ¿esta debe llenarse al llamar la función o debería estas asignada desde antes?, total no se como funciona, ¿podrías guiarme?
Gracias por leer este mensaje, espero puedas ayudarme, saludos.
La duda del funcionamiento del procedimiento api, es algo que a todos nos interroga, realmente no tengo ni idea como funciona, con respecto a que la estructura, esta debería de recibir a la vuelta, los valores que interiormente en la función son integrados, puede que exista un problema con la compatibilidad de los datos entre lo que la función intenta escribir, y lo que la estructura puede contener.
Como tu dices, seguro que esto te esta provocando consumo masivo de aspirinas, (lastimosamente esto es el pago que tenemos que hacer por utilizar funciones cerradas o de terceros, en la cual no tenemos información de funcionamiento).
Mi recomendaciones es aunque pueda sonar simple o llana, buscate un manual de APIS de windows, y busca el comportamiento de esta función, verifica la estructura de referencia, y lo más importante, prueba tu aplicación en una version anterior a la que estas utilizando, puede que sea la compatibilidad, es posible que lo que estas haciendo si funcione en windows 98 o 95 por ejemplo, y que posiblemente no lo haga en versiones superiores. Recuerda que esto suele suceder por cuestiones de cambio de version, si esto es el problemita, ya casi tienes ubicada la forma de solucionarla, por ejemplo se me ocurre que puedas copiar la librería kernel.dll, en un directorio alterno a tu aplicación, fuera del alcance de windows, para no tener conflictos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas