FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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;
__________________
No hay vientos favorables para quién no conoce su rumbo. |
#2
|
|||
|
|||
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; |
#3
|
|||
|
|||
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 |
#4
|
|||
|
|||
Deberé aprender a leer antes de contestar.
|
#5
|
|||
|
|||
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.
__________________
No hay vientos favorables para quién no conoce su rumbo. |
#6
|
|||
|
|||
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 |
#7
|
|||
|
|||
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; |
#8
|
|||
|
|||
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 |
#9
|
|||
|
|||
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; De nuevo gracias a los dos que habeis dado vuestras soluciones a este problemilla que había planteado, saludos.
__________________
No hay vientos favorables para quién no conoce su rumbo. |
#10
|
||||
|
||||
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; 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.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate Última edición por jachguate fecha: 11-09-2003 a las 09:06:14. |
#11
|
|||
|
|||
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.
__________________
No hay vientos favorables para quién no conoce su rumbo. |
#12
|
|||
|
|||
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 |
|
|
|