FoxPro/Visual FoxPro - nueva duda

   
Vista:

nueva duda

Publicado por efrain (10 intervenciones) el 13/02/2014 10:46:40
primero que todo, saludos, comunidad...

vengo por acá a ver si me ayudan a salir de unas nuevas varias dudas, verán tengo varios textbox y algunos editbox, lo que quiero es que todos se sitúen a la izquierda cuando reciban el foco y que no me permita darles espacio con las flechas direccionales, solo con la barra espaciadora... se podrá lograr esto?

otra cosa es que cuando los editbox son alimentados por una información de una tabla, me ubique el cursor al inicio a la izquierda y no donde clique el cursor del mouse.

y una mas es que los textbox sean alimentados con teclas del ordenador y no con espacios con las tecla de dirección, solo que los espacios los reciba con la barra espaciadora; por ejemplo, creen un form y creen un textobox y ejecuten el form, verán que al pulsar la barra de dirección derecha solo se llena con espacios vacíos, bueno, yo quiero que solo se puedan llenar con letras o números o espacios con la barra, si le coloco un lastkey no me deja navegar entre las letras que ya he escrito y no es lo correcto, que mas podría hacer? muchas gracias por la ayuda ofrecida...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

nueva duda

Publicado por Fidel José (558 intervenciones) el 13/02/2014 13:01:03
Lo mejor que puedes hacer es crear una clase TextBox y otra EditBox en una biblioteca vcx.
Lo que debes tener en cuenta es lo siguiente:

En los eventos Click, DblClick y GotFocus, va la instrucción This.SelStart = 0
En el evento KeyPress, detectas si se pulsó una flecha o barra espaciadora. La propiedad PulKey de la clase, se actualiza al final. De modo que al comparar dentro del do case, está viendo el valor anterior.

Luego en lugar de utilizar los EditBox y TextBox de base, allí donde necesitas ese efecto, pegas el control correspondiente de la biblioteca de clases vcx.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
PROCEDURE KeyPress
               LPARAMETERS nKeyCode, nShiftAltCtrl
               DO case
               	CASE nkeycode=5
               		NODEFAULT
               	CASE nkeycode=4
               		NODEFAULT
               		IF NOT INLIST(this.pulkey,4,32)
               			this.SelStart=this.SelStart+1
               		ENDIF
               	CASE nkeycode=24
               		NODEFAULT
               	CASE nkeycode=19
               		NODEFAULT
               		IF this.SelStart#0
               			this.SelStart=this.SelStart-1
               		ENDIF
               	CASE nKeyCode=32
               		IF INLIST(this.pulkey,4,32)
               			NODEFAULT
               		ENDIF
               ENDCASE
               this.pulkey=nKeyCode
               ENDPROC


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<OBJETO>
     <Class|C|=textbox/>
     <PROPERTIES>
          FontSize = 8
          Height = 21
          SpecialEffect = 1
          Width = 100
          BorderColor = 114,136,141
          pulkey = 0                                     && "PulKey" es una propiedad de usuario que agregas a la clase
          Name = "gtext"
     </PROPERTIES>
     <USER_PROPERTIES>
          This.Pulkey
     </USER_PROPERTIES>
     <BaseClass|C|=textbox/>
     <ObjName|C|=gtext/>
     <METHODS>
          <PROCEDURE>
               PROCEDURE DblClick
               this.SelStart=0
               ENDPROC
          </PROCEDURE>
          <PROCEDURE>
               PROCEDURE Click
               this.SelStart=0
               ENDPROC
          </PROCEDURE>
          <PROCEDURE>
               PROCEDURE GotFocus
               this.SelStart=0
               ENDPROC
          </PROCEDURE>
          <PROCEDURE>
               PROCEDURE KeyPress
               LPARAMETERS nKeyCode, nShiftAltCtrl
               DO case
               	CASE nkeycode=5
               		NODEFAULT
               	CASE nkeycode=4
               		NODEFAULT
               		IF NOT INLIST(this.pulkey,4,32)
               			this.SelStart=this.SelStart+1
               		ENDIF
               	CASE nkeycode=24
               		NODEFAULT
               	CASE nkeycode=19
               		NODEFAULT
               		IF this.SelStart#0
               			this.SelStart=this.SelStart-1
               		ENDIF
               	CASE nKeyCode=32
               		IF INLIST(this.pulkey,4,32)
               			NODEFAULT
               		ENDIF
               ENDCASE
               this.pulkey=nKeyCode
               ENDPROC
          </PROCEDURE>
          <PROCEDURE>
               PROCEDURE Valid
               this.Value=ALLTRIM(this.Value)
               ENDPROC
          </PROCEDURE>
     </METHODS>
</OBJETO>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

nueva duda

