Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema al Pasar valores entre MDI Childs (https://www.clubdelphi.com/foros/showthread.php?t=44404)

MaMu 05-06-2007 21:20:37

Problema al Pasar valores entre MDI Childs
 
Hola, tengo dos formularios MDIChild abiertos, en uno, escribo un dato, y en el evento y antes de cerrar me gustaria pasarle ese valor al otro form. Pero cuando lo intento me tira error. (ambas units estan declaradas como uses dentro del implementation)

Pongo un ejemplo:

Código Delphi [-]
MDIChild1.Button1Click(Sender: TObject);
begin
  Edit1.text:='HOLA';
  MDIChild2.Edit1.Text:=Edit1.Text;
  Close;
end;

Como podria hacer para pasarle un dato?

Saludos

maeyanes 05-06-2007 21:23:28

Que error te "tira"? Cual es el texto del error?


Saludos...

MaMu 05-06-2007 21:26:01

Cita:

Empezado por maeyanes
Que error te "tira"? Cual es el texto del error?


Saludos...

Este:

Access violation at address 004FE904 in module "Project1.exe". Read of address 00000358

Saludos

maeyanes 05-06-2007 21:32:11

Checa este hilo: http://www.clubdelphi.com/foros/showthread.php?t=44375

Ahí se da una posible solución a tu problema...



Saludos...

MaMu 05-06-2007 21:42:29

Cita:

Empezado por maeyanes
Checa este hilo: http://www.clubdelphi.com/foros/showthread.php?t=44375

Ahí se da una posible solición a tu problema...
Saludos...

Lo lei, pero no me queda claro como implementarlo, ya que mis dos forms estan abiertos como SHOW, y no como SHOWMODAL.
Y me pasa solo con estos 2 forms MDIChild, porque con los normales no tengo problema alguno.

Saludos.

maeyanes 05-06-2007 23:13:58

Aquí te pongo otro hilo donde se trató el tema:

http://www.clubdelphi.com/foros/showthread.php?t=28405


Saludos...

MaMu 05-06-2007 23:51:47

Resulta que despues de todo, no me funciona, me sigue saliendo el mismo error.
Yo tengo los dos forms creados y abiertos.
Lo que necesito, es pasar un dato que esta en un DBGrid de uno de los formularios a un ComboBox del otro formulario.
EL formulario que se crea primero, es el que contiene el ComboBox, y es en donde defino lo siguiente:

Código Delphi [-]
TAltas = class(TForm)
...
...
 private
    { Private declarations }
     FIniciales: string; 
  public
    { Public declarations }
      property FPIniciales: String read FIniciales write FIniciales;
  end;

El el otro form, que se crea luego (desde Altas), hago lo siguiente:

Código Delphi [-]
procedure TBuscar.DBGrid1DblClick(Sender: TObject);
begin
   Altas.FPIniciales:='HOLA';
   Close;
end;

Y me sigue tirando el mismo error, incluso si leo la propiedad desde Altas (donde esta definida) me aparece vacia. Que estoy haciendo mal? me tiene todo parado esto.

Saludos y Gracias

MaMu 06-06-2007 04:30:05

Todo lo que pruebo, me tira el mismo error. Al parecer, con los MDIChild, al ultimo form que se apunta es el ultimo creado, y al salir de este, todo se destruye, a excepcion de haber salvado un dato en una propiedad publica del formulario principal. Que raro que los MDIChil funcionen asi. No se cual sera la solucion que necesito.

Saludos.

vtdeleon 06-06-2007 04:52:53

Saludos
Cita:

Lo lei, pero no me queda claro como implementarlo, ya que mis dos forms estan abiertos como SHOW,
Puedes omitir esa linea, pues los MdIChild se muestra al momento de crearlos.

Cita:

Hola, tengo dos formularios MDIChild abiertos, en uno, escribo un dato, y en el evento y antes de cerrar me gustaria pasarle ese valor al otro form. Pero cuando lo intento me tira error. (ambas units estan declaradas como uses dentro del implementation)
He creado 3 formularios (rapidos); 1 MDIForm y 2 MDIChild, estos dos ultimos con un Edit cada uno. Hice lo que citas y me ha funcionado de maravilla, usando en OnCloseQuery del formulario que se cerrará.

Lo tiros andan por ahí o estoy perdido?

MaMu 06-06-2007 06:37:31

Cita:

Empezado por vtdeleon
Saludos
Puedes omitir esa linea, pues los MdIChild se muestra al momento de crearlos.

He creado 3 formularios (rapidos); 1 MDIForm y 2 MDIChild, estos dos ultimos con un Edit cada uno. Hice lo que citas y me ha funcionado de maravilla, usando en OnCloseQuery del formulario que se cerrará.

Lo tiros andan por ahí o estoy perdido?

Me podrias poner el código? hice todo de nuevo, algo rapido, y me sigue sin funcionar.

Saludos

Monchi 06-06-2007 17:44:09

Yo no lo probe pero se me ocurre ahora:
Por que no pones una clase que pertenezca al MDI que la creas al iniciar la aplicacion, a la que puedan acceder estos 2 forms, y vas actualizando las variables en esta clase, y luego en los eventos OnActivate de los forms lees estas variables y haces las actualizaciones que correspondan en dichos forms.
Es una idea, no estoy seguro que pueda funcionar bien del todo.
Saludos

MaMu 06-06-2007 19:33:36

Monchi, si, no es una mala idea ni mucho menos descabellada. Creando una clase en el MDIForm y que los MDIChild accedan a ella, y luego al notar un cambio, se actualicen donde deba, funciona, pero son tantos los datos que tengo que pasar, que se hace extremadamente engorroso. Intento buscar una forma mas sencilla.

Saludos

vtdeleon 06-06-2007 19:34:55

1 Archivos Adjunto(s)
Cita:

Me podrias poner el código? hice todo de nuevo, algo rapido, y me sigue sin funcionar.
Es algo muy simple, lo que si debes asegurarte es que el formulario que recibira el dato debe estar creado, sino es asi, es seguro qe te arrojará un error.

Hay está lo que hice!

MaMu 06-06-2007 19:42:08

vtdeleon gracias por tomarte la molestia. Funciona perfecto lo que me mandaste, pero... es indistinto que MDIChild puede pasar un dato si estan creadas las dos?, en mi caso, abriria Form2, y desde Form2 abriria Form3, al cerrar Form3, le pasaria un dato a Form2. Cuando digo abriria, me refiero a crearia.

Saludos

Lepe 06-06-2007 20:07:17

Debes revisar conceptualmente la comunicación entre las ventanas MDICHILD.

La única forma de que consigas lo que buscas es mostrando las ventanas modalmente, pero una ventana mdichild no puede mostrarse de forma modal. Son dos esquemas de funcionamiento distinto.

En entornos MDI, una ventana se destruye de memoria cuando se cierra, aunque el comportamiento por defecto en delphi es minimizarse... tú decides.

Se supone que en un entorno MDI, puedes cambiar de una ventana a otra con un clic, así que, supongamos que el usuario hace lo siguiente:
- Abre el form2
- Abre el form3
- CIERRA el form2
- Cierra el form3

Si al cerrar las mdichild se minimizan, no tendrás problemas, pero si las destruyes, obtendrás un Access violation porque Form3 estará intentando acceder a Form2, pero esa ventana ya no existe en memoria.

Existen métodos para que al cerrar una ventana, se notifique a otra de ese evento, si te interesa, busca en el foro por "FreeNotification"

Saludos

vtdeleon 06-06-2007 20:33:04

1 Archivos Adjunto(s)
Cita:

Empezado por mamu
abriria Form2, y desde Form2 abriria Form3, al cerrar Form3, le pasaria un dato a Form2.

Ejemplo textual...
Saludos

MaMu 07-06-2007 02:20:33

Cita:

Empezado por Lepe
Debes revisar conceptualmente la comunicación entre las ventanas MDICHILD.

La única forma de que consigas lo que buscas es mostrando las ventanas modalmente, pero una ventana mdichild no puede mostrarse de forma modal. Son dos esquemas de funcionamiento distinto.

En entornos MDI, una ventana se destruye de memoria cuando se cierra, aunque el comportamiento por defecto en delphi es minimizarse... tú decides.

Se supone que en un entorno MDI, puedes cambiar de una ventana a otra con un clic, así que, supongamos que el usuario hace lo siguiente:
- Abre el form2
- Abre el form3
- CIERRA el form2
- Cierra el form3

Si al cerrar las mdichild se minimizan, no tendrás problemas, pero si las destruyes, obtendrás un Access violation porque Form3 estará intentando acceder a Form2, pero esa ventana ya no existe en memoria.

Existen métodos para que al cerrar una ventana, se notifique a otra de ese evento, si te interesa, busca en el foro por "FreeNotification"

Saludos

Segui tu sugerencia y lei un poco, que no viene nada mal. Solucione mi problema de la siguiente manera:

yo hacia

Código Delphi [-]
with TMiFormMDIChild.Create(self) do
    begin
        show;
    end;

Y lo cambie por

Código Delphi [-]
MiFormMDIChild := TMiFormMDIChild.Create(self);

Y lo solucioné.

Saludos y gracias a los dos.


La franja horaria es GMT +2. Ahora son las 21:19:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi