Discussion:
Cancelar Validating al cerrar Formulario
(demasiado antiguo para responder)
JOMIJIMO
2009-03-09 11:28:29 UTC
Permalink
Buenas a todos:

Otra vez me dirijo a vosotros en busca de un poco de ayuda porque no
encuentro la forma de hacer lo siguiente:

Necesito que no se dispare el evento Validating de un Texbox cuando
este tiene el foco y se cierra su formulario pulsado la X de
ControlBox.

He intentado poniendo a false el CausesValidate del form, pero no
funciona y como el evento Validating del Textbox se dispara antes que
el evento Closing del Form tampoco me sirve el CloseReason (creo).

Alguien tiene idea de como puedo hacerlo??.

Gracias.
SoftJaén
2009-03-10 10:55:32 UTC
Permalink
Post by JOMIJIMO
Necesito que no se dispare el evento Validating de un Texbox cuando
este tiene el foco y se cierra su formulario pulsado la X de
ControlBox.
Alguien tiene idea de como puedo hacerlo??.
Hola:

Como no has indicado la condición que se debe de cumplir para validar el
contenido del control TextBox, por ahora lo único que se me ocurre es que
sobrescribas el método «OnClosing» de la clase Form, para desde él destruir
al formulario. Inserta lo siguiente en el formulario que deseas controlar:

Protected Overrides Sub OnClosing( _
ByVal e As System.ComponentModel.CancelEventArgs)

MyBase.OnClosing(e)
Me.Dispose()

End Sub

Un saludo
--
Enrique Martínez
[MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
JOMIJIMO
2009-03-10 15:25:10 UTC
Permalink
Ante todo muchas gracias por responder.

El TextBox se debe validar siempre que pierda el foco hacia otro
control. El caso es que tambien se dispara dicho evento cuando se está
cerrando el Form que contiene el TextBox en cuestion y esto último es
lo que necesito evitar, que se dispare el evento Validating del
TextoBox cuando se cierra el Form, ya sea porque el cierre se produce
por programacion o porque el usuario hace click en la X del form.

Lo que me has indicado en tu mensaje de sobrecargar el evento
OnClosing lo he provado pero no evita que se dispara el evento
Validating del TextBox, con lo cual estoy en las misma.

Un saludo.
SoftJaén
2009-03-10 17:52:33 UTC
Permalink
Post by JOMIJIMO
El TextBox se debe validar siempre que pierda el foco hacia otro
control. El caso es que tambien se dispara dicho evento cuando se está
cerrando el Form que contiene el TextBox en cuestion y esto último es
lo que necesito evitar, que se dispare el evento Validating del
TextoBox cuando se cierra el Form, ya sea porque el cierre se produce
por programacion o porque el usuario hace click en la X del form.
Si tienes escrito código en el evento «Validating» o en cualquier otro
evento, NO SE PUEDE EVITAR que se desencadene o se "dispare" el evento.
Puedes eliminarlo mediante la instrucción «RemoveHandler», pero entonces no
se ejecutará NUNCA el código existente en el evento.
Post by JOMIJIMO
Lo que me has indicado en tu mensaje de sobrecargar el evento
OnClosing lo he provado pero no evita que se dispara el evento
Validating del TextBox, con lo cual estoy en las misma.
Pero se cierra el formulario, ¿o no se cierra? :-)

Te repito que una vez instalado un contralador de evento, no se puede evitar
que se desencadene el evento, y por tanto, se ejecute el código existente en
el mismo.

Lo mismo tendrás que validar los datos fuera del evento «Validating» del
control TextBox.
--
Enrique Martínez
[MS MVP - VB]
Ivan
2009-03-10 22:26:42 UTC
Permalink
hola chicos,
Post by JOMIJIMO
El TextBox se debe validar siempre que pierda el foco hacia otro
control. El caso es que tambien se dispara dicho evento cuando se está
cerrando el Form que contiene el TextBox en cuestion y esto último es
lo que necesito evitar, que se dispare el evento Validating del
TextoBox cuando se cierra el Form, ya sea porque el cierre se produce
por programacion o porque el usuario hace click en la X del form.
no se lo que 'haces' en la validacion del textbox, pero si quieres
evitar que el Validating afecte a otras partes de tu aplicacion =>

¿por que no limitas su uso para lo que afecte unicamente a dicho
control (datos validos para el propio textbox , pej ..) y pones la
accion que 'afecte' a terceras partes en un punto que puedas manejar
totalmente?

es decir, si por ejemplo se tratase del tipico formulario tipo ficha
(pej: Nombre, Apellidos, Tlf, etc ) que rellena o modifica una BD =>

