| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Javi Invitado
|
Publicado: Mar 17 Sep, 2002 9:48 am Asunto: Posición de los formularios |
|
|
Hola!
Quiero hacer lo siguiente:
Al abrir las ventanas de mi aplicación decidir la posición donde aparecen. Y se me ha ocurrido asignar las propiedades Top y Left del formulario en el constructor del mismo.
Pues esto me da un AccessViolation chahci y si lo hago en el evento OnCreate también me da AccessViolation.
¿Qué tengo que hacer, y dónde?
Muchas gracias. |
|
| Volver arriba |
|
 |
Enrique Master


Registrado: 13 Ago 2002Mensajes: 261Ubicación: La Vila Joiosa (Alacant)
|
Publicado: Mar 17 Sep, 2002 5:47 pm Asunto: |
|
|
Hola, resulta extraño lo que dices. En mis aplicaciones suelo hacerlo, para ello tengo un archivo INI y en el FormCreate del Form principal ejecuto LeeFicheroIni(), lo que nunca me ha dado problemas.
¿Podrías escribir aquí el código que intentas usar? Quizá desvele algún problema distinto al que planteas. |
|
| Volver arriba |
|
 |
javi Invitado
|
Publicado: Mar 17 Sep, 2002 9:00 pm Asunto: suelo hacer esto... |
|
|
Tengo un mdiform principal con su menú y demás.
Desde cualquier item del menú del que quiera llamar a otra ventana hago lo siguiente:
try
{
NombreForm->Show();
}
catch(EAccessViolation &)
{
NombreForm = new TNombreForm(Application);
NombreForm->Show();
}
Esto lo hago porque quiero que solo se abra una ventana del mismo tipo, y si se vuelve a pulsar la misma opción de menú lo único que haría sería traer al frente la ventana elegida.
Para posicionar la ventana donde yo quiero simplemente puedo probar esto:
__fastcall TNombreForm::TNombreForm(TComponent* Owner)
: TForm(Owner)
{
//si no me equivoco esto es el constructor de la ventana
NombreForm->Top = 40;
NombreForm->Height = 40;
}
Pues esto me da un AccessViolation, y si pongo lo mismo en el OnCreate del formulario pues otro tanto.
No se que hacer... |
|
| Volver arriba |
|
 |
Javi Invitado
|
Publicado: Mar 17 Sep, 2002 9:14 pm Asunto: pequeño error en el código anterior |
|
|
Perdón, que me he equivocado en una cosilla
Donde pongo NombreForm->Height;
Quiero decir NombreForm->Left;
De paso decir que he probado a modificar de la misma manera la posición inicial del formulario principal, el MDIform y en ese el tema funciona perfectamente pero cuando se trata de un MDIChild la cosa ya no va.
A ver si podemos, por lo menos, encontrar las causas de esto...
Saludos
Javi. |
|
| Volver arriba |
|
 |
Enrique Master


Registrado: 13 Ago 2002Mensajes: 261Ubicación: La Vila Joiosa (Alacant)
|
Publicado: Mar 17 Sep, 2002 9:41 pm Asunto: |
|
|
Hola, esa es una de mis lagunas, los MDI.
Yo en vez de usar MDI trabajo con ventanas normales, las creo en el momento que sea necesario y las destruyo cuando no las necesito. En tiempo de diseño le pongo Visible = false. Cada vez que destruyo una me guardo en un INI el Top, Left, Height y Width y cada vez que las construyo leo esos datos, justo después del new. Y en vez de Show() simplemente pongo Visible a true.
Se me ocurre que pruebes a ponerlo en el event OnShow del MDIChild, o bien antes de usar NombreForm->Show();
También puede que tenga que ver con la propiedad Visible del MDIChild, me suena tener violaciones en mi PC alertando que no podía acceder a ciertas propiedades de una ventana oculta.
Suerte, y ya me contarás. |
|
| Volver arriba |
|
 |
Javi Invitado
|
Publicado: Mie 18 Sep, 2002 11:22 am Asunto: la maldita posición de los MDI :) |
|
|
Hola Enrique.
En el evento OnShow del formulario no puedo poner unos valores fijos a las propiedades Top y Left, porque si el usuario mueve la ventana y luego la tapa con otra y vuelve a la primera, ésta se desplazará a su posición inicial, y a los usuarios no les suele gustar mucho que las ventanas se les muevan solas
Tengo que probar a ponerlo entre la creación y el Formulario->Show() como dices, a ver si funciona, y si no, pues ya veremos como lo soluciono...
Un saludo. |
|
| Volver arriba |
|
 |
Javi Invitado
|
Publicado: Jue 19 Sep, 2002 9:30 am Asunto: Por fin... |
|
|
Hola!
Por fin algo que funciona!!
try
{
NombreForm->Show();
}
catch(EAccessViolation &)
{
NombreForm = new TNombreForm(Application);
NombreForm->Top = 50;
NombreForm->Left = 50;
NombreForm->Show();
}
La idea que me diste Enrique funciona, aunque, según la distancia a la que quieras colocarlo puede hacer un pequeño parpadeo.
Y si intento poner NombreForm->Hide() antes de asignar las posiciones me dice que un MDIChild no se puede ocultar.
Pero bueno, esto funciona, que es lo que importa...
Un saludo. |
|
| Volver arriba |
|
 |
masc Invitado
|
Publicado: Vie 20 Sep, 2002 7:25 pm Asunto: otra posible solucion |
|
|
una manera un poco fea, pero sencilla es esta:
-en el evento OnCreate de la ventana haces esto:
NombreVentana->Tag = 0;
-en el evento OnShow de la ventana haces esto otro;
if(NombreVentana->Tag == 0)
{
NombreVentana->Left = 50;
NombreVentana->Top = 50;
NombreVentana->Tag = 1;
} |
|
| Volver arriba |
|
 |
|