Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-05-2012
Avatar de Jere_84
Jere_84 Jere_84 is offline
Miembro
NULL
 
Registrado: sep 2011
Ubicación: Córdoba, Argentina
Posts: 214
Poder: 0
Jere_84 cantidad desconocida en este momento
Exclamation Funcion para validar campos.

Buenas delfos, tengo esta función que hice hace unos días para validar los campos obligando al usuario a que los ingrese antes de hacer el Grabar. Lo que hago es pasar el form como parámetro, antes de esto configuro los edits que son obligatorios con el tag=1, en el caso de que sean null , tomo el caption del componente y los muestro en una función mensaje. El problema ocurre que muchas veces el recorrido de los componentes no es en el orden esperado y muestra el mensaje de un edit que esta mas bajo que otro. por ejemplo tengo dos edits con tag=1 primero esta Nombre y luego Apellido dejos los dos en blanco y el primero que muestra el mensaje es el de Apellido. El tab order de los componentes esta bien y ademas en la clase están declarados en el orden de los tabs. Digamos que no se que patrón utiliza para hacer el recorrido. ¿Alguna sugerencia?
Gracias por leerme.

Código Delphi [-]
function ValidarCampos(formulario: TForm): boolean;
var
  i, tamano:integer;
  campo: string;
begin
  ValidarCampos:= True;
  tamano := formulario.ComponentCount;
  for i:=0 to tamano - 1 do
  begin
    if (formulario.Components[i] is TJfDbEdit) then
    begin
      if TJfDbEdit(formulario.Components[i]).Tag = 1 then
        if TJfDbEdit(formulario.Components[i]).IsNull then
        begin
          campo:= TJfDbEdit(formulario.Components[i]).ILabel.Caption;
          Mensaje('El campo ' + pchar(campo) + ' es obligatorio.', 3, 0, 0, 0, 0);
          TJfDbEdit(formulario.Components[i]).SetFocus;
          ValidarCampos:= False;
          Exit;
        end;
    end;
  end;
end;
Responder Con Cita
  #2  
Antiguo 31-05-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
No conozco los componentes JfDBEdit, así que no sé quién se supone que es ILabel. Con los DBEdit normales, y supongo que con estos también, puedes acceder al componente TField asociado al Edit y usar entonces la propiedad DisplayName para acceder al nombre del campo en cuestión y así poder presentarlo en tu mensaje de error.

// Saludos
Responder Con Cita
  #3  
Antiguo 31-05-2012
Avatar de Jere_84
Jere_84 Jere_84 is offline
Miembro
NULL
 
Registrado: sep 2011
Ubicación: Córdoba, Argentina
Posts: 214
Poder: 0
Jere_84 cantidad desconocida en este momento
Cita:
Empezado por roman Ver Mensaje
No conozco los componentes JfDBEdit, así que no sé quién se supone que es ILabel. Con los DBEdit normales, y supongo que con estos también, puedes acceder al componente TField asociado al Edit y usar entonces la propiedad DisplayName para acceder al nombre del campo en cuestión y así poder presentarlo en tu mensaje de error.

// Saludos
Mas allá del componente que es personalizado pero desciende de un DbEdit. El recorrido es mi problema. Pregunta: ¿como hacer para que recorra los componentes en el orden en como se presentan en pantalla? Lee bien mi preg. que que esta claro cual es mi inconveniente.

Slds.
Responder Con Cita
  #4  
Antiguo 31-05-2012
Avatar de champy
champy champy is offline
Miembro
 
Registrado: sep 2003
Ubicación: Alicante, España
Posts: 75
Poder: 21
champy Va por buen camino
He estado haciendo algunas pruebas y tienes razón. El indice de ComponentCount no respeta ni el Taborder ni la declarión en el .PAS

Según lo que podido probar, el orden va dado a la declaración de los objetos en el .DFM (Delphi Form) de la unidad. Quizás tendrás que editar manualmente el archivo y reordenar la declaración de los componentes.
Responder Con Cita
  #5  
Antiguo 31-05-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Tienes razón, no había leido bien.

No estoy seguro, pero el error posiblemente se deba a que Components refleje no el orden visual sino el orden en que fueron insertados los componentes en el formulario, el cual no cambia al cambiar el Tab Order. ¿Has probado usar Controls en lugar de Components?

