13 de febrero de 2019

Decodificar la marca de tiempo en bibliotecas de clases y formularios

Visual Foxpro coloca una marca de tiempo en muchos registros de la tabla que representa un formulario o una biblioteca de clases. Históricamente, este campo se usaba para hacer coincidir los registros en las plataformas compatibles: DOS, Mac, Unix, Windows.

La variable reservada de VFP "_Screen" es una referencia de objeto a la instancia de Form que representa el escritorio de VFP. Debido a que es una instancia de formulario, puede guardarlo como una clase utilizando el método SaveAsClass . Esto hará que se cree un registro de marca de tiempo que podamos usar para ejecutar el código de muestra. El código de muestra demora 3 segundos, crea una subclase del formulario, agrega un botón y luego muestra las marcas de tiempo de los elementos en la biblioteca de clases.

La marca de tiempo está en un formato estándar

ERASE T.vcx
_SCREEN.ADDOBJECT("btn","commandbutton")        && add a button to the desktop
_SCREEN.SAVEASCLASS("t.vcx","myform")           && create class myform in a target file t.vcx
INKEY(3)                                        && delay 3 seconds
MODIFY CLASS xx OF T.vcx AS myform FROM T.vcx NOWAIT  && create a subclass of myform in the same file
ASELOBJ(aArray,1)                               && get an object reference to the class in the designer
aArray[1].ADDOBJECT("btn2","commandbutton")     && and btn2 to the class
aArray[1].btn2.TOP=200                          && move it down so it doesn't hide btn
KEYBOARD "Y"                                    && a "y" in the "Do you want to save changes")
RELEASE WINDOWS "Class designer"                && close the designer
USE T.vcx                                       && open the table

SCAN FOR TIMESTAMP!=0                           && look for timestamps
  ?TIMESTAMP,DecodeTimeStamp(TIMESTAMP),objname+" "+CLASS
ENDSCAN

PROCEDURE DecodeTimeStamp(nTimestamp AS NUMBER) AS DATETIME
  *** See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/filetimetodosdatetime.asp
  nDate=BITRSHIFT(nTimestamp,16)
  nTime=BITAND(nTimestamp,2^16-1)

  nYear=BITAND(BITRSHIFT(nDate,9),2^8-1)+1980
  nMonth=BITAND(BITRSHIFT(nDate,5),2^4-1)
  nDay=BITAND(nDate,2^5-1)

  nHr=BITAND(BITRSHIFT(nTime,11),2^5-1)
  nMin=BITAND(BITRSHIFT(nTime,5),2^6-1)
  nSec=BITAND(nTime,2^5-1)

  RETURN DATETIME(nYear,nMonth,nDay,nHr,nMin,nSec)
ENDPROC 

Calvin Hsia

Artículo original: Decoding the timestamp in class libararies and forms