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 asignar valor antes de visualizar el form (https://www.clubdelphi.com/foros/showthread.php?t=62658)

drykea 07-01-2009 12:54:35

Problema al asignar valor antes de visualizar el form
 
Hola a tod@s

Tengo un problema con un form.
Tengo un form MDIChild que llamo desde distintos sitios. Para distinguir desde donde lo llamo utilizo la propiedad tag del form, asignandole un valor distinto segun llamo al form.

Lo hago así:

Código Delphi [-]
Application.CreateForm(TfSalidas,fSalidas);
    with fSalidas do
      try
        tag:=1;  //Llamado desde form1
        show
      finally
    end;

Luego consulto el valor de la propidad tag y segun sea cambio los iconos de los botones (uso una toolbar) con el siguiente código:

Código Delphi [-]
if fSalidas.tag=0 then //llamado desde form2
    tbaccion.imageindex := 0  //tbaccion es el nombre del boton que quiero cambiar
  else                     //llamado desde form1
    tbaccion.imageindex := 2;

El problema es que ponga donde ponga este código no funciona, siempre me entra en la primera parte del if sin haber cambiado el valor del tag.

He probado en los eventos OnCreate, OnActivate y Onshow (Yo creo que tiene que ir aquí) pero no funciona en ninguno. Primero se ejecutan los eventos y luego se asigna el valor de la propiedad tag, por lo que no se me ejecuta bien el código.

¿Alguna sugerencia?

defcon1_es 07-01-2009 15:55:25

Prueba a quitar el with, o ponerlo así
Código Delphi [-]
Application.CreateForm(TfSalidas,fSalidas);
  try
    fSalidas.tag:=1;  //Llamado desde form1
    fSalidas.show;
  finally

end;

drykea 07-01-2009 17:12:50

Gracias por responder.

He probado lo que sugieres y nada.
Se ejecuta antes el evento OnShow que la asignacion de la propiedad tag.

Caro 07-01-2009 17:17:15

Hola, en el Onshow debería funcionarte, como te dice defcon1, al parecer se esta confundiendo con el Tag del form Actual, pero también podrías utilizar el Owner del formulario, osea su propietario solo cambiaría la forma en que estas creando el formulario.

Código Delphi [-]
  //Con Self, le decimos que el propietario es el formulario actual
  fSalidas:= TfSalidas.Create(Self);
  fSalidas.Show;

y cuando quieras saber el propietario solo preguntas por el Owner, lee este hilo http://www.clubdelphi.com/foros/showthread.php?t=62380 y otra parte que debes considerar es lo que dice el amigo Lepe en el mensaje 6 de ese mismo hilo.

Saluditos

drykea 07-01-2009 17:29:40

Otra vez, gracias por las respuestas.

He probado el código como ha dicho Caro:
Código Delphi [-]
fSalidas := TfSalidas.Create(Self); //Self nos indica el formulario actual
  try
      fSalidas.tag:=1;  //Llamado desde form2
      fSalidas.Show;
  finally
  end;

Y me da el error:
Código:

Project GestionArchivo.exe raised exception class EAccessViolation with message
 'Access violation at address 0046D308 in module 'GestionArchivo.exe'. Read of address 00000048'. Process stopped. Use Step or Run to continue.

¿Sabeís por qué?

Neftali [Germán.Estévez] 07-01-2009 17:51:22

Cita:

Empezado por drykea (Mensaje 333605)
El problema es que ponga donde ponga este código no funciona, siempre me entra en la primera parte del if sin haber cambiado el valor del tag.

El problema es que este código funciona perfectamente con un formulario de tipo "Normal", pero al ser un MDI con la propiedad Visible a True, ejecuta el Show directemente después del Create antes del show que has colocado tú.

Creo que la forma puede ser utilizando un evento del tipo AFTERSHOW y creárselo al formulario MDI. Aquí tienes un ejemplo de cómo hacerlo, aunque si buscas en los foros, también hemos hablado del tema.

Caro 07-01-2009 18:06:39

Hola de nuevo, es verdad pasa lo que indica Neftali sobre el form MDIChild y no me había dado cuenta, pero insisto no sería mas facil utilizar el Owner del formulario, ahora sobre el AccessViolation que te sale es porque estas tratando de acceder a un objeto que no ha sido creado, el codigo que te puse no debería darte error, ejecuta paso a paso e indicanos en que línea te sale el error, ahora si utilizas el Owner ya no necesitas asignar el Tag, directamente podrías hacer esto.

Código Delphi [-]
 if Self.Owner.Name='NombreFormularioPadre' then
  ...........

Saluditos

roman 07-01-2009 18:47:13

AfterShow :p

// Saludos

Neftali [Germán.Estévez] 07-01-2009 23:53:37

Cita:

Empezado por Caro (Mensaje 333660)
pero insisto no sería mas facil utilizar el Owner del formulario


Esa solución también es buena y debería funcionar.
Personalmente me gusta utilizar AFTERSHOW, ya que es útil para otras cosas, pero esta solución de Caro te permitirá hacerlo sin codificar nada de código extra.

Neftali [Germán.Estévez] 07-01-2009 23:54:56

Cita:

Empezado por roman (Mensaje 333666)

Gracias Román.
Ya sabía yo que habíamos hablado del tema. A este me refería.

drykea 08-01-2009 10:00:05

Hola otra vez.

El error me lo da justo al crear el formulario.

Estoy intentando probar lo del owner, pero es una propiedad que no he usado nunca, y estoy a ver si lo consigo.

Por otro lado, pregunta he estado viendo lo del aftershow, pero creo que no lo he entendido bien, no es un evento como tal ¿No?. ¿Tengo que definirlo yo? Podeís aclararme algo más sobre esto.

Neftali [Germán.Estévez] 08-01-2009 11:57:15

1 Archivos Adjunto(s)
Aquí te paso un ejemplillo, con ambas maneras de hacerlo. Utilizando el evento AfterShow para detectar diferente TAG (con el que se llama) y también poder detectar desde un formulario cual es el Owner de quien lo llama (en este caso dos posibles formularios o Application).
Supongo que el ejemplo será más clarificador.

Cita:

Empezado por drykea (Mensaje 333766)
El error me lo da justo al crear el formulario.
Estoy intentando probar lo del owner, pero es una propiedad que no he usado nunca, y estoy a ver si lo consigo.
Por otro lado, pregunta he estado viendo lo del aftershow, pero creo que no lo he entendido bien, no es un evento como tal ¿No?. ¿Tengo que definirlo yo?
Podeís aclararme algo más sobre esto.

En cuanto a porqué te está fallando lo del owner, sin ver el código es difícil saber qué está pasando. Compáralo con el del ejemplo a ver qué diferencias hay.

El el caso del AfterShow, lo que estamos haciendo en desde el propio Show del formulario (Román utiliza el evento OnShow, a mi me gusta más utilizar el DoShow) lanzar un mensaje a la cola de mensajes de Windows, que capturamos en el propio formulario. Con ese mensaje que capturamos ejecutamos el procedimiento AfterShow.

drykea 08-01-2009 12:04:00

Gracias, sigo probando ...

JoAnCa 08-01-2009 17:48:19

Y serviria usando el Sender del objeto que abre el formulario? :rolleyes:

Neftali [Germán.Estévez] 09-01-2009 10:46:20

Cita:

Empezado por Jose Caceres (Mensaje 333829)
Y serviria usando el Sender del objeto que abre el formulario? :rolleyes:

Supongo que te refieres al parámetro que llega an OnShow, pero en este caso ese parámetro es el propio formulario, así que creo que no serviría. :o

JoAnCa 09-01-2009 21:28:17

Bueno, tal vez no entendi bien la pregunta con lo del llamado de diferentes sitios.
Me imagino que es que lo abres con una opcion de menu o con un boton de una ToolBar
Si es asi, funciona usando el sender

Código Delphi [-]
  Application.CreateForm(TForm2, Form2);
  if Sender = Abrir1 then
    Form2.Label1.Caption:='Me abrieron con el Menu';
  if Sender = ToolButton1 then
    Form2.Label1.Caption:='Me abrieron con un Boton';
  Form2.Show;


En este caso lo hago cambiando el caption de un label, pero puede servir tambien para modificar cualquier objeto del formulario antes que se abra

Si los sitios desde donde mandas a abrir el formulario no son esos, entonces detallame mejor desde donde lo haces.
O donde esta la imagen que quieres cambiar? en form1 o en fSalidas

Caro 10-01-2009 03:11:40

Cita:

Empezado por Jose Caceres (Mensaje 334012)
Bueno, tal vez no entendi bien la pregunta con lo del llamado de diferentes sitios.
Me imagino que es que lo abres con una opcion de menu o con un boton de una ToolBar
Si es asi, funciona usando el sender


Código Delphi [-] Application.CreateForm(TForm2, Form2);
if Sender = Abrir1 then
Form2.Label1.Caption:='Me abrieron con el Menu';
if Sender = ToolButton1 then
Form2.Label1.Caption:='Me abrieron con un Boton';
Form2.Show;



O donde esta la imagen que quieres cambiar? en form1 o en fSalidas

Hola jose, drykea necesita el formulario desde donde a sido llamado fSalidas, ese formulario lo muestra desde diferentes formularios y el quiere saber desde donde ha sido llamado, por eso estaba asignando un valor al Tag de FSalidas según al formulario donde se hace el Show le da un valor, pero no le funcionaba por lo que ya ha comentado Neftali. Se ha dado dos soluciones con el Owner y con el AfterShow.

Sobre tu pregunta, la imagen que quiere cambiar esta en FSalidas que cambia según al formulario que lo llama.

Saluditos

Neftali [Germán.Estévez] 10-01-2009 11:03:11

Cita:

Empezado por Jose Caceres (Mensaje 334012)
En este caso lo hago cambiando el caption de un label, pero puede servir tambien para modificar cualquier objeto del formulario antes que se abra


El problema es que es ecódigo funciona como se espera con formularios normales. Si en el OnShow del formulario 2 colocas el código:
Código Delphi [-]
MessageDlg('Caption: ' + Form2.Label1.Caption, mtInformation, [mbOK], 0);

Verás que para cada opción aparece un caption diferente. Pero no así si son formularios MDI, ya que el OnShow se ejecuta directamente desde el create antes de poder hacer las asignaciones. Más bien el problema no es asignar los valores, sino en qué eventos "rescatarlos".

JoAnCa 10-01-2009 16:50:52

Ok, ahora si ya entiendo lo que quiere hacer el amigo drykea
Tengo que pensar un poco mas, en concreto es buscar en que evento poner el codigo para que funcione bien :rolleyes:

Neftali [Germán.Estévez] 12-01-2009 12:01:29

Cita:

Empezado por Jose Caceres (Mensaje 334091)
...en concreto es buscar en que evento poner el codigo para que funcione bien

Y para eso va perfecto el AfterShow, que comentábamos...:D:D:D


La franja horaria es GMT +2. Ahora son las 11:23:18.

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