Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Posición de los formularios

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Posición de los formularios Responder citando

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
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: suelo hacer esto... Responder citando

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
Mensaje    Asunto: pequeño error en el código anterior Responder citando

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
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: la maldita posición de los MDI :) Responder citando

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 Wink

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
Mensaje    Asunto: Por fin... Responder citando

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
Mensaje    Asunto: otra posible solucion Responder citando

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
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.