Ir al contenido


Foto

[RESUELTO] Frame que ejecuta metodo de Formulario padre.


  • Por favor identifícate para responder
16 respuestas en este tema

#1 yapt

yapt

    Member

  • Miembros
  • PipPip
  • 16 mensajes

Escrito 25 enero 2010 - 04:58

Hola a todos,

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.
  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 25 enero 2010 - 05:01

Pues todos los métodos, funciones y procedimientos del formulario padre debes declararlos en la Zona Public del Form padre en vez de Private y protected así podrás llamarlos desde el frame.

Saludos.
  • 0

#3 yapt

yapt

    Member

  • Miembros
  • PipPip
  • 16 mensajes

Escrito 25 enero 2010 - 05:03

Eso quiere decir que debo incluir el Formulario padre en el uses de la unidad del Frame ?
  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

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.
  • 0

#5 yapt

yapt

    Member

  • Miembros
  • PipPip
  • 16 mensajes

Escrito 25 enero 2010 - 05:09

Pero ese Frame, se va a utilizar en unos 80 formularios distintos.  No puedo incluir los 80 Formularios en el uses del Frame.

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.
  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 25 enero 2010 - 05:12

Pues te recomiendo realizar tus procedimientos y funciones en una Unidad aparte, así sólo agregas esa Unidad en el Frame, es una idea pues.
  • 0

#7 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 25 enero 2010 - 05:46

Saludos.

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.
  • 0

#8 yapt

yapt

    Member

  • Miembros
  • PipPip
  • 16 mensajes

Escrito 26 enero 2010 - 01:28

Yo habia pensado, más bien, en utilizar RTTI para averiguar el Formulario padre (del Frame) y los métodos a ejecutar de dicho formulario (siempre se llaman igual).

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.


  • 0

#9 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 26 enero 2010 - 01:48

Hola.

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.
  • 0

#10 yapt

yapt

    Member

  • Miembros
  • PipPip
  • 16 mensajes

Escrito 26 enero 2010 - 02:11

Hola Marc,

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.



delphi
  1. TFrame.Button1OnClick.....;
  2. var
  3.   Rutina : TMethod;
  4.   Exec  : TExec;
  5.   f        : TForm;
  6. begin
  7.   if (Parent is TForm) then
  8.     f := TForm(Parent);
  9.   Rutina.Data := Pointer(f);
  10.   Rutina.Code := f.MethodAddress('SegundoMetodoDelForm');
  11.  
  12.   if NOT assigned(Rutina.Code) then exit;
  13.   Exec := TExec(Rutina);
  14.   Exec; 
  15. end;



Pero algo falla porque siempre sale por el
  if NOT assigned() then exit;

Saludos.
  • 0

#11 yapt

yapt

    Member

  • Miembros
  • PipPip
  • 16 mensajes

Escrito 26 enero 2010 - 02:21

Solucionado....

El método al que llama, debe ser PUBLICADO... no PUBLIC.

Un saludo.
  • 0

#12 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 26 enero 2010 - 02:31

De todas formas era bastante chapucero.

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.
  • 0

#13 yapt

yapt

    Member

  • Miembros
  • PipPip
  • 16 mensajes

Escrito 26 enero 2010 - 02:35

También me serviria... 

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).


  • 0

#14 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 26 enero 2010 - 03:36

No veo porqué no deberías poder ejecutar un procedimiento en lugar de un método.

Simplemente defínelo como 'procedure' en lugar de 'procedure of object'. El resto sería igual a como te había comentado.

Saludos.
  • 0

#15 yapt

yapt

    Member

  • Miembros
  • PipPip
  • 16 mensajes

Escrito 26 enero 2010 - 03:40

Me refiero a "encontrarlo" y ejecutarlo (sobre todo a encontrarlo), desde el propio Frame.  Sin asignarlo en el form.

TObject.MethodAddress  No serviria (porque el metodo ya no pertenece al objecto, sino al interface de la unit).



  • 0

#16 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 26 enero 2010 - 05:04

No tengo ni idea de como podrías encontrarlo y ejecutarlo (aunque sospecho que no tienes forma de hacerlo, ya que no pertenece a ninguna clase, sino directamente a la Unit).

Lo que puedes hacer perfectamente es pasar el procedimiento que quieres ejecutar en un atributo del Frame, tal y como te he indicado.
  • 0

#17 yapt

yapt

    Member

  • Miembros
  • PipPip
  • 16 mensajes

Escrito 26 enero 2010 - 05:32

Así lo haré.

Gracias Marc.
  • 0




IP.Board spam blocked by CleanTalk.