usar el validating de cada control para que los datos sean validos en
dicho control,

pero actualizar la BD solo cuando tu consideres (boton 'Nuevo
registro' y/o en un evento del teclado del ultimo control controlando
'Tab' y/o 'Enter', pej)

por supuesto adaptado a tu caso, pero creo que asi no tendria porque
darte un problema el Validating

no se si te servira de algo, pero por si acaso que no quede

un saludo
Ivan
Post by JOMIJIMO
Ante todo muchas gracias por responder.
El TextBox se debe validar siempre que pierda el foco hacia otro
control. El caso es que tambien se dispara dicho evento cuando se está
cerrando el Form que contiene el TextBox en cuestion y esto último es
lo que necesito evitar, que se dispare el evento Validating del
TextoBox cuando se cierra el Form, ya sea porque el cierre se produce
por programacion o porque el usuario hace click en la X del form.
Lo que me has indicado en tu mensaje de sobrecargar el evento
OnClosing lo he provado pero no evita que se dispara el evento
Validating del TextBox, con lo cual estoy en las misma.
Un saludo.
Ivan
2009-03-10 22:36:08 UTC
Permalink
sorry =>

se me escapo añadir =>

'como ya te dice Enrique' ;-) =>>
" Lo mismo tendrás que validar los datos fuera del evento «Validating» del
control TextBox. "

un saludo
Ivan
hola chicos,
Post by JOMIJIMO
El TextBox se debe validar siempre que pierda el foco hacia otro
control. El caso es que tambien se dispara dicho evento cuando se está
cerrando el Form que contiene el TextBox en cuestion y esto último es
lo que necesito evitar, que se dispare el evento Validating del
TextoBox cuando se cierra el Form, ya sea porque el cierre se produce
por programacion o porque el usuario hace click en la X del form.
no se lo que 'haces' en la validacion del textbox, pero si quieres
evitar que el  Validating afecte a otras partes de tu aplicacion =>
¿por que no limitas su uso para lo que afecte unicamente a dicho
control (datos validos para el propio textbox , pej ..) y pones la
accion que 'afecte' a terceras partes en un punto que puedas manejar
totalmente?
es decir, si por ejemplo se tratase del tipico formulario tipo ficha
(pej: Nombre, Apellidos, Tlf, etc ) que rellena o modifica una BD =>
usar el validating de cada control para que los datos sean validos en
dicho control,
pero actualizar la BD solo cuando tu consideres (boton 'Nuevo
registro' y/o en un evento del teclado del ultimo control controlando
'Tab' y/o 'Enter', pej)
por supuesto adaptado a tu caso, pero creo que asi no tendria porque
darte un problema el Validating
no se si te servira de algo, pero por si acaso que no quede
un saludo
Ivan
Post by JOMIJIMO
Ante todo muchas gracias por responder.
El TextBox se debe validar siempre que pierda el foco hacia otro
control. El caso es que tambien se dispara dicho evento cuando se está
cerrando el Form que contiene el TextBox en cuestion y esto último es
lo que necesito evitar, que se dispare el evento Validating del
TextoBox cuando se cierra el Form, ya sea porque el cierre se produce
por programacion o porque el usuario hace click en la X del form.
Lo que me has indicado en tu mensaje de sobrecargar el evento
OnClosing lo he provado pero no evita que se dispara el evento
Validating del TextBox, con lo cual estoy en las misma.
Un saludo.- Ocultar texto de la cita -
- Mostrar texto de la cita -
JOMIJIMO
2009-03-11 06:06:42 UTC
Permalink
Muchas gracias a todos.

Como es obvio, a lo imposible nadie está obligado.

Supongo que cuando te acostumbras a trabajar con una herramienta (VB6)
que hacía esto perfectamente y pasas a una nueva, es dificil entender
porque los creadores de esta nueva herramienta eliminan ciertas
funcionalidades.

Un saludo a todos.
Vinchenzo vinç
2009-03-11 19:34:35 UTC
Permalink
Post by JOMIJIMO
Como es obvio, a lo imposible nadie está obligado.
Alguna vez el maestro Azpurua dijo: «En este oficio, cada vez que
alguien dice "no se puede" se apaga una estrella.» Este no va a ser el caso,
dado que contradiciéndote a tí y a Enrique, no es imposible evitar que se
notifique el evento '_Validating'.

Un formulario, primero recibirá del sistema un mensaje WM_CLOSE (As
Int32 = &H10), conforme se solicita educadamente a dicha ventana que (si lo
desea) se cierre. En ese momento su procedimiento de ventana decide si
quiere o no cerrarse, o si prefiere realizar algunas tareas antes de
cerrarse decidiendo también el orden en el que notificarán los eventos.

Por consiguiente, puedes sobreescribir el procedimiento de ventana
predeterminado del formulario para tú interceptar antes dicho mensaje, y
cancelar automáticamente los eventos _Validating y _Validated para el
control activo:

'**********************
Protected Overrides Sub WndProc(ByRef msg As System.Windows.Forms.Message)
If msg.Msg = WM_CLOSE Then
' Acaban de indicar a esta ventana que, por favor, se cierre.

ActiveControl.CausesValidation = False
End If
MyBase.WndProc(msg)
End Sub
'**********************
--
Saludos
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
( ! ) Respuestas precedentes en Google:
http://groups.google.com/group/microsoft.public.es.dotnet.vb
( i ) Temperancia en el foro:
http://support.microsoft.com/default.aspx?scid=fh;ES-ES;newsreglas
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Ivan
2009-03-11 22:31:29 UTC
Permalink
hola Vinchenzo
Post by Vinchenzo vinç
'**********************
Protected Overrides Sub WndProc(ByRef msg As System.Windows.Forms.Message)
If msg.Msg = WM_CLOSE Then
' Acaban de indicar a esta ventana que, por favor, se cierre.
ActiveControl.CausesValidation = False
End If
MyBase.WndProc(msg)
End Sub
'**********************
como [+/-] diria un 'viejo' y comun conocido: una mas para añadir a mi
saca de 'Vinchenzo_Recursos'. Muchas gracias por aqui

de todas formas solo algo parecido a una 'reflexion' =>

aunque la consulta de OP queda resuelta con tu solucion y ademas lo
que voy a comentar posiblemente no tenga nada que ver con su caso, a
mi se me 'quedo' una mania de VBA excel a la hora de manejar registros
de datos, que es mas o menos lo que comentaba en mi otro mensaje =>

no me gusta 'validar' el registro en si cada vez que el usuario
introduce o modifica un campo, sino, como poco cuando considero que ha
introducido los minimos requeridos y una vez comprobada la validez de
dichos campos. Esta comprobacion si se haria campo a campo mediante
los eventos pertinentes segun la forma [o el control] de introduccion
de dichos datos, simplificando asi el momento de la 'actualizacion'
del registro.

Pero la validacion/actualizacion/llamale x del registro prefiero
desligarla de los eventos asociados a cada campo, dejandola para uno
concreto que seria como el cierre de registro y/o inicio de uno nuevo,
aparte de alguna otra opcion tipo boton 'actualizar'.

bueno, lo mismo estoy diciendo una de mis 'chorradas' [ si es que se
me entiende ;-) ..} pero no me 'importaria' saber tu opinion

en cualquier caso lo dicho: una mas 'pa la saca' :-D

un saludo
Ivan
Post by Vinchenzo vinç
Post by JOMIJIMO
Como es obvio, a lo imposible nadie está obligado.
    Alguna vez el maestro Azpurua dijo: «En este oficio, cada vez que
alguien dice "no se puede" se apaga una estrella.» Este no va a ser el caso,
dado que contradiciéndote a tí y a Enrique, no es imposible evitar que se
notifique el evento '_Validating'.
    Un formulario, primero recibirá del sistema un mensaje WM_CLOSE (As
Int32 = &H10), conforme se solicita educadamente a dicha ventana que (si lo
desea) se cierre. En ese momento su procedimiento de ventana decide si
quiere o no cerrarse, o si prefiere realizar algunas tareas antes de
cerrarse decidiendo también el orden en el que notificarán los eventos.
    Por consiguiente, puedes sobreescribir el procedimiento de ventana
predeterminado del formulario para tú interceptar antes dicho mensaje, y
cancelar automáticamente los eventos _Validating y _Validated para el
'**********************
Protected Overrides Sub WndProc(ByRef msg As System.Windows.Forms.Message)
    If msg.Msg = WM_CLOSE Then
        ' Acaban de indicar a esta ventana que, por favor, se cierre.
        ActiveControl.CausesValidation = False
    End If
    MyBase.WndProc(msg)
End Sub
'**********************
--
    Saludos
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   http://groups.google.com/group/microsoft.public.es.dotnet.vb
   http://support.microsoft.com/default.aspx?scid=fh;ES-ES;newsreglas
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Vinchenzo vinç
2009-03-14 15:03:54 UTC
Permalink
Hola Iván,
Post by Ivan
de todas formas solo algo parecido a una 'reflexion' =>
aunque la consulta de OP queda resuelta con tu solucion y ademas lo
que voy a comentar posiblemente no tenga nada que ver con su caso...
Ojo, un segundo que aclaro unos detalles, porque a fin de cuentas todo
siempre tiene que ver con el todo.

Debe concretarse que la respuesta que dí no era la *solución al
problema*
de quien abrió la consulta, sino que era la *respuesta a la pregunta que se
formuló*, que no es lo mismo (aunque a bote pronto pueda parecer confuso, en
parte por mi culpa, ya que dí por sentado que la solución ya se le había
comunicado).

Por esto aclaro que él o ella preguntó con los siguientes términos:

[···]
Post by Ivan
Necesito que no se dispare el evento Validating de un Texbox cuando
este tiene el foco y se cierra su formulario pulsado la X de
ControlBox.
[···]

Y la única forma, que sepa yo, para *evitar la notificación del evento*
es como expuse, subclasificando el formulario.

JOMIJIMO no aclara en ningún momento qué es lo que se realiza dentro de
la validación, para que nosotros podamos asesorarle teniendo en
consideración si está usando el evento adecuado o no, ni si lo está usando
debidamente.

Tampoco nos pidió que se pudiese cerrar el formulario a pesar de
ejecutarse el evento '_Validating', cosa que también es posible de realizar.

Si el control activo establece e.Cancel = True dentro de la validación
al cerrar el formulario, el evento '_FormClosing' recibe en su parámetro 'e'
la propiedad '.Cancel' establecida en True. Por consiguiente (un ejemplo
bobo):

'*********************
Private Sub Form_FormClosing(ByVal sender As Object, ByVal e As System...
If e.Cancel = True Then 'Un control lo ha cancelado previamente
e.Cancel = MessageBox.Show("Existen datos no válidos. " _
& "¿Cerramos igualmente?", "FormClosing", _
MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) _
= Windows.Forms.DialogResult.No
End If
End Sub
'*********************

Como se puede apreciar, si el usuario responde "Sí", se restablece el
argumento de cancelación, permitiendo que el formulario prosiga el curso de
cierre, sino, el cierre queda cancelado tal como lo había solicitado el
evento de validación del control que canceló la pérdida de su foco, y
retendrá el foco de entrada.

Pero repito, en este caso no se estaría evitando que el evento
'_Validating' sea notificado y ejecutado su código asociado, simplemente
sería ignorado después de haberse ejecutado su código.
Post by Ivan
bueno, lo mismo estoy diciendo una de mis 'chorradas' [ si es que se
me entiende ;-) ..} pero no me 'importaria' saber tu opinion
No creo que sea ninguna chorrada lo que comentas.

Siguiendo pues la reflexión, te explico mi punto de vista y verás que en
el fondo estamos más o menos bastante de acuerdo:
fue en VB6 que apareció el evento '_Validate' bajo un epígrafe de
"mejora en la validación de datos" para los controles intrínsecos. Fue un
evento (en conjunción con la nueva propiedad 'CausesValidation') *diseñado
específicamente para poder cancelar la pérdida del foco del control bajo
determinadas circunstancias*, ya que anteriomente había el inconveniente de
que si se pretendía restablecer el foco desde el '_LostFocus' del mismo
control en un caso de datos no válidos, se ejecutaba igualmente el evento
'_GotFocus' del control al que se había salido, y debía trampearse, por
ejemplo para que veas la idea antiguamente podía hacerse así:

'--------------------
Dim m_CancelFocus As Integer

Private Sub Text1_LostFocus()
If Condición Then
m_CancelFocus = True
Text1.SetFocus
End If
End Sub

Private Sub Text2_GotFocus()
If m_CancelFocus = True Then
m_CancelFocus = False
Exit Sub '···>>>
End If

'Código ejecutable del evento
'...
End Sub
'--------------------

Como además puedes notar, tampoco se podía usar 'ActiveControl.SetFocus'
en el '_LostFocus', ya que en esa línea el foco de entrada ya lo tiene el
otro control, aunque todavía no ha sido notificado su '_GotFocus'.

En verdad, me atrevo a decir que el 98% de los casos en los que se
impone una cancelación de pérdida del foco obedecen a un mal diseño e
implementación conceptual. Pocos casos lo justifican, y sinceramente, ahora
no se me ocurre ninguno a excepción de una solicitud explícita por parte de
un cliente. No se puede atentar contra el libre albedrío del usuario
impidiéndole decidir a su antojo el orden de introducción de la información,
ya que si realmente fuese necesario establecer un orden secuencial, hay
mecanismos en forma de asistentes donde el usuario no puede avanzar al
siguiente dato de entrada hasta la validez del corriente, dándole la
posibilidad de retroceder o cancelar el proceso en cualquier momento.
De todas formas reconozco que es muy general, cada caso debe ser
analizado independientemente y considerando todos sus requisitos y
parámetros de entrada. Espero que quede claro que no estamos hablando de
paradigmas, sino de implementaciones en base a necesidades reales, porque si
se me permite una pequeña analogía algo estúpida, la acción "abofetear"
puede resultar inadecuada en el caso de 'Maria Teresa de Calcuta' y por
inmerecido ser excesivo, pero, esa misma acción, aplicada sobre el caso
'Charles Manson' resultaría francamente insuficiente.

Por estos motivos el ahora equivalente '_Validating' debería utilizarse
de la misma forma que en el clásico, única y exclusivamente para evaluar y
determinar si será necesario cancelar la pérdida del foco, nunca para una
acción, como por ejemplo dar formato al campo, o realizar un cálculo de
operandos para mostrarlo en otro campo, o realizar una actualización en una
base de datos ni nada que se le asome, solamente para verificar y cancelar
la pérdida si correspondiese.
Si no se contempla la posibilidad de cancelar la pérdida del foco (y
déjame insistir en que debería estar muy bien justificado), la validación y
acciones deben realizarse en el evento '_LostFocus' de toda la vida, como
por ejemplo el almacenamiento interno temporal, salvar una copia de
seguridad del borrador de la información corriente, o preprocesar cálculos
internos después de comprobar la validez, al perder el foco.

Entonces, ya que a resultaría adecuado no impedir al usuario "circular
libremente" por campos habilitados, simplemente se le debe "notificar
visualmente" que falta información, o que ésta es incorrecta, *por si le
place* corregirlo antes de proseguir, pero nunca imponerle la obligación de
corregirlo para autorizarle a pasar a otro campo.

Tampoco, bajo mi punto de vista como «usuario de una aplicación
informática» en lugar de como desarrollador, no me agradan las aplicaciones
que no me avisan hasta el final de todo el proceso de que me falta algo o
que simplemente es incorrecto, con el habitual agravante que el validador
examina campo por campo y cuando encuentra uno no válido lo notifica y le
establece el foco del teclado para corregirlo, ¿y qué pasa cuando hay más de
uno incompletos y/o no válidos?, ...pues que dan ganas de estrangular a
alguien por no tenerlos todos identificados en la notificación (que es algo
que tampoco me gusta, porque sobrepasa la capacidad de atención del usuario
estándar, raramente leen un sólo mensaje, menos leerán una enumeración de
los campos incorrectos).

Para ello, me encanta la idea del 'ErrorProvider', relativamente
discreto pero suficientemente llamativo. El usuario sabrá inmediatamente que
deja pendiente un campo requerido que más adelante volverá a requerir su
antención antes de dar aceptación a la entrada de datos, donde se le concede
la libertad de elegir el momento de su corrección, o la cancelación del
proceso de entrada, o la posibilidad de almacenarlo como borrador para
finalizarlo con posterioridad.
Como nota personal, el borrador es una funcionalidad de vital
importancia a mi parecer, uno nunca sabe cuando se dispondrá de toda la
información, y no veo ninguna necesidad de tener que completar forzosamente
el proceso de entrada en una tacada, es lógico que debería poderse iniciar
un registro, "aparcarlo" de forma temporal idefinidamente, y terminarlo
cuando sea factible. Un ejemplo: supón una secretaria que recoge los FAXes
recibidos durante los últimos días con los datos fiscales para la
contabilidad referentes a nuevos proveedores y clientes, va introduciendo
cada uno, inicia una ficha nueva, teclea la información, así uno tras otro.
Pero llegados al CIF de uno de esos FAX, detecta que una parte del número es
ilegible, decide llamar por teléfono pero en la ciudad de ese proveedor es
día festivo, qué debe hacer entonces, ¿descartar el trabajo que ya tenía
realizado?, no, lo almacenará como borrador y mañana consultará el dato y
finalizará el registro.

Por suerte y por desgracia he experimentado los dos tipos de gestión de
la interfaz de usuario, el que bloquea el proceso hasta que le dan lo que
quiere (es decir, solamente te da dos opciones, o "te inventas" un dato para
que calle un rato y sigues con otra cosa, o cancelas todo el proceso
efectuado hasta el punto actual y te acuerdas de la familia del
programador), y el que va avisando 'gota a gota' cada vez que intentas una
aceptación. En un caso por exceso, y en el otro por defecto, ambas son una
interfaz mal gestionada, para mis gustos personales y con total empatía con
el usuario. Para mí, como usuario es inaceptable, y como desarrollador, de
cara al usuario, es indecoroso.


