Colección de Trucos
Colección de trucos recopilados por J.O. Oconnory otras fuentes
© Copyrights 1996 by FoxPress, All rights reserved
FoxPress, Mayo 1996( www.datapress.com)
P./ Tengo una aplicación que tiene
varias ordenes SET en el programa de inicio. Cuando creo un formulario , observo
que el valor de estas ordenes se cambia al valor por defecto en lugar de usar la
opción que les he indicado en mi programa de inicio.
R./ Tu Formulario
tiene una "Sesión Privada de Datos". Cuando tienes una Sesión Privada de Datos ,
debes re-establecer tus SET de entorno. La forma más fácil de hacer eso es crear
una clase que establezca tu entorno y las revierta a sus valores originales en
el evento de destroy. A continuación se puede instanciar la clase recientemente
creada en el evento Load de la clase base tipo formulario.
P./ El asistente de documentación usa caracteres Gráficos
tipo DOS cuando crea archivos que contienen diagramas. No puedo verlo o
imprimirlo correctamente desde cualquier programa Windows. Tengo que volver a
DOS para ver estos archivos correstamente.
R./ Abre
los archivos en un procesador de Windows y cambia el fuente de todo el documento
a "MS Line Draw" que convertirá estos caracteres ASCII a línea.
P./ Tengo un Formulario con tres pages de un pageframe. El
problema es que cuando selecciono un registro en la primera página y pulso la
tecla del tabulador para la segunda página, veo todos los campos pero de mi
primer registro.
R./ Esto es un problema del
Refresh(). En concreto, lo que necesitas es tener código en el Activate() de
cada una de las pestañas para asegurar que lo que se va a mostrar va a ser lo
correcto. Si has hecho algún Thisform.Refresh() en algún punto de tu Grid, VFP
solo refresca la página Activa del PageFrame. Esto es bueno desde el punto de
vista de la optimización. Sin embargo en el Activate() de cada página escribe
esto:
THIS.Refresh()
Otra forma de hacer lo mismo evitando añadir código a cada
página del pageframe es añadir una propiedad al pageframe y algo de código a los
métodos Init() y click() del pageframe. Añade una propiedad al pageframe llamada
nCurrentPage. Inicializala a = y en el método Click() añade el siguiente
código:
LOCAL nPage, lOldLockScreen
lOldLockScreen = ThisForm.LockScreen
ThisForm.LockScreen = .T.
WITH This
nPage = .Pages[.ActivePage].PageOrder
IF nPage <> .nCurrentPage
.nCurrentPage = nPage
.Pages[nPage].Refresh()
ENDIF
ENDWITH
ThisForm.LockScreen = lOldLockScreen
En el método Init() del pageframe, añade el siguiente
código:
This.nCurrentPage =
This.Pages(This.ActivePage).PageOrder
P/ Cómo puedo pasar un Array a un Formulario como un
parámetro?
R/ Los Arrays deben ser pasados en FoxPro
por referencia. SET UDFPARMS determina cómo se pasan los parametros. Por
defecto, cuando llamas a un procedimiento o a un Formulario usando DO...WITH,
los parámetros se pasan por referencia:
DIMENSION miarray[2]
DO FORM miForm WITH miarray
También por defecto, los parámetros se pasan por valor con
llamadas a funciones, incluyendo funciones definidas por el usuario y métodos.
en este caso, para forzar el pasar un parámetro por referencia, precédelo con un
ampersand (@):
DIMENSION miarray[2]
miForm = CREATEOBJECT("Miform", @miarray)
P./¿Hay alguna forma de quitar totalmente el título de un
formulario?
R./Haz lo siguiente:
1.- Pon la
propiedad Caption a " "(vacía)
2.- Pon la propiedad ControlBox a .F.
3.- Pon la propiedad MaxButton a .F.
4.- Pon la propiedad MinButton a .F.
5.- Pon la propiedad Movible a .F.
P./ Me gustaría añadir un botón de "Llamar" a mi Grid de VFP
con nombres y números de teléfono y que después de pulsar el botón, mi modem
debería llamar al número marcado.
R./ Si trabajas con
NT o Win95 puedes usar la .OCX MSCOMM32.OCX que viene con VFP. MSCOMM32.OCX sólo
se instala si estás corriendo el Fox sobre Win95 o NT. En caso contrario puedes
usar esta rutina que acude al API de Windows. Trabaja bien bajo 3.1 y es muy
estabole en Win95 o NT. Necesitarás proveer los parámetros adecuados a la hora
de empezar con THISFORM.
* write data to the serial port.
SET LIBRARY TO 'FOXTOOLS.FLL'
* Assumes that the number to dial is stored in ThisForm.CallNumber
M.Output = "ATDT" + ThisForm.CallNumber + '^M' + CHR(13)
LOCAL lccomport, lcdstring, lnport,
lccomport = LEFT(THISFORM.ComPort,4)
lcdstring = m.output
OPENCOMM = REGFN("OPENCOMM","CII","I",'USER.EXE')
WRITECOMM = REGFN('WRITECOMM','ICI','I','USER.EXE')
CLOSECOMM = REGFN('CLOSECOMM','I','I','USER.EXE')
LNPORT = CALLFN(OPENCOMM,LCCOMPORT,100,100) && open comm port
x = SECONDS()
DO WHILE SECONDS() - X < 1
ENDDO
=CALLFN(WRITECOMM,LNPORT,LCDSTRING,LEN(LCDSTRING)) && send string
to modem
mTime = SECONDS()
DO While INKEY("HM") = 0 AND SECONDS() - mTime < 15 && wait for KeyPress or timeout
ENDDO
M.Output = 'ATH0^M' + CHR(13)
&& hang up modem
=CALLFN(WRITECOMM,LNPORT,LCDSTRING,LEN(LCDSTRING))
=CALLFN(CLOSECOMM,LNPORT)
x = SECONDS()
DO WHILE SECONDS() - X < 2
ENDDO
RELEASE LIBRARY 'FOXTOOLS'
P./ ¿Hay alguna forma de imprimir las páginas 10 y 11 de un
Report especificando sólo 10-11?
R./ Usa la clausula
PROMPT de la orden REPORT FORM para mostrar el diálogo de impresión. Aquí se
puede señalar el rango de páginas para ser impresos
P./ De qué forma puedo usar la tecla ESC para salir de un
Formulario?
R./ La mejor forma es poner la propieda
Cancel del botón de comandos a .T.. Esto sería la forma más correcta de trabajar
en perfecta consonancia con el diseño de Interfaces de windows. En el evento
Click() de el botón de comandos escribe:
Thisform.Release()
También se podría usar el evento KeyPress del formulario
con:
PROCEDURE KeyPress
LPARAMETERS nKeyCode, nShiftAltCtrl
IF nKeyCode = 27
RELEASE THISFORM
ENDIF
ENDPROC
P./ ¿Cómo puedo crear un report que usa un array como origen
de datos?
R./Las tablas son el origen de datos para
los reports, así que deberás hacer lo siguiente:
CREATE CURSOR TEMP ( list of fields)
INSERT INTO DBF('temp') FROM ARRAY X
REPORT...
Tu report referenciará a los campos:
CREATE CURSOR TEMP (DUMMY C(1))
INSERT INTO DBF('TEMP') FROM ARRAY X
SELECT TEMP
REPORT...
P./ ¿Cómo puedo hacer una referencia a un formulario que
pertenece a un conjunto de Formularios (FormSet)? He tratado de usar _Screen
pero parece que sólo hace referencias al formulario
actual.
R./ Se puede usar el _SCREEN, pero sólo
puedes usar una propiedad llamada Forms que se encuentre en un Array conteniendo
una referencia a los objetos formularios. Una forma simple de hacer esto es
correr un bucle através de un array de formularios buscando por un formulario
que cumpla ciertos criterios y a continuación decirle que haga lo que quieres.
Digamos que si quieres refrescar cada formularios de la clase "myClass"·
deberías hacer esto:
FOR I = 1 TO _SCREEN.FormCount
IF TYPE("_SCREEN.Forms[I]") = "O" ;
AND !ISNULL(_SCREEN.Forms[I]) ;
AND _SCREEN.Forms[I].Class = 'myclass'
_SCREEN.Forms[I].Refresh()
ENDIF
ENDFOR
La única forma que conozco de referenciar formsets desde _SCREEN
es comprobar la existencia de un objeto parent para el formulario.
IF TYPE("_SCREEN.Forms[I].Parent") = "O"
IF TYPE("_SCREEN.Forms[I].Parent.MyForm") = "O"
_SCREEN.Forms[I].Parent.MyForm.Refresh()
ENDIF
ENDIF
P./ ¿Cómo puedo evitar que un formulario se instancie desde
dentro del Formulario?
R./Se puede evitar la
instanciación de un Formulario devolviendo RETURN .F. en el método INIT(). Esto
funciona con todos los objetos
P./ Cómo puedo evitar que un usuario se salga de un caja de
texto?
R./Hay varias formas. Puedes devolver .F. o 0
desde el evento Valid. O se puede usar el comando NONDEFAULT en el evento del
LostFocus(). si quieres forzar a tus usuarios, puedes añadir la siguientes
líneas al evento KEYPRESS()
LPARAMETERS nKeyCode, nShiftAltCtrl
IF nKeyCode = 13 && Trap the Return Key
NODEFAULT
ENDIF
P./ Hay alguna forma de obetener un checkbox desactivado pero
con el look normal? Siempre aparece de color gris y es ignorado el color de
background.
R./ En lugar de desactivar el checkbox,
añade un RETURN .F. al evento When()
P./ En Win95 existen iconos de 32 * 32 y de 16 * 16 sin
embargo la utilidad que viene con el VFP no permite tratar esto iconos
reducidos. Este es un tema importante pues no quiero que el logotipo del zorro
aparezca por todas partes en mi aplicación.
R./ Lo
único que tienes que hacer es modificar el fichero ImagEdit.INI en el directorio
de Windows añadiendo las siguientes líneas:
[ImagEdit.Icon]
Win95=16,16,16
Cuando se carga el ImagEdit y se añade un icono, se pulsa en el
Edit ...nueva imagen y seleccionar Win95 16 * 16 como el tipo de
recurso.
P./ Cómo devolver un valor desde un formulario?
R./Hay varios pasos a realizar a la hora de devolver
un valor desde un Formulario. En primer lugar el Formulario debe estar como
Modal. Para devolver el valor, abre el evento unload del Formulario. Por
ejemplo, si el valor está siendo guardado en una propiedad del formulario
llamada cMiValor, sitúa el "RETURN Thisform.cMivalor" en el UNLOAD evento del
Formulario.
P./ ¿Cómo puedo evitar el mensaje de "Inválida entrada de
datos" cuando devuelvo .F. desde un evento Valid?
R./En orden a prevenir que VFP nos muestre esa ventana de error, tienes que
devolver 0 en lugar de .F. Cuando se devuelve un número desde el evento Valid,
le estás diciendo a FoxPro cuantos controles en el Tab order quieres que se
adelante. Si devuelves un valor negativo, se movera hacia atrás en el Tab
Order.
P./ Se ejecutan los desencadenantes (Trigger) si uso un SQL
INSERT desde un array de dos dimensiones?
R./Los
desencadenantes se ejecutan siempre que se añade un nuevo registro, incluso
cuando se usa RECALL.
P./ ¿Cómo puedo suspender la ejecución de un programa cuando
esté activo un Formulario?
R./ En la ventana de
depuración escribe:
PROGRAM() Y sitúa un punto de ruptura en esa función.
2.- En la ventana de Comandos escribe:
_SCREEN.ActiveForm. Name= "MI Form"
3.- Abre la ventana de seguimiento, escoje Ejecutar y selecciona
tu .SCX
P./ Cuales son las mejores direcciones de Internet sobre
FoxPro.
R./ Aquí van unas cuantas:
Sin duda la primera y principal es la página Web de Microsoft en
(HTTP://MICROSOFT.COM).
Un lugar más especializado también dentro del mismo Microsoft es :
HTTP://MICROSOFT.COM/DEVONLY
que contiene una gran cantidad de información acerca de Visual
FoxPro. El único problema es que nos puede preguntar tus dudas pues son
cerradas. Por suerte existe un grupo de news USENET "COMP.DATABASE.XBASE.FOX". Otras buenas
direcciones las puedes encontrar en:
Marcus Egger's (MS MVP) Home Page:
http://ourworld.compuserve.com/homepages/MarkusEgger
FoxPro Yellow Pages:
http://www.transformation.com/foxpro/index.html
El FoxPro Yellow Pages guarda una completa información sobre
Grupos de Usuarios y otros eventos de relieve.
The Fox Page:
http://www.state.sd.us/people/colink/fox_page.htm
FoxWeb
http://totw.com/fox.htm
BMC FoxPage:
http://turnpike.net/emporium/B/bmc/foxpage.htm
Electric FoxPro
http://discover-net.net/%7Edhenton/ghtml/efox.html
WebLink for Visual FoxPro (Link VFP to the WWW)
http://ciint1.ciinc.com/weblink/vfpdemo.htm
FoxPro I/O Address:
http://www.hop.man.ac.uk/staff/mpitcher/foxpro.html
Montreal FoxPro User's Group
http://www.transformation.com/mfug/mfug2.html
Chicago FoxPro Users/Developer's Group
http://www.imginfo.com/fudg.htm
P./ ¿Cómo crear Captions Verticales ?
R./ Los Caption de los Label son normalmente horizontales. Para hacer que
un Label sea vertical, bastaría con escribir un salto de carro, CHR(13) entre
cada uno de los caracteres del Label. Por ejemplo, para mostrar verticalmente la
palabra "Test" se usaría este código:
Label.Caption = "T" + CHR(13)+
"E"+CHR(13)+ "S" + CHR(13)+ "T"+CHR(13)