// Saludos
Responder Con Cita
  #6  
Antiguo 31-05-2012
Avatar de champy
champy champy is offline
Miembro
 
Registrado: sep 2003
Ubicación: Alicante, España
Posts: 75
Poder: 21
champy Va por buen camino
Otra idea que se me ocurre para que no tengas que hacer eso en cada fromulario que crées o que modifiques podría ser.

Paso1. Recorrer todos los componentes y guardarte el nombre de aquellos y su taborder

Paso2. Recorrer los componenetes elegidos por orden del Taborder guardado

Ahora mismo no veo claro el como hacerlo, pero el concepto no es complicado y puede ser una solución definitiva para todos tus forms.
Responder Con Cita
  #7  
Antiguo 31-05-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Exactamente roman, las propiedades Components y Controls están dispuestas por el órden cronológico de inserción.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #8  
Antiguo 31-05-2012
Avatar de Jere_84
Jere_84 Jere_84 is offline
Miembro
NULL
 
Registrado: sep 2011
Ubicación: Córdoba, Argentina
Posts: 214
Poder: 0
Jere_84 cantidad desconocida en este momento
Cita:
Empezado por champy Ver Mensaje
Otra idea que se me ocurre para que no tengas que hacer eso en cada fromulario que crées o que modifiques podría ser.

Paso1. Recorrer todos los componentes y guardarte el nombre de aquellos y su taborder

Paso2. Recorrer los componenetes elegidos por orden del Taborder guardado

Ahora mismo no veo claro el como hacerlo, pero el concepto no es complicado y puede ser una solución definitiva para todos tus forms.
Gracias, creo que el parámetro TForm no basta, quizás seria conveniente pasar el nombre del campo TField a validar y que los recorra hasta que encuentre este, mostrando el mensaje. La contra va a ser que la función se va a repetir dependiendo del numero de campos obligatorios que tenga el Form.

Slds.
Responder Con Cita
  #9  
Antiguo 31-05-2012
Avatar de champy
champy champy is offline
Miembro
 
Registrado: sep 2003
Ubicación: Alicante, España
Posts: 75
Poder: 21
champy Va por buen camino
Si quieres te paso un par de componentes que tengo por aquí y que hice hace bastante tiempo.

TAutoedit (TDBEdit).
TAutotable (TTable)
TAutoChackBox (TDbCheckbox)

Tiene varias peculiaridades que te pueden resultar útiles.

Hace NextDialog al hacer Intro.
Cambia de color al recibir el foco.
Cuando su DataSet trata de hacer Post o Insert y tiene la propiedad Nulable a FALSE, toma el foco y se pone de Color Rojo.

Es un componente muy simple pero muy utíl, yo lo gasto mucho.
Archivos Adjuntos
Tipo de Archivo: rar TAutoDB.rar (3,1 KB, 6 visitas)
Responder Con Cita
  #10  
Antiguo 31-05-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Jere_84 Ver Mensaje
¿como hacer para que recorra los componentes en el orden en como se presentan en pantalla?
A ver, este recorrido debería poder hacerse con FindNextControl, pero se me complica por el hecho de que este método se cicla en lugar de detenerse en el último control.

Pero esta rutina parece funcionar:

Código Delphi [-]
procedure RecorrerCampos(Formulario: TForm);
var
  Lista: TList;
  I: Integer;

begin
  Lista := TList.Create;

  try
    Formulario.GetTabOrderList(Lista);

    for I := 0 to Lista.Count - 1 do
      if TWinControl(Lista[i]) is TEdit then
         ShowMessage(TEdit(Lista[i]).Text);
  finally
    Lista.Free;
  end;
end;

// Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ayuda para validar un Dato de Tipo Boleano en funcion microbiano Varios 3 05-05-2012 08:16:39
Rutina para Validar Campos oscarac OOP 14 07-05-2011 10:16:18
validar campos.... chileno Conexión con bases de datos 2 27-05-2006 19:27:30
Función para validar datos numéricos simples en un Edit de INTRAWEB atirado Varios 0 14-05-2004 19:27:54
Funcion para validar IP Mauricio Correa Internet 7 01-10-2003 15:04:25


La franja horaria es GMT +2. Ahora son las 16:20:13.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi