![]() |
recorrer lista de controles hijos.
Hola a todos,
Tengo una duda. Habitualmente, cuando diseño una aplicación (suelen ser todas más o menos parecidas, de gestión, consultas a bases de datos y cosas así, no demasiado rebuscadas), suelo poner el formulario principal maximizado, y después ir construyendo las distintas secciones del programa en distintos frames. Cuando se selecciona una opción del menú se esconden todos los frames y despues se hace visible el que corresponda. Esto me obliga a que en todos mis programas tengo que hacer una rutina de esconder_frames que es una pesadez: frame1.hide; frame2.hide; ..... frame95.hide; Cuando selecciono una opción del menu, hago: escodertodos; frameN.init; y en el frameN he definido el procedimiento init, donde hago un self.show; A parte, en ese procedimiento de inicio, que utilizo para cargar datos, si hacen falta, cargar opciones de combos, cosas así, suelo incluir también una rutina de limpiar_campos, donde tengo que recorrer todos los controles del frame haciendo: Edit1.text := ''; Edit2.text := ''; ... Edit99.text := ''; Es muy repetitivo y una pesadez. Me preguntaba si no habrá alguna forma de otorgar un valor a una propiedad de un conjunto de controles del mismo tipo.En realidad me bastaría con saber como recorrer una lista de controles hijos.. así para hacer el esconder todos, podría ir recorriendo la lista desde el formularioprincipal y hacer if tipocontrol(control)=Tframe then control.hide o en el init de cada frame, poder hacer if tipocontrol(control)=Tedit then control.text := ''; Espero haberme explicado bien. En realidad se puede resumir todo esto en que me gustaría saber si existe una forma de poder ir recorriendo todos los controles que están dentro de un formulario, un frame, o un groupbox.. sin tener que recurrir al nombre de cada control. Gracias y un saludo. |
Prueba con esto para los edits
Lo mismo lo puedes aplicar para los Frames. |
Realmente no tienes que esconder todos los frames cada vez, sino únicamente el que estuviere visible al momento de activar otro. Una solución podrías ser la de llevar una variable
que apunte al frame activo. Cuando muestres un frame pondrías algo como:
// Saludos |
solución parcial.. una vuelta de tuerca más..
Encontré la solución haciendo lo siguiente:
Código:
procedure TFrameClientes.limpiar_detalle; Que no lo tenga que escribir para cada frame.. sino que el frame fuera un parámetro y poder llamar al procedimiento como: limpiar_detalle(FrameClientes1); ¿Alguien sabe cómo? Salu2 |
Con el código que te di mas arriba, lo puedes hacer. El procedimiento capta un parametro de la clase TFrame.
|
Una pregunta,...Por qué no destruyes el Frame? antes de llamar al próximo.
|
lo encontré!!
Al final resultó ser una chorradilla...
Creé un fichero (suelo crearlo para meter en él todos los procedimientos "reutilizables") llamado unitFunciones que de momento solo contiene ésto: Código:
unit UnitFunciones; La llamada la hago desde el init de cada uno de los frames, haciendo: Código:
limpiar_detalle(FormPrincipal.FrameClientes1); Si me hubiera puesto a investigar esto antes.. cuántas horas de trabajo me había ahorrado... El ultimo programa que hice tenía unos 20 frames, y limpiaba los campos uno a uno!!!.. no se cuantas líneas de código.. pero una burrada.. bueno, de los errores se aprende. Gracias a todos. |
Cita:
Salu2 |
Cita:
Salu2 |
Joer.. Román.. como leches no he caido antes!!!.. si es que aún soy muy novato... en fin, muchas gracias de nuevo (utilizaré una variable de FrameActivo).
Nota: No os cuento la porrada de veces que he escrito un procedimiento para esconder todos los frames, porque me da vergüenza. :) Saludos y gracias. |
Ya puestos a trabajar de la forma de roman, se podría hacer algo más automático:
Con este rollo, a partir de ahora solo tienes que hacer: y listo, se oculta el que se estaba viendo y se muestra el nuevo. Saludos |
Hola Lepe,
Gracias por tu respuesta, pero.. no es enrevesar demasiado las cosas?? No alcanzo a ver la ventaja de lo que propones.. aunque seguramente es porque no tengo conocimientos suficientes. Aprovecho para ampliar mis horizontes y preguntarte por el código siguiente que has puesto en tu respuesta: Código:
public Gracias de nuevo y un saludo. |
Me equivoqué en esa línea, debería decir:
Eso significa que cuando vamos a leer (read) la propiedad FrameActivo, en realidad se lee la variable FFrameActivo, típico en este caso:
Y cuando se va a escribir (write) en esa variable, Ejemplo: Se ejecutará el procedimiento SetFrameActivo, con lo cual, podemos realizar otras operaciones. Además, como ese procedimiento lleva un parámetro, podemos saber si FFrameActivo ya tenía asignado el Frame1, el Frame2, o cualquier otro. En el código delphi anterior, el parámetro "Value" será el valor que queremos asignar, es decir "Frame1". Fíjate que antes de mi mensaje, tú tendrías que hacer lo dicho por roman, 3 líneas de código:
A partir de ahora, es sólo una línea de código:
Mira cualquier unidad de delphi con clases, y verás que trabaja así internamente, es decir, no estoy inventando nada nuevo ;). Saludos |
La franja horaria es GMT +2. Ahora son las 12:53:23. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi