[RESUELTO] Frame que ejecuta metodo de Formulario padre.
#1
Escrito 25 enero 2010 - 04:58
estoy a vueltas con los frames. La pregunta es rápida (aunque quizá no sencilla).
Form1
+-> Frame1
1.- Necesito ejecutar métodos del Form1 (el formulario padre del frame).
2.- Necesito llamar a procedimientos/funciones del formulario padre. El nombre de la función será siempre el mismo, aunque no así el formulario padre evidentemente.
Alguna idea ? A mi se me han acabado.
Muchas gracias.
#2
Escrito 25 enero 2010 - 05:01
Saludos.
#3
Escrito 25 enero 2010 - 05:03
#4
Escrito 25 enero 2010 - 05:04
Eso quiere decir que debo incluir el Formulario padre en el uses de la unidad del Frame ?
Así es.
#5
Escrito 25 enero 2010 - 05:09
Precisamente, la organización es la contraria.
Formx : Tform
+---> FrameBotones TFrame
Es decir, es el FormX quien tiene al FrameBotones en sus uses.
Quiza no me he explicado bien.
Saludos.
#6
Escrito 25 enero 2010 - 05:12
#7
Escrito 25 enero 2010 - 05:46
Para realizar esta operación, a mí entender, debes de tener un formulario base de todos tus formularios donde va a residir tu Frame y que dicho método(s) esté declarado en el Base; así sólo tienes que poner en uso ese formulario base.
Claro esta como bien indica Enecumene debe de estar en la sección Public.
Una sugerencia, si este método debe de ser ejecutado por cada formulario de manera distinta osea que su implementación sea diferente por formulario declara ese método Abstract y sobrescribe en los hijos.
#8
Escrito 26 enero 2010 - 01:28
Así, desde el Frame, podria utilizar, de forma generica (es solo un pseudocodigo):
....Evento MiBoton del Frame....
if (parent is TForm) then
TForm(parent).findmethod('SegundoMetodoDelForm').execute; :-)
De este modo y desde el formulario padre, además, puedo llamar al evento de MiBoton, añadiendo (por delante y por detras) ejecución particular a ese formulario:
PrimerMetodoDelForm();
----MiFrame.MiBoton;
TercerMetodoDelForm();
Sigo buscando en este sentido.
Un saludo y gracias.
#9
Escrito 26 enero 2010 - 01:48
Si los métodos a declarar están en la sección public, ¿ no puedes hacer simplemente esto ? :
if (Parent is TMiForm1) then TMiForm1(Parent).SegundoMetodoDelForm
else if (Parent is TMiForm2) then TMiForm2(Parent).SegundoMetodoDelForm
else if (Parent is TMiForm3) then TMiForm3(Parent).SegundoMetodoDelForm;
O bien, si el método siempre se llama igual, esto quizás podría funcionar :
if (Parent is TForm) then (Parent as Parent.ClassType).SegundoMetodoDelForm;
Saludos.
#10
Escrito 26 enero 2010 - 02:11
con las dos metodologias me obliga a mantener TODOS los formularios en el uses del Frame.
Estoy buscando en este sentido (que no me obligaría a mantener los uses). El metodo se llama siempre igual, si.
TFrame.Button1OnClick.....; var Rutina : TMethod; Exec : TExec; f : TForm; begin if (Parent is TForm) then f := TForm(Parent); Rutina.Data := Pointer(f); Rutina.Code := f.MethodAddress('SegundoMetodoDelForm'); if NOT assigned(Rutina.Code) then exit; Exec := TExec(Rutina); Exec; end;
Pero algo falla porque siempre sale por el
if NOT assigned() then exit;
Saludos.
#11
Escrito 26 enero 2010 - 02:21
El método al que llama, debe ser PUBLICADO... no PUBLIC.
Un saludo.
#12
Escrito 26 enero 2010 - 02:31
Yo lo que hago es declararme un atributo, una variable pública (en el Frame) para contener el método que debe llamar. De esta forma el Frame no necesita saber nada sobre su formulario padre, solo tiene que llamar al método que tiene en esa variable. Ya solo queda que el formulario padre inicialice esa variable.
Es decir, en el frame declaro (al principio de todo, después del Uses) y antes del type del Frame.
type TMetodo = procedure of object;
Ahora en la sección public del Frame declaro una variable
Accion: TMetodo;
En el Create del Formulario Padre asigno esta variable a lo que quiero que ejecuto :
MiFrame.Accion := SegundoMetodoDelForm;
Y ahora en cualquier lugar del Frame ya puedes llamar a 'Accion', que en realidad va a ejecutar sobre el padre el metodo que le hayas asignado en cada caso.
NOTA: También puedes hacer llamadas con parámetros, solo tienes que definirlo correctamente en el tipo TMetodo.
Saludos.
#13
Escrito 26 enero 2010 - 02:35
Aunque como los metodos SIEMPRE se van a llamar igual, con la primera metodologia, me ahorro la "inicialización" en el formulario padre.
Una nueva cuestión sobre el mismo asunto.
¿ Es posible ejecutar un procedure/funcion, sin que este esté dentro de un objeto ?
Me refiero a ejecutar un procedimiento situado en el interface, pero fuera del Form (desde fuera del propio form, por supuesto).
#14
Escrito 26 enero 2010 - 03:36
Simplemente defínelo como 'procedure' en lugar de 'procedure of object'. El resto sería igual a como te había comentado.
Saludos.
#15
Escrito 26 enero 2010 - 03:40
TObject.MethodAddress No serviria (porque el metodo ya no pertenece al objecto, sino al interface de la unit).
#16
Escrito 26 enero 2010 - 05:04
Lo que puedes hacer perfectamente es pasar el procedimiento que quieres ejecutar en un atributo del Frame, tal y como te he indicado.
#17
Escrito 26 enero 2010 - 05:32
Gracias Marc.