PDA

Ver la Versión Completa : Cómo obligo el ingreso de datos a todos los dbedits de un formulario?


bigpeter80
04-12-2008, 18:14:49
Hola amigos.... Necesito ayuda... Otra vez.... jeje

Mi problema es el siguiente: Tengo un formulario con 15 DBEdits, Quisiera saber cómo puedo hacer para obligar que se ingresen datos a todos...

He encontrado que con el evento OnKeyPress puedo lograr que se obligue la introducción de ciertos tipos de caracteres o números, por ejemplo:


procedure TbValAlimenticios.DBEdit2KeyPress(Sender: TObject; var Key: Char);
begin
if not (key in ['0'..'9',',',#8]) then
begin
key:=#0;
showmessage('Introduzca números')
end
end;


Con esto logro que el usuario deba introducir números del 0 al 9 y la coma; pero debo hacerlo por cada DBEdit de mi formulario.

Lo que necesito saber, es Si existe algún método en el que al guardar me muestre un mensaje en el que me diga que no se han ingresado todos los datos y no permita guardar estos datos hasta que no se hayan completado todos los campos.....

Desde ya muchas gracias por las sugerencias....

dec
04-12-2008, 18:23:38
Hola,

Un tema delicado, supongo, la entrada de datos en la aplicación. Por ejemplo, acaso no sea cuestión de validar sólo que existen datos, sino de que estos son válidos. Por no liar demasiado el asunto, sabe que el método que has copiado pueden compartirlo todos los "DBEdit", de modo que no tendrás que duplicarlo para cada uno de ellos.

Respecto de cuándo comprobar que todos los "DBEdit" están listos, no estoy muy puesto, y, tratándose de este tipo de controles, no me extrañaría que hubiera otras formas más elegantes de hacerlo. No obstante, suponiendo un botón que el usuario habrá de "pulsar" para guardar los datos, ese puede ser un buen momento para comprobar lo que quieres: el evento "OnClick" de dicho botón.

En ese punto puedes recorrer los "DBEdit" del formulario en cuestión (mediante la propiedad "Components" del formulario y otras como "ComponentCount" puedes hacer un "bucle" más o menos sencillamente) o puedes comprobarlos uno por uno. Sea como sea, igual otro compañero puede dar alguna otra idea menos rudimentaria, basada en las características "especiales" de los propios componentes "DBEdit", que, estoy seguro que alguna tendrán. O tal vez los correspondientes "DataSet" y componentes relacionados.

martinb
04-12-2008, 18:23:55
Hola, mira si no entendi mal tu problema hace lo siguiente:

En la propiedad before post de la tabla donde queres guardar los datos hace una sentencia if


If (ttablecampo1.isnull) or (ttablecampo2.isnull)or.......then
begin
showmesage('Complete todos los campos');
abort
end;


si queres detallar cuales campos quedaron sin completar tendrias que hacer un if por cada uno......

Espero te sirva.....

Saludos.....

Caral
04-12-2008, 18:41:11
Hola
Puedes hacer una prueba sencilla.
Coloca 3 edit y un boton en un form y pones este codigo al evento onclick del boton:

procedure TForm1.Button1Click(Sender: TObject);
var
i, j:Integer;
comp:TComponent;
begin
for i := 1 to 3 do begin
j := (i);
comp := FindComponent('Edit' + IntToStr(j));
If TEdit(comp).Text = '' then
begin
showmessage('Falta llenar el edit'+IntToStr(j));
end
else
// lo que sea
end;
end;
Corre el programa y deja un edit o varios en blanco.
Saludos

ContraVeneno
04-12-2008, 18:58:01
Yo le agregaría la función Trim... no vaya siendo que el usuario ponga espacios...

If Trim( TEdit(comp).Text) = '' then

dec
04-12-2008, 18:59:46
Hola,

Bueno, yo también quiero. :) Sobre todo para dejar claro que cuando antes hablaba de "Components" y "ComponentsCount", en realidad quería decir "Controls" y "ControlsCount". Por lo demás, el siguiente código intenta un objetivo muy parecido al que Caral ha escrito arriba:


procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
errors: string;
const
MSG_SEPARATOR = #13#13;
EMPTY_EDIT_MSG = '%s edit is empty';
begin
errors := '';
for i := 0 to EditsPanel.ControlCount - 1 do
begin
if (EditsPanel.Controls[i] is TEdit) then
begin
if (Trim(TEdit(EditsPanel.Controls[i]).Text) = EmptyStr) then
begin
if (errors = EmptyStr) then begin
errors := Format(EMPTY_EDIT_MSG,
[TEdit(EditsPanel.Controls[i]).Name]);
end else begin
errors := errors + MSG_SEPARATOR + Format(
EMPTY_EDIT_MSG, [TEdit(EditsPanel.Controls[i]).Name]);
end;
end;
end;
end;
if (errors <> EmptyStr) then begin
ShowMessage(errors);
end else begin
ShowMessage('All edits contain values');
end;
end;

Caral
04-12-2008, 19:02:42
Hola
Muy cierto, bien pensado.
Saludos

bigpeter80
04-12-2008, 19:15:37
Bueno, como siempre agradezco mucho la rápida respuesta de todos y voy a ir probando las sugerencias dadas por todos, a ver si puedo lograr mi objetivo....

Delfino
07-12-2008, 23:58:05
Puedes poner la propiedad Requiered del Field asociado al DBEdit a True, o bien por el inspector de objectos o bien :
DBEdit.Field:Required := True;