Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Se puede acceder a un dbedit a través de su datasource o dataset? (https://www.clubdelphi.com/foros/showthread.php?t=3511)

CORBATIN 10-09-2003 04:05:03

Se puede acceder a un dbedit a través de su datasource o dataset?
 
Pues poco más que decir, el asunto lo dice prácticamente todo.

Código:

for datos := 0 to tabla.FieldCount-1 do
  if (tabla.Fields[datos].Required) and (tabla.Fields datos].Text  '')  then begin
  showmessage('Debe introducir un valor en '+ tabla.Fields  datos].DisplayName);
  exit;
 end;

Este es mi código, recorro todos los fields de la tabla y cuando encuentro alguno que este requerido y no esta escrito pues salto el mensage pero me gustaría que el dbedit que tiene ese campo asociado tomará el focus, de aquí mi pregunta, gracias por vuestra ayuda.

Julià T. 10-09-2003 05:09:15

prueba con
Código:

for datos := 0 to tabla.FieldCount-1 do
  if (tabla.Fields[datos].Required) and (tabla.Fields datos].Text  '')  then begin
  showmessage('Debe introducir un valor en '+ tabla.Fields  datos].DisplayName);
 dbgrigd.setfocus;
 dbgrigd.SelectedField:=tabla.Fields[datos];
  exit;
 end;


Ruben_Cu 10-09-2003 05:24:22

Hola CORBATIN, entiendo de tu pregunta que tus campos están asociados a DBEdit y no a un dbgrid por lo que creo que debes utilizar el for para recorrer las componentes y pasar si dse cumple que la componente es un DBEdit entonces utilizar la propiedad Field de este objeto para saber si el campo es requerido y si esta vacío y entonces aplicar el método SetFocus al dbedit en cuestión antes de salir.
Espero te sirva esta solución cuando la implementes.
Si no me supe explicar me lo dices a ver como me explico mejor.
Saludos

Julià T. 10-09-2003 20:03:46

Deberé aprender a leer antes de contestar.

CORBATIN 11-09-2003 01:01:53

Gracias por tú ayuda, pero había elegido este método debido a que es menos pesado recorrer los fields de una tabla o query que todos los componentes de un form, date cuenta que mientras en este ejemplo solo recorro 6 campos, en el form en realidad tiene que recorrer pues unos 20 componentes. No sé si en realidad recorrer todos los componentes de un form es tan pesado para el programa como pienso, pero creo que sería más rápido hacerlo a través de los fields de la tabla.

De todas formas te invito a que sigas aportando alguna otra idea, gracias.

Ruben_Cu 11-09-2003 01:15:05

Tienes razón debe demorarse más pero ¿cuanto mas? sobre esto existen criterios variados que andan por el histórico del foro.
Te sugerí esta solución porque no encuentro la manera de asociar el campo al dbedit, en cambio en sentido contrario sí.
Revisaré un poco a ver si encuentro algo pero... no se donde.
Veremos que pasa.
Saludos

Julià T. 11-09-2003 02:13:37

Una solución mixta puede ser llenar una lista de componentes asociados a los campos del dataset

Código:

//Definimos las variables y las funciones
 private
  Lista:TstringList;
  procedure CanvioFoco(NombreCampo:string);

//llenamos la lista con los objetos y los nombre del campo
//si hay diferentes dataset con nombres de campo igual se deberá cambiar un poco el código
procedure TForm1.FormCreate(Sender: TObject);
Var
 i:integer;
begin
 Lista:=TstringList.Create;
 For i:=0 to ComponentCount-1 do
  if Components[i] is TDbEdit then
  Lista.AddObject(TDbEdit(Components[i]).DataField,Components[i]);
end;

//en el código original añadimos tan solo una línea
for datos := 0 to tabla.FieldCount-1 do
  if (tabla.Fields[datos].Required) and (tabla.Fields datos].Text  '')  then begin
  showmessage('Debe introducir un valor en '+ tabla.Fields  datos].DisplayName);
//cambiamos el foco
  TDbEdit(Lista.Objects[Lista.IndexOf(tabla.Fields[datos].FieldName)]).setfocus;
exit;
 end;

//liberamos la lista al cerrar
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Lista.Free;
end;

si el código no es correcto ahora me tocará aprender a escribir

Ruben_Cu 11-09-2003 03:26:44

Hola Julià T., CORBATIN está evitanto los bucles y ahora le propones dos. Creo que con uno solo se logra, por supuesto recorriendo las componentes.
Bueno en un final el que decide es CORBATIN ;)
Saludos

CORBATIN 11-09-2003 03:33:12

Muchisimas gracias Julia es una solución muy buena pero al final he octado por la opción de de Ruben, es casi la misma que la tuya pero a diferencia no hace falta crear esa lista para introducir los dbedits que encuentra sino que directamente hace referencia a ellos, al final el código ha quedado así:

Código:

procedure TForm1.aceptar;
var
componente: integer;
Data:Tdataset;
begin
Data := nil;
for componente := 0 to ComponentCount - 1 do begin
 if Components[componente] is TDBedit then begin
  Data := (Components[componente] as TDBedit).DataSource.DataSet;
  if ( Data.Fields[componente].Required) and (Data.Fields[componente].Text = '') then begin
  showmessage('Debe introducir un valor en el campo '+ Data.Fields[componente].DisplayName);
  (Components[componente] as TDBedit).setfocus;
  Exit;
  end;
 end;
end;
Data.post;
Data.Free;
end;

Una última pregunta, es necesario hacer el free de la variable creada del tipo Dataset?

De nuevo gracias a los dos que habeis dado vuestras soluciones a este problemilla que había planteado, saludos.

jachguate 11-09-2003 09:04:00

Que tal.

No he seguido todo el hilo... pero he visto que la respuesta mas óptima no esta dada... y es que el TField tiene un método llamado FocusControl que hace precisamente lo que preguntabas al inicio, de manera que podes hacer un

Código:

for datos := 0 to tabla.FieldCount-1 do
  if (tabla.Fields[datos].Required) and (tabla.Fields datos].Text  '')  then
  begin
  showmessage('Debe introducir un valor en '+ tabla.Fields  datos].DisplayName);
  Tabla.Fields[Datos].FocusControl;
  exit;
 end;

La ventaja de llamar a este método, es que hara que el control asociado al Field tome el foco independientemente de si se trata de un Grid, un DBEdit, un DBLookupCombo, etc.

Por demás... creo que tu verificación no es necesaria, pues al intentar hacer un post, el mismo TDataSet hace algo similar para verificar los campos required.

Hasta luego.

;)

CORBATIN 11-09-2003 14:57:07

Esto es lo que yo buscaba, es la solución ideal pero que no había conseguido dar con ella.

Con respecto al último comentario que haces, decirte que tienes toda la razón, pero ese aviso que da el dataset por sí solo es en inglés y no deja el foco sobre el campo que esta sin rellenar, de estar forma el error es controlado por mí y le doy el foco al control que esta sin meter datos.

Gracias de nuevo a todos por vuestra colaboración, mi duda ha quedado solucionada, saludos.

Ruben_Cu 11-09-2003 18:29:03

Hola a todos, sin duda la solución de jachguate, es la ideal, ese es el método que no vimos. Por acá decimos que se puede mirar y mirar pero no ver.
Saludos


La franja horaria es GMT +2. Ahora son las 10:52:41.

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