![]() |
Pasar un parametro en la llamada a un form
Desde un formulario MDIChild llamo a un formulario FsNormal
procedure TDecretos.NuevoClick(Sender: TObject); var EditDecretos:TEditDecretos; Begin EditDecretos:=TEditDecretos.Create(Self); EditDecretos.Modo:='A'; EditDecretos.Show; end; en donde tengo definida una variable Unit UEditDecretos; public Modo:Char; Sin embargo el segundo formulario no recibe el valor que le asigno en el formulario llamador. Alguien puede explicarme porque. |
No queda muy claro tu código, pero parece que Modo es una variable/campo de la clase TEditDecretos. Si es así, te garantizo que la clase TEditDecretos va a "recibir" el valor que le pases, solo tienes que tener cuidado en el momento que vas a utilizar este valor, ten en cuenta que no puede ser en el OnCreate, porque aún no se lo has pasado.
Saludos! |
Efectivamente, la variable modo pertenece al public de Edit Decretos, pero si en OnShow de EditDecretos hago un:
if Modo='A' then .... no me reconoce el valor de Modo. Ya he probado a ponerlo tambien en el onActivate pero tampoco. Supongo que el orden de ejecucion del formulario llamado sea: OnCreate OnShow OnActivate. |
La verdad que no puedo creer lo que tu dices, a mi parecer debes estar cometiendo algún error porque esta práctica es mas que habitual en la POO y funciona bien.
¿Te animas a postear tu código para que lo podamos evaluar? Saludos! |
En el fomulario que llama que es de tipo MDIChild
procedure TDecretos.NovoClick(Sender: TObject); var EditDecretos:TEditDecretos; Begin EditDecretos:=TEditDecretos.Create(self); with EditDecretos do begin Modo:='A'; Show; end; Grid.SetFocus; end; y en el formulario llamado que es de tipo fsNormal y donde tengo declarada como publica la variable Modo public Modo:Char; Procedure CargaOrd; Procedure CargaDecTip; end; hago en el on show procedure TEditDecretos.FormShow(Sender: TObject); begin if Modo='A' then begin LabelModo.Caption:='NUEVO'; SurceDecr.AutoEdit:=True; SurceDecr.AutoInsert:=True; QueryDecr.Open; QueryDecr.Append; QueryDecr.FieldByName('DECR_FECHA').AsDate:=now(); QueryDecr.FieldByName('DECR_A_USUARIO').AsString:= Datos.QueryUsu.FieldByName('USU_USUARIO').AsString; CargaOrd; QueryDecr.FieldByName('DECR_ORD').AsString:= QueryOrd.FieldByName('USU_USUARIO').AsString; CargaDecTip; QueryDecr.FieldByName('DECR_TIPO').AsInteger:= QueryDecTip.fieldByname('DECTIP_CODIGO').AsInteger; Texto.text:=QueryDecr.fieldbyName('DECR_TEXTO').AsString; end; E_Fecha.SetFocus; end; Y con esto, el formulario se visuliza un segundo y se cierra. Sin embargo, si hago la llamada como show modal, se visualiza bien. |
Solo unas aclaraciones
Sabes la diferencia entre show y showmodal? Con Show se muestra el formulario deseado, pero la ejecucion del form "padre" continua. Con ShowModal, se visualiza el formulario y la ejecucion del form "padre" se para hasta cerrar la ventana. Bien, vista esta aclaracion vamos a ver porque con Show funciona mal y ShowModal bien. Si te fijas, tienes una variable local, EditDecretos. Recordemos el ambito de las variables locales: estas SOLO estan "vivas" DENTRO del procedimiento o funcion donde son declaradas. Como hemos visto que con Show el form "padre" sigue la ejecucion de la aplicación.... pues llega a salir del procedimiento, por eso el form creado se destruye, porque se destruye la variable con la que lo creaste. Se ha entendido? :confused: Para crear un formulario no hace falta que declares esa variable. Puedes poner simplemente Código:
procedure TDecretos.NovoClick(Sender: TObject); Bueno, espero te sirva y quede algo mas claro el tema de las variables locales |
Gracias Cadetil, si, entiendo ahora lo de las variables locales. Si, al motraslo como modal ya veo que la variable modo recibe el valor que se le asigna. Ahora te explico lo que, en mi ignorancia, pretendía hacer:
Pretendía poder abrir varias versiones de formulario llamado (EditDecretos) y pensaba que si declaraba una variable y hacía varios create de ella podría tener en pantalla varias versiones de este formulario, cosa que no puedo hacer con ShowModal. |
Buenas,
Cadetill, me parece que te has colado. Es cierto que la visibilidad de la variable es local al procedimiento, pero no el objeto. Haciendolo tal y como postea apicito debería funcionar, el único problema es que pirde la referencia al form, pero éste no se detruye hasta que se llama explícitamente a free o se destruye su owner. Por otro lado estoy completamente deacuerdo con deplhi.com.ar, este método FUNCIONA y funciona siempre, estoy cansado de hacer cosas así. Estoy convencido que apicito esta cometiendo algún error en otra parte del código, pero no acierto a verlo. |
Hola:
Efectivamente, como comenta Marto, aunque se pierda la referencia a la variable local, el formulario sigue "vivo". Al haber sido creado pasándole como Owner el formulario actual (Self), se destruirá cuando éste se destruya, o bien en el OnClose de TEditDecretos ponemos lo de Action := caFree, y nos aseguramos de liberarlo. No veo por donde pueda venir el error, pero sería bueno que la variable EditDecretos : TEditDecretos definida localmente dentro del Button1Click que lanza el formulario, tuviera otro nombre, por ejemplo ED : TEditDecretos. Digo esto porque seguramente ya existe una variable con el nombre EditDecretos en la unit donde se declara este formulario. No sé si de ahí vendrá la confusión, pero pudiera ser que ese formulario, EditDecretos, perteneciera a los AutoCreate forms, y ya existiera, de modo que la asignación Modo := 'A' se realizara sobre el formulario ya creado, y no sobre el que estamos creando en ese momento. Esto es sólo una suposición, no estoy seguro del todo, porque Delphi debería dar prioridad a la variable local, pero podrías probar de hacer ese cambio que te comento. Saludos |
Cita:
|
Hola de nuevo:
Es extraño lo que te ocurre. ¿metes algún código que cause que se cierre el formulario nada más visualizarse?. No sé si estará relacionado con que lo lances desde un form MDIChild (aquí otros que han usado MDI seguramente lo podrán aclarar). Quizás sería bueno ver más parte del código (tranquilo que al menos por mi parte no lo distribuiré por ahí :) :) ). Otra cosa, acuérdate de meter el código entre las marcas code y /code, así aparecerá identado y más fácil de leer. Saludos |
Ya sé que nadie me va a copiar. Quizás cuando lleve 20 años con delphi se me ocurrirá algo original.
Código:
unit UDecretos; Código:
unit UEditDecretos; |
No veo donde consultas la variable modo... ¿No era en el OnShow?
|
Cita:
Eso me pasa por no leer me la respuesta antes de publicarla :p Tendre que leerme de nuevo la guia de estilo :D |
Cita:
Por lo que se refiere a la persistencia en pantalla del formulario llamado no acabo de entender como se puede conseguir sin utilizar el onshow, aunque mirando tu web en el ejemplo de formularios nietos he encontrado una solución, si no la que buscaba una que puede servir, que es asignarle al formulario EditDecretos como parent un panel del formulario Decretos, con lo que se visualiza dentro de él y no desaparece. Esto impide que las versiones que abro de EditDecretos se muevan por toda la pantalla pero es una solución, a falta de otra mejor. |
Hola:
Por lo que leo de tu mensaje último, el problema que tienes ahora es el de la persistencia en pantalla del formulario EditDecretos. ¿Has probado de pasarle el Parent del formulario Decretos?. Al ser éste del tipo MDIChild, quizás eso tenga algo que ver. Me estoy refiriendo a que le pases en el Create de EditDecretos el Form principal, el que hace de MDIParent, como parámetro. Y respecto al problema original, el de que reconozca la variable Modo, aunque lo hayas solucionado llamándola desde botones diferentes, ¿has hecho alguna prueba desde el OnShow de EditDecretos? Es para sacarnos de dudas, no quiero darte más trabajo, pero creo que a todos nos quedó la intriga de por qué eso no funcionaba. Saludos |
Otro parent que podrias pasarle es Application
|
Cita:
He probado poniendole como sender Application Cita:
Lo que son las cosas, ahora que he probado a ponerle como parent un panel del llamador me gusta como funciona. Me permite abrir varias versiones del formulario llamado, puedo cambiarme de uno a otro... osea lo que necesitaba. Lo digo para que no os molesteis más por mi problema. En todo caso, si quereis probar algo más, yo estoy dispuesto a aprender y a probar lo que me sugirais. Gracias a todos. |
La franja horaria es GMT +2. Ahora son las 08:34:13. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi