Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Funcion para validar campos. (https://www.clubdelphi.com/foros/showthread.php?t=78985)

Jere_84 31-05-2012 18:43:09

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;

roman 31-05-2012 19:10:01

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

Jere_84 31-05-2012 20:39:51

Cita:

Empezado por roman (Mensaje 433973)
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.

champy 31-05-2012 21:10:06

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.

roman 31-05-2012 21:12:01

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

champy 31-05-2012 21:19:07

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.

ecfisa 31-05-2012 21:25:12

Hola.

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

Saludos.

Jere_84 31-05-2012 21:26:37

Cita:

Empezado por champy (Mensaje 433998)
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.

champy 31-05-2012 21:42:13

1 Archivos Adjunto(s)
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.

roman 31-05-2012 22:10:46

Cita:

Empezado por Jere_84 (Mensaje 433987)
¿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


La franja horaria es GMT +2. Ahora son las 11:24:37.

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