Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-01-2009
drykea drykea is offline
Miembro
 
Registrado: abr 2007
Posts: 113
Poder: 18
drykea Va por buen camino
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?

Última edición por dec fecha: 07-01-2009 a las 13:55:23.
Responder Con Cita
  #2  
Antiguo 07-01-2009
Avatar de defcon1_es
defcon1_es defcon1_es is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuenca - España
Posts: 533
Poder: 21
defcon1_es Va por buen camino
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;
__________________
Progress Openedge
https://abevoelker.com/progress_open...dered_harmful/


Delphi forever...
Responder Con Cita
  #3  
Antiguo 07-01-2009
drykea drykea is offline
Miembro
 
Registrado: abr 2007
Posts: 113
Poder: 18
drykea Va por buen camino
Gracias por responder.

He probado lo que sugieres y nada.
Se ejecuta antes el evento OnShow que la asignacion de la propiedad tag.
Responder Con Cita
  #4  
Antiguo 07-01-2009
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, 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
__________________
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
  #5  
Antiguo 07-01-2009
drykea drykea is offline
Miembro
 
Registrado: abr 2007
Posts: 113
Poder: 18
drykea Va por buen camino
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é?
Responder Con Cita
  #6  
Antiguo 07-01-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.278
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por drykea Ver Mensaje
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #7  
Antiguo 07-01-2009
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 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
__________________
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
  #8  
Antiguo 07-01-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
AfterShow

// Saludos
Responder Con Cita
  #9  
Antiguo 07-01-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.278
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Caro Ver Mensaje
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #10  
Antiguo 07-01-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.278
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por roman Ver Mensaje
Gracias Román.
Ya sabía yo que habíamos hablado del tema. A este me refería.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #11  
Antiguo 08-01-2009
drykea drykea is offline
Miembro
 
Registrado: abr 2007
Posts: 113
Poder: 18
drykea Va por buen camino
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.
Responder Con Cita
  #12  
Antiguo 08-01-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.278
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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 Ver Mensaje
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.
Archivos Adjuntos
Tipo de Archivo: zip Ej AfterShow.zip (4,2 KB, 9 visitas)
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #13  
Antiguo 08-01-2009
drykea drykea is offline
Miembro
 
Registrado: abr 2007
Posts: 113
Poder: 18
drykea Va por buen camino
Gracias, sigo probando ...
Responder Con Cita
  #14  
Antiguo 08-01-2009
Avatar de JoAnCa
JoAnCa JoAnCa is offline
Miembro
 
Registrado: jul 2005
Ubicación: Cuba
Posts: 435
Poder: 19
JoAnCa Va por buen camino
Cool

Y serviria usando el Sender del objeto que abre el formulario?
__________________
La hora de acción no es hora de aprender, es necesario haber aprendido antes
Responder Con Cita
  #15  
Antiguo 09-01-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.278
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Jose Caceres Ver Mensaje
Y serviria usando el Sender del objeto que abre el formulario?
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #16  
Antiguo 09-01-2009
Avatar de JoAnCa
JoAnCa JoAnCa is offline
Miembro
 
Registrado: jul 2005
Ubicación: Cuba
Posts: 435
Poder: 19
JoAnCa Va por buen camino
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
__________________
La hora de acción no es hora de aprender, es necesario haber aprendido antes

Última edición por JoAnCa fecha: 09-01-2009 a las 21:47:59.
Responder Con Cita
  #17  
Antiguo 10-01-2009
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
Cita:
Empezado por Jose Caceres Ver Mensaje
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
__________________
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
  #18  
Antiguo 10-01-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.278
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Jose Caceres Ver Mensaje
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".
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #19  
Antiguo 10-01-2009
Avatar de JoAnCa
JoAnCa JoAnCa is offline
Miembro
 
Registrado: jul 2005
Ubicación: Cuba
Posts: 435
Poder: 19
JoAnCa Va por buen camino
Question

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
__________________
La hora de acción no es hora de aprender, es necesario haber aprendido antes

Última edición por JoAnCa fecha: 10-01-2009 a las 16:56:47.
Responder Con Cita
  #20  
Antiguo 12-01-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.278
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Jose Caceres Ver Mensaje
...en concreto es buscar en que evento poner el codigo para que funcione bien
Y para eso va perfecto el AfterShow, que comentábamos...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
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
Calcular un valor antes de guardar en una tabla FGarcia Varios 11 21-11-2007 05:22:07
Saber el valor auto_increment antes del insert cahosoft PHP 9 13-10-2006 09:46:47
Codigo antes de mostrar form - Maximizar lafirma Varios 20 03-08-2006 23:46:30
Asignar valor a un DBLOOKUPCOMBOBOX lucasarts_18 OOP 3 30-10-2005 23:35:21
Visualizar el valor de un autoincremental jbaleriola MySQL 3 23-06-2004 23:26:47


La franja horaria es GMT +2. Ahora son las 22:47:23.


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