Validacion en tiempo de ejecucion de campos de un Grid VFP 6.0

1,185 views
Skip to first unread message

5000razer

unread,
Oct 27, 2014, 12:15:56 PM10/27/14
to publice...@googlegroups.com
A ver si me pueden ayudar. Tengo una grid vacia en mi formulario a la cual en tiempo de ejecucion le asigno una tabla temporal. hay 2 campos de esa tabla a los que quiero
incluirle validaciones y requiere hacerse en tiempo de ejecucion. La instruccion seria algo así : "thisform.column1.text1.valid= ????" 
no tengo idea de como hacer la validacion. tengo entendido que se pueden usar una clases para incluir validaciones dentro de los campos del Grid,.Pero agradeceria sus
indicaciones para usarla y donde deberia ubicar el codigo del valid.. al igual que un pequeño ejemplo de la sintaxis.
De antemano, gracias

Saúl Piña

unread,
Oct 27, 2014, 12:27:10 PM10/27/14
to publice...@googlegroups.com
Te recomiendo que revises todo lo relacionado a bindevents, creo que ese codigo te puede ayudar con lo que ti requieres. Yo, por ejemplo, en este momento tengo el mismo problema pero con un check1 dentro de un grid.

Saludos.

Carlos Alfaro

unread,
Oct 27, 2014, 12:47:08 PM10/27/14
to publice...@googlegroups.com

Estimado amigo Saul:

 

El amigo chicomilrezer no podrá usar bindevents, porque menciono que está trabajando con VFP6.

 

En cuanto a lo que querés hacer estimado amigo 5000, lo que podes validar en es nombre del campo, ya que al estar ubicado en un registro determinado, tenés acceso a los campos de ese registro.

 

Espero que sea comprensible mi recomendación.

 

Saludos.

 

Carlos Alfaro

5000razer

unread,
Oct 27, 2014, 2:12:36 PM10/27/14
to publice...@googlegroups.com

Gracias por las sugerencias amigos, Es cierto trabajo con vfp 6.0 y no me servicia la funcion bindevents. Igualmente te informo carlos que la validacion debo hacerla con "codigo" no
por los eventos propios del grid. la linea del codigo que necesito seria thisform.column1.text1.valid="....."


Carlos Alfaro

unread,
Oct 27, 2014, 2:51:03 PM10/27/14
to publice...@googlegroups.com

Creo que tenes una confusión, porque el método valid no puede asignársele un valor.

 

Pero si lo que queres es usar el valor que tenga la propiedad value, entonces aunque sea por código no usas la referencia. Thisform.column1.text1.value = “……”, sino el nombre del campo que esta ubicado en esa columna  replace mi_campo with “……”

 

Espero que te sirva.

 

Bendiciones.

 

Carlos Alfaro

5000razer

unread,
Oct 27, 2014, 3:21:07 PM10/27/14
to publice...@googlegroups.com, calf...@yahoo.com.ar
Esto es lo que quiero,
arc_detalle="8738738.dbf"
ThisForm.detallazo.visible=.t.
ThisForm.detallazo.Recordsource = "&arC_detalle"
ThisForm.detallazo.Column1.Header1.Caption = "CODIGO"
ThisForm.detallazo.Column1.Header1.FONTNAME = "Arial"
ThisForm.detallazo.Column1.Header1.BACKCOLOR = "255,255,193"
ThisForm.detallazo.Column1.Header1.FONTSIZE = 10
ThisForm.detallazo.Column1.Header1.ALIGNMENT = 2
ThisForm.detallazo.Column1.text1.FONTNAME = "Arial"
ThisForm.detallazo.Column1.text1.valid = ??????

Que instruccion completa debo agregar en la linea anterior para poder "validar" que el campo cumpla con determinadas condiciones, osea ese campo se llama CODIGO
debo validar que exista en la tabla de articulos. Donde debo incluir esa funcion o clase que valide eso y que sintaxis debo colocar en la linea roja ?





Antonio Meza

unread,
Oct 27, 2014, 3:45:01 PM10/27/14
to publice...@googlegroups.com, calf...@yahoo.com.ar
Esta linea
ThisForm.detallazo.Recordsource = "&arC_detalle"
puede quedar mejor asi
ThisForm.detallazo.Recordsource = (arC_detalle)

Para validar ThisForm.detallazo.Column1.text1.valid = ??????
Lo que tienes que hacer es modificar el evento Valid de tu text1 contenido en la column1 de tu grid Detallazo, es decir abre la ventana propiedades, luego selecciona el Grid, le das click con el botón Derecho y le das editar, le das click en la column1 y te vas a la ventana de propiedades veras que dice hasta arriba Column1, lo despliegas y aparecerá Header1 y Text1, selecciona Text1 y luego te vas a la pestaña Métodos de la ventana de propiedades, y hasta abajo busca VALID, le das doble click y en la ventana que te aparece ya puedes poner el código necesario para que hagas tus validaciones

Puedes leer este mensaje donde explico una forma fácil de como usar el Valid


saludos
Antonio Meza

5000razer