Recuérdese, de ningún modo es un paradigma (y favor de nadie tomárselo
tampoco como pedancia), es solamente una opinión sobre un punto de vista,
cada cual debe analizar cada situación concreta, cuya implementación es
dependiente de los requisitos y la índole de los datos que deberán
gestionarse.
--
Saludos
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
( ! ) Respuestas precedentes en Google:
http://groups.google.com/group/microsoft.public.es.dotnet.vb
( i ) Temperancia en el foro:
http://support.microsoft.com/default.aspx?scid=fh;ES-ES;newsreglas
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Ivan
2009-03-14 22:22:31 UTC
Permalink
hola Vinchenzo,

Lo primero muchas gracias por tu 'punto de vista' :-). Como siempre, resulta muy interesante [y para
mi muy productivo: siempre se pueden sacar multitud de detalles muy prácticos], aun mas porque,
desde mi punto de vista, suele estar plagado de 'sensatez' (y no es coba, aunque me repita 8-D).

Creo que estoy totalmente de acuerdo en tu exposición, aunque mi ignorancia, desconocimiento y falta
de practica en muchos casos, unida a mi 'enrevesada' forma de explicarme, pueda hacer parecer que
no.

De hecho, en mi caso, que prácticamente soy el único usuario de mis intentos de programación, uno de
mis 'eternos' proyectos, y en cierta manera una de las principales causas de mi enganche a VB[A], es
una especie de TPV en el que 'adaptar' la interface del usuario a mi peculiar forma de introducir
los datos. En general, la mayoría de los programas que probé en su día (y fueron muchos) hacían uso
de alguno de los mecanismos comentados por ti, y no acabaron de convencerme

En dicho 'experimento' uno de los principales puntos es algo parecido al 'borrador', aunque en este
caso con una aplicación algo diferente, que me permite [aunque pueda sonar a aberración a mas de
uno], entre otras cosas la introducción de registros 'por campo', e incluso por parciales de este.
Es decir, por ejemplo, tras recibir un pedido, pueden existir grupos de artículos cuya referencia
comienza por un mismo conjunto de dígitos o caracteres, los cuales introduzco 'del tiron', ayudado
por algún truco de repetición, completando la parte variable en un paso posterior. Igualmente para
otros muchos campos, incluidos los que pueden contener datos totalmente diferente.

Como soy un poco vago, al introducir listas relativamente largas. me suele resultar mas cómodo a la
hora de 'teclear' introducir primero todos los datos del primer campo (con el añadido comentado de
los parciales) de todos los registros [en definitiva, la columna entera], después todos los del
segundo, etc ....

En fin, algo así como la antitesis de la programación con bases de datos, pero a mi como usuario no
veas lo que me facilita la vida :)

En cuanto al Errorprovider y a la forma o momento de comunicar/evaluar los errores, creo que ayer
peque de precipitación en una respuesta sobre el tema en el foro. Sobre todo a la hora de juzgar al
errorProvider, el cual no había usado nunca hasta que me puse a indagar para el ejemplo (que por
cierto es un claro exponente de uno de los puntos que tu mismo comentas que no te gusta demasiado
:-()). La verdad es que mi rechazo inicial es mas bien fruto de mi tendencia a no incluir demasiados
extras 'hiperactivos' que anden haciendo cualquier cosa visual, sonora o similar, creando puntos de
atención/distracción en la interface, sobre todo los que tengan una función mas bien 'esnob que
practica.

Pero, tal y como tu comentas, en este caso puede resultar muy practico, precisamente porque esa
seria la función del errorprovider: llamar la atención sobre el error, sin tener por que obligar a
terceras acciones. Aunque la implementación evidentemente puede ser múltiple así como las
situaciones y casos.

Bueno, disculpa el rollo y encantado de charlar un rato. [Por cierto, en cuanto a la consulta en si
misma, yo también considero que tu respuesta la responde plenamente tal cual esta planteada. Lo
demás son mas bien pajas mentales mías :-)]

