Free Web Hosting Provider - Web Hosting - E-commerce - High Speed Internet - Free Web Page
Search the Web

FoxCarlos : Trucos

FoxCarlos
Trucos [Previous Page] [Next Page] [Up] [Home Page] [Mail]

¿Cuando creo un formulario rápido, VFP asigna correctamente la anchura de los campos a los objetos TextBox, pero si después añado uno nuevo y no lo hago arrastrándolo de la tabla, tengo que poner la anchura "a ojo" y me paso mucho tiempo comprobando que lo que escriba el usuario no sobrepase esa anchura.?

Veamos dos soluciones para este problema tan común:

1) Utilizar la propiedad InputMask; consiste en poner una anchura fija por exceso y luego en la propiedad InputMask del TextBox incluir tantos valores como anchura tenga el campo relacionado con dicho objeto; con esta técnica cuando el usuario esté introduciendo datos en el objeto, al llegar al límite de la máscara (no al de la anchura de visualización), el foco saltará al siguiente objeto. Hay que tener en cuenta el tipo de letra utilizado para el objeto ya que si es proporcional (por ejemplo Arial) la anchura puede variar sustancialmente. Por ello, aunque la presencia es peor, se aconseja la letra no proporcional (por ejemplo FixedSys).

2) Utilizar la función TEXTWIDTH; podemos cambiar la anchura de un TextBox de manera interactiva en tiempo de ejecución. Podemos asignar a la propiedad WIDTH el resultado que nos devuelva TEXTWIDTH.

oText.Width=Thisform.TextWidth("WWWWWWWWWW")

Este código calculará la anchura necesaria para mostrar 10 caracteres. Es importante incluir el carácter "W" ya que es la letra más ancha, con lo que nos aseguramos que cualquier cadena que introduzca el usuario cabrá en el TextBox.

Utilizando esta técnica podemos emplear fuentes proporcionales, ahora bien, siempre existe el riesgo de que el resultado de un valor exceda la anchura del Form, por lo que tendremos que controlar esta circunstancia.

Al hilo de la anterior pregunta, llevo arrastrando un problema desde hace varias versiones y es el que me surge cuando mis aplicaciones son ejecutadas en pantallas con resolución distinta a la que yo utilicé al crearlas. ¿Puedo aumentar y disminuir el tamaño de los objetos y del tipo de letra para adecuarla a cada caso?

Lo primero que hay que hacer es comprobar la resolución de pantalla, para ello existe la función SYSMETRIC(1). El argumento 1, devuelve el ancho de la pantalla, esto es: 640, 800 ó 1024. Una vez sabido esto, que ya es mucho, podemos ejecutar un pequeño programa que redimensione nuestra pantalla. El código podría ser algo así:

IF SYSMETRIC(1)<>640 nAltura=SYSMETRIC(2)/480 nAnchura=SYSMETRIC(1)/640

* Cambio del tamaño y la posición de los objetos

* contenidos WITH This FOR i=1 TO .ControlCount .Controls(i).Width=.Controls(i).Width*nAnchura .Controls(i).Height=Controls(i).Height*nAltura .Controls(i).Left=.Controls(i).Left*nAnchura .Controls(i).Top=.Controls(i).Top*nAnchura ENDFOR

* Cambio del tamaño y la posición del formulario .Width=.Width*nAnchura .Height=.Height*nAltura .Left=.Left*nAnchura .Top=.Top*nAltura

* Cambio del tamaño de letra DO CASE CASE SYSMETRIC(1)=800 .SetAll("FontSize,12) CASE SUSMETRIC(1)=1024 .SetAll("FontSize,16) ENDCASE ENDWITH ENDIF

¿No me gusta nada la apariencia que tienen los campos desactivados. Más de un usuario me ha llamado diciendo que hay campos que no se ven bien y que los cambie.?

Este problema es bastante viejo y su solución también lo es. Lo mejor es incluir un RETURN .F. en el WHEN del objeto al que no queremos que el usuario acceda. Además de conseguir nuestro objetivo, la apariencia será exactamente la misma a la de un objeto activado con lo que habremos arreglado el problema.

¿Estoy haciendo una ventana que permita al usuario ordenar los registros según el campo que el desee y me encuentro con que no se de qué forma, sino es a mano, poner unas definiciones lo suficientemente explícitas como para que el usuario sepa de que campo se está hablando en cada caso, máxime cuando yo utilizo nombres bastante abreviados, tanto que a veces se me olvidan a mi los significados.?

Lo primero que te aconsejo es que abandones esa práctica tan extendida de poner nombres cuanto más breves mejor. Esta costumbre, heredada tal vez de lenguajes más antiguos que tenían limitaciones en este sentido, no hace falta seguirla en VFP, puesto que para las tablas dependientes de una BD es posible señalar nombres largos. Ahora bien, no deja de ser interesante no pasar de diez caracteres pensando en que la tabla pueda convertirse en libre y si esto sucede se truncarían los nombres que excedan este valor.

También es mejor denominar los campos los más descriptivamente posible, sin miedo a que se repitan en otras tablas, ya que este hecho en nada afecta al buen funcionamiento de nuestras aplicaciones. Nada de hacer de los nombres un verdadero galimatías. O documentas bien las tablas o pobre del que tenga que cogerlas pasado un tiempo.