Publicado por efrain (10 intervenciones) el 13/02/2014 18:44:04
bien, de verdad muchas gracias, me parece que es una idea muy buena, pero lo que no entiendo es la ultima linea:
"Luego en lugar de utilizar los EditBox y TextBox de base, allí donde necesitas ese efecto, pegas el control correspondiente de la biblioteca de clases vcx."

osea, que si tengo 5 editbox y 5 textobox, debo hacer 10 clases? uno para cada uno? esto no me genera error al momento de yo cargar, guardar o modificar la información que de el depende la tabla? realmente no se trabajar mucho con clases vcx, te agradecería si pudieses ayudarme, una vez mas, muchas gracias por la idea y el código...

ah y por ultimo, que debiera colocar en la propiedad "PulKey"?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

nueva duda

Publicado por Fidel José (558 intervenciones) el 13/02/2014 20:59:39
Tal vez no conozcas cómo trabajar con una biblioteca de clases. El tema es justamente al revés de lo que planteas:
Desarrollo una vez para despreocuparme luego. Puedo utilizar esa clase en toda la aplicación, sin volver a crear nada, simplemente pegando.

En el Project Manager, seleccionas la ficha Cls (Classes) y le das al botón New. En el cuadro que aparece colocas el nombre que quieras que tenga tu TextBox, por ejemplo, "gText" y luego seleccionas Based On, buscando en la lista, "textbox". En Store In, modifica el nombre de archivo de bilblioteca y le pones uno que te guste (respetando el path y la extensión), por ejemplo "Primera.vcx". Inmediatamente te aparece el Class Designer con un textbox. En este tienes que agregar la propiedad PulKey. Para ello haces click en el menú Class (menú general) y en el submenu, NewProperty. Te aparece el cuadro de diálogo para generar la propiedad. En Name, colocas PulKey (no importan mayúsculas o minúsculas) y en Default Initial Value, colocas un cero. Luego Aceptar. Si cierras las ventanas, te preguntará si quieres grabar. Y ya. Ahora en el Project Manager verás una biblioteca llamada Primera y abriendo el (+) tendrás la clase TextBox. Pide modificarla para agregar todo lo dicho (Rellenar los Eventos click, dblClick y GotFocus y el evento KeyPress) y las cuestiones de cómo quieras que se vea.
Repite el proceso para crear un EditBox de características similares. Esta vez no cambies el nombre de la biblioteca, para que te queden todos en la misma biblioteca vcx.

1) desarrollas una subclase de TextBox y otra de EditBox en una biblioteca de clases vcx (con el diseñador de clases te resulta bastante sencillo).
2) Cada vez que necesitas utilizar la clase en un formulario, estando el form abierto en modo de diseño, apuntas al botón "View Classes", add... en el menú y te aparece el buscar de Windows para situar la librería dentro de tu proyecto.
La librería se despliega en la barra de herramientas.
3) Luego pescas de ahí y pegas todas las veces que lo necesitas como si fuera un TextBox base, o un EditBox Base. Ya no tienes que hacer otra cosa.
4) Todas las modificaciones que hagas en la clase (salvo el tamaño) se trasladan inmediatamente a toda la aplicación (gran ventaja por si hay que agregar o corregir algo).

Nota:
a) Cuando generas una subclase en una biblioteca vcx, tienes la posibilidad de agregar Custom properties y Custom Methods (propiedades y métodos de usuario), cosa que no sucede con un textbox de base pegado en un formulario.
b) En cuanto al valor de la propiedad PulKey, verás que esto lo maneja el evento Keypress.
Si te funciona de arranque, ya nunca tendrás que volver a preocuparte por este tema.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

nueva duda

Publicado por efrain (10 intervenciones) el 15/02/2014 10:18:36
pff... gran respuesta... ok, quizás pido mucho, pero de casualidad no tienes un ejemplo creado que puedas facilitarme? tan siquiera con un textobox y un editbox, con eso ya me defiendo para todo lo que tengo que hacer...

otra cosa es: tengo varios grids a los que alimento con un filtro de unos datos de una tabla, son unos grados con unas secciones escolares, filtra bien y todo lo hace bien, lo que no entiendo es lo siguiente:

grid1: grid2: grid3:
grado: 1/1/1/1/1 grado: 1/2/2/2/2/2 grado: 1/3/3/3/3/3
sección: a/a/a/a/a sección: a/b/b/b/b/b sección: a/c/c/c/c/c
materia: a1/a2/a3/a4/a5 materia: a1/b1/b2/b3/b4/b5 materia: a1/c1/c2/c3/c4/c5

si te fijas en el ejemplo, en el grid1 todo es correcto, pero en el grid2, me llama la primera linea del grid1, así haya hecho el filtro, igual con el grid3, y siempre me llama es solo la primera linea de la tabla, que puedo hacer para evitar esto? muchas gracias de verdad por toda la ayuda ofrecida....

por cierto, trabajo en vfp9...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar