PDA

Ver la Versión Completa : Problema al Pasar valores entre MDI Childs


MaMu
05-06-2007, 21:20:37
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:


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
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
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:


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:


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

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


with TMiFormMDIChild.Create(self) do
begin
show;
end;


Y lo cambie por


MiFormMDIChild := TMiFormMDIChild.Create(self);


Y lo solucioné.

Saludos y gracias a los dos.