unread,
Oct 27, 2014, 4:19:32 PM10/27/14
to publice...@googlegroups.com, calf...@yahoo.com.ar

Amigo Antonio, efectivamente en "tiempo de diseño" puedo validar cada campo con el evento VALID, pero en este caso necesito hacerlo por codigo ya que la tabla q estoy usando para el GRID es creada en "tiempo de ejecucion" y el primer campo CODIGO se debe validar q exista en otra tabla de articulos.
 

detallazo.JPG

Antonio Meza

unread,
Oct 27, 2014, 4:29:14 PM10/27/14
to publice...@googlegroups.com, calf...@yahoo.com.ar
Hola de nuevo!!

No es problema, a tu grid agrégale en modo diseño la propiedad ColumnCount = X

Donde X es la cantidad de Columnas que vas a tener en el Grid, de esta forma ya podrás entrar a editar el Valid de la columna que necesitas. solo recuerda que si vas a generar el cursor en tiempo de ejecución antes de generarlo el valor de RecordSource del Grid debe estar vació es decir grid.RecordSource = "" y ya luego generar tu cursor y asignarlo al grid.

saludos
Antonio Meza

5000razer

unread,
Oct 27, 2014, 4:47:58 PM10/27/14
to publice...@googlegroups.com, calf...@yahoo.com.ar
Excelente Antonio, pensé que el Evento Valid se perdía al definir la nueva estructura con el RecordSource....
Muchas gracias !!!


Fidel Charny

unread,
Oct 27, 2014, 5:01:52 PM10/27/14
to publice...@googlegroups.com, calf...@yahoo.com.ar
El evento valid de un textbox (o lo que fuere) de un grid, escrito en el diseñador de formularios se puede perder si cambias  la propiedad columncount.
Parece mejor hacer una clase textbox con el código de validación que necesites y agregar esta clase a la/las columna/s del grid donde necesites hacer la validación. No hacer falta quitar el text1 original del objeto column. Puedes agregarlo como Text2 y cambiar el CurrentControl de la columna.
Esto en vfp6 funciona perfectamente. (siempre que esté bien programado...).

5000razer

unread,
Oct 27, 2014, 5:07:11 PM10/27/14
to publice...@googlegroups.com, calf...@yahoo.com.ar

Deacuerdo  fidel, entiendo tu planteamineto. al cambiar el currentcontrol en la columna puedo usar el text2. Lo que no tengo claro es la sintaxis para usar la clase que mencionas. Donde la invocaria ?

Fidel Charny

unread,
Oct 27, 2014, 5:44:33 PM10/27/14
to publice...@googlegroups.com, calf...@yahoo.com.ar
No es solo invocarla. Primero la tienes que crear. Por ejemplo, usando el diseñador de clases. Nuevo, nombre de la clase, objeto en el que se basa y la precaución, si es la primera vez que lo usas, de cambiar el nombre de la vcx que aparece en el último cuadro para no utilizar las que genera vfp.

Un control grid es un contenedor que contiene objetos column. Los columns son tambien contenedores que tienen 1 objeto Header (header1) y por defecto un textbox llamado text1 pero pueden contener cualquier otro objeto visual. Mira la ayuda de Column.

El textbox para agregar a un objeto column, debe ser BackStyle=0 y BorderStyle=0. Las dimensiones width y Height serán controladas por el objeto column.
Desde el textbox de la clase, podrás saber cómo se llama el cursor y el campo afectado apelando a las propiedades de la columna en la que se inserta. (this.parent.ControlSource). En Vfp la función Alines() es muy limitada, por lo que tendrás que apelar a At() para detectar las dos partes del ControlSource ( cursor.campo)
* En cualquier evento de la clase
lcControlSource=This.parent.ControlSource
lcCursor = LEFT(lcControlSource,AT(".",lcControlSource)-1)
lcCampo= Substr(lcControlSource , At(".",lcControlSource)+1)
lcValor = Evaluate(lcControlSource)

ó también
Select (lcCursor)
lcValor = Evaluate(lcCampo)

Alternativamente, también:
lcCursor=this.parent.parent.RecordSource

Luego mira la ayuda de NewObject para saber cómo agregar el objeto de clase a un control grid en tiempo de ejecución.


Por ejemplo, en este segmento, si se cumple una condición, se agrega un textbox de clase (gritext de newclase.vcx)  a la columna wi de un control grid.
if AT(cCol+"/",This.ttspecol)#0
* IF VARTYPE(.Columns[wi].Text2)#"O"
IF !PEMSTATUS(.Columns[wi],"Text2",5)
.Columns[wi].NewObject("Text2","GriText","NewClase")
endif
lSparse=.t.
.Columns[wi].CurrentControl="Text2"
.Columns[wi].TExt2.SpecialEffect=1
.Columns[wi].Text2.BorderStyle=0
.Columns[wi].Text2.BackStyle=0
.Columns[wi].Text2.FontSize=8
.Columns[wi].Text2.Visible=.t.
.Columns[wi].Text2.Margin=0
else


Reply all
Reply to author
Forward
0 new messages