PDA

Ver la Versión Completa : Verificar si un Componente MaskEdit está vacio


Dergon
11-08-2017, 00:08:16
Hola Expertos,necisitaba una mano,estoy intentando verificar con un boton si el maskedit esta vacio,pero no me va el codigo

if MaskEdit1.text = '' then
begin
showmessage('vacio');


da este error

https://ibb.co/hokYMa

roman
11-08-2017, 01:23:13
Cuando haces clic en el botón, el MaskEdit pierde el foco y eso hace que en automático se valide el control, y, al no ser correcto el formato, te manda la excepción que muestras. Luego entonces, no puedes hacer la verificación que quieres de esa manera.

La pregunta es: ¿para qué quieres hacer esa verificación si precisamente el control ya se encarga de eso

LineComment Saludos

ecfisa
11-08-2017, 01:24:41
Hola.

No sé si entendí bién el problema, pero si te refieres a verificar que no tenga caracteres ingresados por el usuario, podrías hacer:

function IsMaskEditEmpty(ME: TMaskEdit): Boolean;
var
tmp: string;
begin
tmp := ME.EditMask;
ME.EditMask := '';
Result := ME.Text = '';
ME.EditMask := tmp;
end;


Ejemplo de uso:

...
begin
if IsMaskEditEmpty(MaskEdit1) then
ShowMessage('Vacío');

En cuanto al mensaje de error no sé que tratamiento das al contenido... Tal vez te sirva usar como filtros numéricos el caracter 9,que permite un dígito pero no lo requiere y como filtros alfanuméricos al caracter a que permite un caracter pero no lo requiere.

Saludos :)

Dergon
11-08-2017, 14:28:56
Cuando haces clic en el botón, el MaskEdit pierde el foco y eso hace que en automático se valide el control, y, al no ser correcto el formato, te manda la excepción que muestras. Luego entonces, no puedes hacer la verificación que quieres de esa manera.

La pregunta es: ¿para qué quieres hacer esa verificación si precisamente el control ya se encarga de eso

LineComment Saludos

Lo uso,que cuando apriente el boton si esta vacio el maskedit,dee un mensaje,y si no esta vacio que prosiga el codigo.

Dergon
11-08-2017, 14:29:26
Hola.

No sé si entendí bién el problema, pero si te refieres a verificar que no tenga caracteres ingresados por el usuario, podrías hacer:

function IsMaskEditEmpty(ME: TMaskEdit): Boolean;
var
tmp: string;
begin
tmp := ME.EditMask;
ME.EditMask := '';
Result := ME.Text = '';
ME.EditMask := tmp;
end;


Ejemplo de uso:

...
begin
if IsMaskEditEmpty(MaskEdit1) then
ShowMessage('Vacío');

En cuanto al mensaje de error no sé que tratamiento das al contenido... Tal vez te sirva usar como filtros numéricos el caracter 9,que permite un dígito pero no lo requiere y como filtros alfanuméricos al caracter a que permite un caracter pero no lo requiere.

Saludos :)

Esta funcion va donde,esque soy novato en esto.

Dergon
11-08-2017, 14:51:41
Esta funcion va donde,esque soy novato en esto.
Aqui estoy pasando unas imagenes.
https://ibb.co/cV901a https://ibb.co/itgr7F https://ibb.co/cYKpuv https://ibb.co/i9yhEv

ecfisa
11-08-2017, 15:57:53
Hola.
Esta funcion va donde,esque soy novato en esto.
Tenes que situarla dentro del área de alcance de uso (que sea visible desde donde la usas), un ejemplo:

...

implementation

// ( visible a partir de aquí )
function IsMaskEditEmpty(ME: TMaskEdit): Boolean;
var
tmp: string;
begin
tmp := ME.EditMask;
ME.EditMask := '';
Result := ME.Text = '';
ME.EditMask := tmp;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
MaskEdit1.EditMask := '!99/99/9999;1;_'
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if IsMaskEditEmpty(MaskEdit1) then
ShowMessage('Vacío');
end;
...

También podrías situar la declaración de la función en la sección de interfaz (interface) de otra unidad, el código en su implementación (implementation) e incluirla, etc.

Para mas información revisa este enlace: Como declarar una función (https://www.clubdelphi.com/foros/showthread.php?t=83353)

Saludos :)

roman
11-08-2017, 16:27:58
Lo uso,que cuando apriente el boton si esta vacio el maskedit,dee un mensaje,y si no esta vacio que prosiga el codigo.

A ver, voy a ampliar un poco el panorama:

Si el usuario entra al control, no hace nada y sale, entonces, no ocurre la validación interna y ahí puedes usar la función que te pone ecfisa.

Pero, si el usuario hace algún cambio, aunque luego vacíe el control; al intentar salir (por ejempo al pasar el foco al botón), el control lanzará la validación antes de que ocurra el evento OnClick del botón; antes, incluso, del evento OnExit del control, de manera que la función de ecfisa no te servirá en esos casos.

De todas formas, esa función sí te sirve para el primer caso y, en mi opinión, tgendrías que llamarla en el evento OnExit del MaskEdit.

LineComment Saludos

ecfisa
11-08-2017, 16:51:03
Hola roman.

Claro, totalmente de acuerdo, siempre deberá respetar las restricciones impuestas en la máscara, de otro modo no pasará la validación interna.

Pero si usa los filtros '9' o 'a' (permitido, pero no requerido) podrá borrar todo el contenido del MaskEdit y salir de él sin obtener ningún error. En ese caso puede usar la función para verificar si está vacío (eso supuse que deseaba hacer).


Saludos :)

roman
11-08-2017, 17:15:32
Tienes razón. De hecho ahora veo que el mensaje que le manda no es el del control como supuse sino de una conversión.

LineComment Saludos

Dergon
12-08-2017, 23:48:32
Ya mirando aqui las respuestas e probado las instruciones de ecfisa,el codigo va de maravilla,y agradesco mucho el tiempo que dan para responder,si el maskedit esta vacia ,al preciosar el boton va hasta la linea del mensaje,pero al informar un numero sin informar toda la fecha,resalta directamente el error,como prodria yo evitar ese error.

Dergon
15-08-2017, 15:24:45
:confused:Ya mirando aqui las respuestas e probado las instruciones de ecfisa,el codigo va de maravilla,y agradesco mucho el tiempo que dan para responder,si el maskedit esta vacia ,al preciosar el boton va hasta la linea del mensaje,pero al informar un numero sin informar toda la fecha,resalta directamente el error,como prodria yo evitar ese error.

ecfisa
15-08-2017, 18:31:22
Hola Dergon.

¿ Podrías publicar la máscara que definiste para el MaskEdit ?

Saludos :)

Dergon
16-08-2017, 02:30:13
!99/99/9999;1;_ es asi como la tengo en el maskedit.

movorack
16-08-2017, 15:06:37
Ya que en la consulta esto recibirá una fecha. ¿No seria mejor usar un DateTimePicker?

ecfisa
16-08-2017, 18:12:10
Hola.

Entonces no estoy entendiendo la situación, con esa máscara me permite salir del control con ingresos tales como:

1 / /
1 /11/
__/__/2017

Y es lógico por que la máscara está indicando que en cada posición se admite un dígito numérico pero no es necesariamente requerido.

Ahora, siendo sinceros, de ese modo su función pierde sentido ya que no está verificando si el contenido es una fecha válida... :)

Saludos :)

Dergon
16-08-2017, 22:13:49
Muchas gracias a los moderadores,lo del maskedit lo estaba haciendo de forma incorrecta para manejar datos de fechas,puse el tdatetimepicker,solo que al validar la fecha com mi ibquery,el como si fuese que no e puesto ninguna fecha,el projecto compila sin problemas

Aqui el codigo
dm_dados.sqlConVenta.ParamByName('datavend').value :=DateTimePicker1.DateTime ;

Dergon
17-08-2017, 15:50:16
Logre solucionar de esta manera.

dm_dados.sqlConVenta.ParamByName('datavend').Text :=DateToStr (DateTimePicker1.Date);