un saludo y muchas gracias
Ivan
Post by Vinchenzo vinç
Hola Iván,
Post by Ivan
de todas formas solo algo parecido a una 'reflexion' =>
aunque la consulta de OP queda resuelta con tu solucion y ademas lo
que voy a comentar posiblemente no tenga nada que ver con su caso...
Ojo, un segundo que aclaro unos detalles, porque a fin de cuentas todo siempre tiene que ver
con el todo.
Debe concretarse que la respuesta que dí no era la *solución al problema*
de quien abrió la consulta, sino que era la *respuesta a la pregunta que se
formuló*, que no es lo mismo (aunque a bote pronto pueda parecer confuso, en
parte por mi culpa, ya que dí por sentado que la solución ya se le había
comunicado).
[···]
Post by Ivan
Necesito que no se dispare el evento Validating de un Texbox cuando
este tiene el foco y se cierra su formulario pulsado la X de
ControlBox.
[···]
Y la única forma, que sepa yo, para *evitar la notificación del evento* es como expuse,
subclasificando el formulario.
JOMIJIMO no aclara en ningún momento qué es lo que se realiza dentro de la validación, para que
nosotros podamos asesorarle teniendo en consideración si está usando el evento adecuado o no, ni
si lo está usando debidamente.
Tampoco nos pidió que se pudiese cerrar el formulario a pesar de ejecutarse el evento
'_Validating', cosa que también es posible de realizar.
Si el control activo establece e.Cancel = True dentro de la validación
al cerrar el formulario, el evento '_FormClosing' recibe en su parámetro 'e'
'*********************
Private Sub Form_FormClosing(ByVal sender As Object, ByVal e As System...
If e.Cancel = True Then 'Un control lo ha cancelado previamente
e.Cancel = MessageBox.Show("Existen datos no válidos. " _
& "¿Cerramos igualmente?", "FormClosing", _
MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) _
= Windows.Forms.DialogResult.No
End If
End Sub
'*********************
Como se puede apreciar, si el usuario responde "Sí", se restablece el argumento de cancelación,
permitiendo que el formulario prosiga el curso de cierre, sino, el cierre queda cancelado tal como
lo había solicitado el evento de validación del control que canceló la pérdida de su foco, y
retendrá el foco de entrada.
Pero repito, en este caso no se estaría evitando que el evento '_Validating' sea notificado y
ejecutado su código asociado, simplemente sería ignorado después de haberse ejecutado su código.
Post by Ivan
bueno, lo mismo estoy diciendo una de mis 'chorradas' [ si es que se
me entiende ;-) ..} pero no me 'importaria' saber tu opinion
No creo que sea ninguna chorrada lo que comentas.
Siguiendo pues la reflexión, te explico mi punto de vista y verás que en el fondo estamos más o
fue en VB6 que apareció el evento '_Validate' bajo un epígrafe de "mejora en la validación de
datos" para los controles intrínsecos. Fue un evento (en conjunción con la nueva propiedad
'CausesValidation') *diseñado específicamente para poder cancelar la pérdida del foco del control
bajo determinadas circunstancias*, ya que anteriomente había el inconveniente de que si se
pretendía restablecer el foco desde el '_LostFocus' del mismo control en un caso de datos no
válidos, se ejecutaba igualmente el evento '_GotFocus' del control al que se había salido, y debía
'--------------------
Dim m_CancelFocus As Integer
Private Sub Text1_LostFocus()
If Condición Then
m_CancelFocus = True
Text1.SetFocus
End If
End Sub
Private Sub Text2_GotFocus()
If m_CancelFocus = True Then
m_CancelFocus = False
Exit Sub '···>>>
End If
'Código ejecutable del evento
'...
End Sub
'--------------------
Como además puedes notar, tampoco se podía usar 'ActiveControl.SetFocus' en el '_LostFocus', ya
que en esa línea el foco de entrada ya lo tiene el otro control, aunque todavía no ha sido
notificado su '_GotFocus'.
En verdad, me atrevo a decir que el 98% de los casos en los que se impone una cancelación de
pérdida del foco obedecen a un mal diseño e implementación conceptual. Pocos casos lo justifican,
y sinceramente, ahora no se me ocurre ninguno a excepción de una solicitud explícita por parte de
un cliente. No se puede atentar contra el libre albedrío del usuario impidiéndole decidir a su
antojo el orden de introducción de la información, ya que si realmente fuese necesario establecer
un orden secuencial, hay mecanismos en forma de asistentes donde el usuario no puede avanzar al
siguiente dato de entrada hasta la validez del corriente, dándole la posibilidad de retroceder o
cancelar el proceso en cualquier momento.
De todas formas reconozco que es muy general, cada caso debe ser analizado independientemente y
considerando todos sus requisitos y parámetros de entrada. Espero que quede claro que no estamos
hablando de paradigmas, sino de implementaciones en base a necesidades reales, porque si se me
permite una pequeña analogía algo estúpida, la acción "abofetear" puede resultar inadecuada en el
caso de 'Maria Teresa de Calcuta' y por inmerecido ser excesivo, pero, esa misma acción, aplicada
sobre el caso 'Charles Manson' resultaría francamente insuficiente.
Por estos motivos el ahora equivalente '_Validating' debería utilizarse de la misma forma que
en el clásico, única y exclusivamente para evaluar y determinar si será necesario cancelar la
pérdida del foco, nunca para una acción, como por ejemplo dar formato al campo, o realizar un
cálculo de operandos para mostrarlo en otro campo, o realizar una actualización en una base de
datos ni nada que se le asome, solamente para verificar y cancelar la pérdida si correspondiese.
Si no se contempla la posibilidad de cancelar la pérdida del foco (y déjame insistir en que
debería estar muy bien justificado), la validación y acciones deben realizarse en el evento
'_LostFocus' de toda la vida, como por ejemplo el almacenamiento interno temporal, salvar una
copia de seguridad del borrador de la información corriente, o preprocesar cálculos internos
después de comprobar la validez, al perder el foco.
Entonces, ya que a resultaría adecuado no impedir al usuario "circular libremente" por campos
habilitados, simplemente se le debe "notificar visualmente" que falta información, o que ésta es
incorrecta, *por si le place* corregirlo antes de proseguir, pero nunca imponerle la obligación de
corregirlo para autorizarle a pasar a otro campo.
Tampoco, bajo mi punto de vista como «usuario de una aplicación informática» en lugar de como
desarrollador, no me agradan las aplicaciones que no me avisan hasta el final de todo el proceso
de que me falta algo o que simplemente es incorrecto, con el habitual agravante que el validador
examina campo por campo y cuando encuentra uno no válido lo notifica y le establece el foco del
teclado para corregirlo, ¿y qué pasa cuando hay más de uno incompletos y/o no válidos?, ...pues
que dan ganas de estrangular a alguien por no tenerlos todos identificados en la notificación (que
es algo que tampoco me gusta, porque sobrepasa la capacidad de atención del usuario estándar,
raramente leen un sólo mensaje, menos leerán una enumeración de los campos incorrectos).
Para ello, me encanta la idea del 'ErrorProvider', relativamente discreto pero suficientemente
llamativo. El usuario sabrá inmediatamente que deja pendiente un campo requerido que más adelante
volverá a requerir su antención antes de dar aceptación a la entrada de datos, donde se le concede
la libertad de elegir el momento de su corrección, o la cancelación del proceso de entrada, o la
posibilidad de almacenarlo como borrador para finalizarlo con posterioridad.
Como nota personal, el borrador es una funcionalidad de vital importancia a mi parecer, uno
nunca sabe cuando se dispondrá de toda la información, y no veo ninguna necesidad de tener que
completar forzosamente el proceso de entrada en una tacada, es lógico que debería poderse iniciar
un registro, "aparcarlo" de forma temporal idefinidamente, y terminarlo cuando sea factible. Un
ejemplo: supón una secretaria que recoge los FAXes recibidos durante los últimos días con los
datos fiscales para la contabilidad referentes a nuevos proveedores y clientes, va introduciendo
cada uno, inicia una ficha nueva, teclea la información, así uno tras otro. Pero llegados al CIF
de uno de esos FAX, detecta que una parte del número es ilegible, decide llamar por teléfono pero
en la ciudad de ese proveedor es día festivo, qué debe hacer entonces, ¿descartar el trabajo que
ya tenía realizado?, no, lo almacenará como borrador y mañana consultará el dato y finalizará el
registro.
Por suerte y por desgracia he experimentado los dos tipos de gestión de la interfaz de usuario,
el que bloquea el proceso hasta que le dan lo que quiere (es decir, solamente te da dos opciones,
o "te inventas" un dato para que calle un rato y sigues con otra cosa, o cancelas todo el proceso
efectuado hasta el punto actual y te acuerdas de la familia del programador), y el que va avisando
'gota a gota' cada vez que intentas una aceptación. En un caso por exceso, y en el otro por
defecto, ambas son una interfaz mal gestionada, para mis gustos personales y con total empatía con
el usuario. Para mí, como usuario es inaceptable, y como desarrollador, de cara al usuario, es
indecoroso.
Recuérdese, de ningún modo es un paradigma (y favor de nadie tomárselo tampoco como pedancia),
es solamente una opinión sobre un punto de vista, cada cual debe analizar cada situación concreta,
cuya implementación es dependiente de los requisitos y la índole de los datos que deberán
gestionarse.
--
Saludos
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
http://groups.google.com/group/microsoft.public.es.dotnet.vb
http://support.microsoft.com/default.aspx?scid=fh;ES-ES;newsreglas
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Loading...