Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-08-2007
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Formularios

Hola a Todos

Quisiera saber de que formulario se ha hecho un showModal a otro formulario, digamos que tenemos Form1, Form2, Form3 y de los 3 llamo a Form4, lo quiero saber en Form4 es de donde ha sido la llamada si de Form1, Form2 o Form3, lo unico que se me ocurre es tener una variable en Form4 y segun al que haga la llamada se actualice esa variable. Existe alguna otra forma de hacerlo?

Muchisimas gracias por adelantado y que tengan un bonito dia
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #2  
Antiguo 08-08-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Antes del ShowModal, creas el formulario en el Form 'llamante' ??

Si es así, puedes utilizar la propiedad Owner del Form4 para saber quien lo creó, y por tanto, quien lo llamó.

Si no es así, entonces, a mi entender, tienes que utilizar alguna propiedad o variable del Form4 para indicar quien lo llama.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #3  
Antiguo 08-08-2007
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Dependiendo de la lógica podrías hacer que el owner sea el form de donde se ha mostrado en formulario en cuestion, creándolo justo antes de mostrarlo.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #4  
Antiguo 08-08-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Ejemplo desde los llamantes:

Código Delphi [-]
Application.CreateForm( TForm4,Form4);
Form4.Visualizar(Self);

Ejemplo del LLamado:
Código Delphi [-]
procedure TForm4.Visualizar(Sender: TObject);
begin
Label1.Caption := TForm(Sender).name ;
ShowModal;
end;

Saludos
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #5  
Antiguo 08-08-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

A mí lo primero que se me viene a la cabeza es declarar un método en los formularios que van a ser mostrados "modalmente". Tal que así:

Código Delphi [-]
interface

type
  TForm2 = class(TForm)
  private
    FCallForm: TCustomForm;
  public
    function ShowModal(callForm: TCustomForm): integer; overload;
  end;

implementation

function TForm2.ShowModal(callForm: TCustomForm): integer;
begin
  FCallForm := callForm;
  result := self.ShowModal();
end;

Con el método se matarían dos pajáros de un tiro, como se ve: se asigna a cierta variable privada una referencia al formulario que llama al método, y se ofrece como resultado de este el resultado del método "ShowModal" original.

Queda de tu cuenta añadir una propiedad pública al formulario, si es que lo ves menester. En todo caso... tal vez no sea muy "elegante" esto que propongo... a ver si alguien se anima con otras soluciones.

Edito: Iba a borrar mi mensaje, porque lo que dicen los compañeros (y que no se me había ocurrido) me parece mucho más digno e interesante. Pero, total, que se vea mi ignorancia, y además, tal vez pueda servir de algo lo que he dicho...
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 08-08-2007 a las 15:22:20.
Responder Con Cita
  #6  
Antiguo 08-08-2007
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Miles de gracias por responder gluglu, delphi.com.ar, ArdiIIa, dec.

He estado viendo sobre Owner en este momento porque no lo habia manejado, funciona como quiero pero al final cuando cierro mi formulario principal me sale un error

Para mi ejemplito, antes de hacer el showmodal le digo que form2 sera el propietario de form4 y lo mismo hago para form3

Código Delphi [-]
 form2.InsertComponent(Form4);
 form4.ShowModal;

y cuando quiero ver quien es el propietario lo hago asi

Código Delphi [-]
 if form4.Owner = form2 then
  showmessage('viene de formulario 2');

 if form4.Owner = form3 then
  showmessage('viene de formulario 3');

todo bien, me sale de donde viene la llamada, pero como decia antes cuando cierro el form1 que es el principal me sale 'Exception EAccessViolation in module Project1.exe at 00000000. Access violation at address 000000. Read of address 000000'

que estoy haciendo mal, me podrian ayudar por favor.
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #7  
Antiguo 08-08-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Cita:
Empezado por Caro Ver Mensaje

Código Delphi [-]
 form2.InsertComponent(Form4);
 form4.ShowModal;



todo bien, me sale de donde viene la llamada, pero como decia antes cuando cierro el form1 que es el principal me sale 'Exception EAccessViolation in module Project1.exe at 00000000. Access violation at address 000000. Read of address 000000'

No se... es la primera vez que veo un InsertComponent para visualizar un formulario.

¿Probaste el código que te puse antes?
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #8  
Antiguo 08-08-2007
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola ArdiIIa, no lo habia probado tu ejemplo lo siento, queria resolverlo con la propiedad Owner, pero creo que no lo he entendido bien, ahora si probe tu ejemplo me funciona muchisimas gracias, lo hare de esa forma.
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.

Última edición por Caro fecha: 08-08-2007 a las 16:14:47.
Responder Con Cita
  #9  
Antiguo 08-08-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Yo lo veo más fácil todavía ...

En tu form 'llamante' lo que tienes es que simplemente crear y mostrar modalmente el Form4 así :
Código Delphi [-]
Form4.Create(Self);
Form4.ShowModal;

Y donde lo necesites en el Form4, preguntas por el Form4.Owner.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #10  
Antiguo 08-08-2007
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola cuando creo mi formulario, lo hago de esta forma

Código Delphi [-]
 Application.CreateForm(TForm4, Form4);
 try
    Form4.ShowModal;
 finally
   Form4.Free;
 end;

de esta no lo habia hecho, al hacerlo asi me sale otro AccessViolation

Cita:
Empezado por gluglu Ver Mensaje
Form4.Create(Self);

Si me podrias explicar un poquito mas sobre Owner te estaria muy agradecida, espero no estar molestando mucho, pero no me queda claro lo del Owner.

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #11  
Antiguo 08-08-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Todo Formulario (o cualquier otro componente), al ser creado tiene su 'dueño' (Owner), que será aquel componente que lo crea.

Al ejecutar (perdón, fui demasiado rápido en el hilo mío anterior, y la versión correcta está qui debajo) :
Código Delphi [-]
Form4 = TForm4.Create(Self);
lo que estás indicando es que cree una instacia del Form4 y la almacene en la variable Form4. Al indicarle el parámetro 'Self', lo que estás indicando es que el dueño será el propio formulario 'llamante'. Self indica que es el propio formulario donde se ejecuta esa instrucción el que debe sustituir al propio parámetro Self, y por ello el propio formulario llamante se convierte en 'dueño' u Owner de la instancia Form4 que acabas de crear.

Si pusieras
Código Delphi [-]
Form4 = TForm4.Create(Application);
el 'dueño' u Owner de Form4 sería Application, es decir, el Formulario principal de tu aplicación.

Para qué sirve el 'dueño' u Owner ? Para liberar de memoria el elemento que se ha creado cuando se destruya el Owner, en caso de no hacer un Free explícito.

Si creaste Form4 con el parámetro Self (y pongamos por ejemplo que lo estás creando dentro de Form1), al hacer un Free de Form1, también se eleminaría automáticamente de memoria el correspondiente Form4.

Si lo hubieras creado con el parámetro Application, hasta no cerrar el formulario principal, es decir, hasta no cerrar la aplicación completa, tu instancia de Form4 no se liberaría de memoria.

A su vez, la propiedad Owner sirve precisamente para preguntar por quién fue llamado un Formulario (por ejemplo).

Si creas Form4 dentro de Form1 con :
Código Delphi [-]
Form4 = TForm4.Create(Self);
le indicas con Self que el Owner es Form1.

Aclaración : Podrías perfectamente poner
Código Delphi [-]
Form4 = TForm4.Create(Form1);
y el efecto conseguido sería el mismo ya que le indicas que el Owner de la instancia Form4 creada es Form1. A lo mejor así lo ves más directamente.

Para terminar, como el Form lo vas a mostrar Modalmente, personalmente me queda más claro que en el propio Form1 (en el ejemplo que estoy poniendo, al ser el que llama al Form4), se ejecute el Form4.ShowModal y no como lo ha indicado ArdiIIa, aunque sobre gustos no hay nada escrito.

En cualquier caso, hasta no salir de Form4 (al ser Modal), se continuará con la siguiente línea de código, independientemente si la has puesto dentro del propio Form4 (como indica ArdiIIa) o si has puesto el Form4.ShowModal en el propio form llamante, en nuestro caso el Form1.

Espero haberte servido con mi explicación.

Saludos
__________________
Piensa siempre en positivo !
Responder Con Cita
  #12  
Antiguo 08-08-2007
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Miles de gracias amigo gluglu, buenisima tu explicación, ahora si me funciona y esta entendido.

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.

Última edición por Caro fecha: 08-08-2007 a las 17:37:31.
Responder Con Cita
  #13  
Antiguo 08-08-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Cita:
Empezado por Caro Ver Mensaje
Miles de gracias amigo gluglu, ...


__________________
Piensa siempre en positivo !
Responder Con Cita
  #14  
Antiguo 08-08-2007
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Lo siento , nose porque desde que leia tus mensajes pense que eras mujer, ahora eso tambien esta claro .

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Formularios MDI CoCaInE OOP 6 25-12-2006 13:25:34
Formularios Caro Varios 5 14-07-2005 14:51:30
Formularios MDI mierteran Varios 1 03-12-2004 11:28:35
formularios seduerey API de Windows 0 05-07-2004 20:34:26
formularios mdi tango01 OOP 22 19-11-2003 16:27:34


La franja horaria es GMT +2. Ahora son las 07:52:37.


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
Copyright 1996-2007 Club Delphi