Pero, si has seguido estas pautas y aún los nombres que se muestran al usuario no son suficientemente explícitos hay que acudir a la propiedad Encabezado que existe para cada campo en la definición de la tabla. Aunque en apariencia no sirva para nada (no hay ningún automatismo de VFP que los coja), sí que podemos sacarle partido, por ejemplo, para el caso que planteas.

¿Cómo pasar una clase desde una librería de clases a otra?

Lo más sencillo es abrir dos instancias del Examinador de Clases y arrastrar el icono de la clases que queremos cambiar de fichero desde la vieja a la nueva.

Si estás usando el Administrador de Proyectos puedes hacer lo mismo arrastrando desde un proyecto a otro.

Hay una órden de VFP que permite hacerlo y se encuentra incluida en el ADD CLASS. La instrucción en concreto sería:

ADD CLASS MyTextBox OF MYLIB1.VCX TO MYLIB2.VCX.

Si esa librería de clases ya tiene otra con ese mismo nombre la sobreescribirá si usas la

extensión OVERWRITE

 ¿Cuándo se debería de usar LOCATE en vez de un SEEK?

Normalmente siempre se deberá de usar SEEK pues es mucho más rápido que LOCATE pues el SEEK es una de las formas más rápidas de buscar siempre y cuando el campo por el que se busca esté indexado. Sin embargo, cuando entre las condiciones hay un filtro el SEEK se puede volver tremendamente lento. La razón es que el SEEK encontrará el primer registro con tu criterio de búsqueda y a continuación se moverá por toda la tabla secuencialmente para encontrar un registro que cumpla con tu criterio y la condición del filtro.

 A diferencia de SEEK, LOCATE es optimizable por Rushmore. LOCATE FOR CustId=m.CustId es usualmente mucho más rápido que SEEK m.CustId cuando se ha establecido un filtro optimizable.

 El mismo problema surge con los GO TOP y GO BOTTOM. Usa LOCATE sin clausulas para ir a GO TOP pues te llevará al primer registro que cumpla la condición del filtro. GO BOTTOM, establece el tag del índice a DESCENDING. LOCATE, establece el Tag a ASCENDING.

¿Como Insertar una imagen JPG o Gif en tu Formulario?

Bueno es muy sencillo existen varias formas de hacerlo pero por lo momentos vamos a utilizar  solo una y no la mas facil , antes que todo tenemos que utilizar un Control Active X o OCX como quieran llamarlos, este control lo utilizamos porque esta en casi todos los computadores , ya que se instala con Ms Office  y  se llama Galeria de Imagenes de Microsoft, lo primero que debemos hacer es entrar en Word o Power Point , despues  que entremos en cualquiera de estas aplicaciones entonces procedemos a insertar una Imagen Prediseñada , Acontinuacion que aparesca el cuadro de imagenes prediseñadas entonces nos vamos a imagen e hacemos click en importar Imagen y seleccionamos la Imagen  que nosotros queremos colocar en el formulario , lo que estamos haciendo es  que nuestra imagen la estamos colocando como parte de las imagenes prediseñadas de Microsoft , para que luego cuando insertemos el control Active X podamos seleccionar directamente la Imagen . un Ejemplo de la ventana de Imagen Prediseñada.

Recuerda que debes tener este control en tu PC de lo contrario no podras utlizarlo , como saber si  tenemos este control, bueno podemos entrar en Visual Foxpro luego hentramos en Herramientas , Opciones , Controles , Controles Active X.

¿Como Ocultar la ventana principal de Visual FoxPro?

Si está ejecutando un formulario de nivel superior, es posible que quiera que la ventana principal de Visual FoxPro esté visible. Puede usar la propiedad Visible del objeto Application para ocultar y mostrar la ventana principal de Visual FoxPro cuando sea necesario.
    Para ocultar la ventana principal de Visual FoxPro
1    En el evento Init del formulario, incluya la siguiente línea de código:
    Application.Visible = .F.
   
2    En el evento Destroy del formulario, incluya la siguiente línea de código:
    Application.Visible = .T.
   
Asegúrese de que también proporciona una forma de cerrar el formulario usando THISFORM.Release en algún método o evento.
Nota También puede incluir la línea siguiente en un archivo de configuración para ocultar la ventana principal de Visual FoxPro:
SCREEN = OFF
   
¿Como Agregar un menú a un formulario de nivel superior?

    Para agregar un menú a un formulario de nivel principal
1    Cree un menú de formulario de nivel superior. Para obtener más información acerca de la creación de menús para formularios de nivel superior, consulte el capítulo 11, Diseño de menús y barras de herramientas.
2    Establezca la propiedad ShowWindow del formulario a 2 – Como formulario de nivel superior.
3    En el evento Init del formulario, ejecute el programa de menú y pásele dos parámetros:
    DO menuname.mpr WITH oForm, lAutoRename
   
    oForm es una referencia de objeto al formulario. En el evento Init del formulario, pásele THIS como primer parámetro.
    lAutoRename especifica si se genera o no un nombre único para el menú. Si pretende ejecutar varias instancias del formulario, pase .T. como lAutoRename.
   
Por ejemplo, puede llamar a un menú llamado mySDImenu con este código:
    DO mySDImenu.mpr WITH THIS, .T.

[Previous] Preguntas Prefuentes VFP
[Next] Porque cuando creo un .exe en VFP y lo ejecuto no aparece nada
[Up] Documentos
[Home] Home Page
[Mail] Send EMail to FoxCarlos



Gracias por visitar esta Pagina

Last modified on Wednesday 26 de April de 2000