PDA

Ver la Versión Completa : Problemas con StatusBar


aguml
04-06-2013, 09:42:42
Pues no se que pasa que he puesto un codigo para que algunos elementos del Form se redimensione dependiendo del tamaño del form y va todo bien pero si maximizo la ventana y luego la restauro pues desaparece la statusbar. Si redimensiono o maximizo todo va bien pero si doy a restaurar la ventana ya desaparece. Este es el codigo:

void __fastcall TForm1::FormResize(TObject *Sender)
{
//Aqui hacemos que CheckListBox se ajuste al tamaño del formulario
CheckListBox->Height = Form1->Height - CheckListBox->Top - 40 - StatusBar1->Height;

//Aqui hacemos que el tamaño del Image se ajuste al cambiar el tamaño de la ventana
ScrollBox->Width = Form1->Width - ScrollBox->Left - 15;
ScrollBox->Height = Form1->Height - ScrollBox->Top - 40 - StatusBar1->Height;
}

ozsWizzard
04-06-2013, 12:23:55
¿Comentando ese trozo de código la StatusBar se comporta de distinta forma?

¿Cómo está anclada la StatusBar, si es que lo está?

¿Has probado a modificar el tamaño y la posición de la StatusBar en el FormResize?

Son preguntas retóricas, aunque me interesaría la respuesta de la primera. Mira a ver si algo de lo que te digo te sirve para algo. Un saludo.

aguml
04-06-2013, 13:50:29
perdona pero no se que es retorica jejeje. Sobre lo que dices, si comento las dos lineas que modifican el alto de los dos componentes que modifico en el resize, ya funciona correctamente la syatusbar. Anclada no se, yo la añadi pulsando en ella y haciendo clic en el form y esta modifica su ancho al cambiar el ancho del form. Sobre cambiarlo de posicion no lo he probado pero es que yo lo quiero abajo. Sobre modificar la statusbar en resize, pues he probado a llamar a statusbar->show(), statusbar->refresh(), modificar el texto del panel y nada, no se soluciona.

ozsWizzard
04-06-2013, 19:08:34
Una pregunta retórica es una pregunta que no busca respuesta, estas preguntas eran más que nada para que pensaras sobre las respuestas.

Bien, siguiente paso.

La StatusBar, por defecto, se ancla (Anchors) a la parte inferior de la pantalla, a la parte izquierda y a la parte derecha (akLeft := True, akRigth := true, akBottom := true) por eso cuando el formulario cambia de tamaño esta también lo hace.

Solamente se me ocurre que algún componente la esté tapando o que realmente no se comporte correctamente, cosa que se me hace rara cuanto menos. Yo probaría a ver los valores Left, Top, Width y Heigth del StatusBar en el FormResize, por si acaso. En cualquier caso, siempre podrás asignarles los que tú quieras, por ejemplo:


StatusBar1->Left = 0;
StatusBar1->Width = Form1->Width - X;
StatusBar1->Heigth = Y;
StatusBar1->Top= Form1->Hegth - StatusBar1->Heigth - Z;


X = Resto longitud Form. El tamaño del formulario siempre es un poquito más grande de lo que necesita un componente para ir de punta a punta, esta variable debería de valer el sobrante de la longitud.
Y = Altura que se desee para el StatusBar. Esta no debe de hacer falta, no creo que la altura que se ponga en tiempo de diseño cambie.
Z = Resto altura Form. Lo mismo que la X pero con la altura.


Por último, una burrada. Mira a ver que no haya ninguna parte del código que esté poniendo la propiedad visible a false.

Saludos

aguml
04-06-2013, 21:24:22
Pues he estado mirando las indicaciones que me diste y para ello he colocado un Edit y en el muestro el Top, Height, Left, y Width y hay algo muy raro. Cuando maximizo y luego restauro se restaura a su tamaño original pero mira los resultados:

Al iniciar: Left: 0 Width: 617 Top: 381 Height: 19
Al maximizar: Left: 0 Width: 1265 Top: 521 Height: 19
Al restaurar: Left: 0 Width: 1258 Top: 515 Height: 19

El Width y el Top cambian y por eso no se ve, porque queda debajo de otros componentes. ¿por que se descompensan al restaurar?
El Anchor tengo Top = false, Width = true, Height = true, Botton = true. Si cambio el Top a true no hace lo que me gustaria ya que me hace la barra mas ancha al maximizar.
He probado a anclar la barra en la parte superior y ahi no falla.
¿como puedo solucionar esto?

aguml
04-06-2013, 22:04:02
Lo he solucionado poniendo Align = alNone, todos los Anchors en false y luego esto:

void __fastcall TForm1::FormResize(TObject *Sender)
{
//Aqui hacemos que CheckListBox se ajuste al tamaño del formulario
CheckListBox->Height = Form1->Height - CheckListBox->Top - 40 - StatusBar1->Height;

//Aqui hacemos que el tamaño del Image se ajuste al cambiar el tamaño de la ventana
ScrollBox->Width = Form1->Width - ScrollBox->Left - 15;
ScrollBox->Height = Form1->Height - ScrollBox->Top - 40 - StatusBar1->Height;
StatusBar1->Left = CheckListBox->Left;
StatusBar1->Top = Form1->Height - StatusBar1->Height - 35;
StatusBar1->Width = Form1->Width - StatusBar1->Left - 15;
}

No creo que sea lo mas correcto pero funciona aunque desaparece el dibujito ese que son rallitas en la parte derecha de la barra. ¿Es un bug del builder lo que me pasaba? ¿se puede solucionar sin tener que meterle los valores a fuego?

ecfisa
05-06-2013, 01:34:35
Hola aguml.

Me gustaría poder ver un esquema (o imágen) de como están situados los componentes en el form y como desearías que se redimensionen.

Saludos. :)

aguml
05-06-2013, 11:24:33
Te pongo dos imagenes a ver si te pueden aclarar un poco.

En ejecución:

http://img4.imageshack.us/img4/3897/esquema1u.jpg (http://imageshack.us/photo/my-images/4/esquema1u.jpg/)

En diseño:

http://img41.imageshack.us/img41/5105/esquemaenmododiseo.jpg

ecfisa
05-06-2013, 12:28:25
Hola.

Te adjunto una muestra de lo que considero la forma mas sencilla de realizarlo. Las alineaciones las hago en tiempo de ejecución para que sea mas claro, pero se pueden hacer en tiempo de diseño sin problemas.

Si no te sirviera de este modo, ya veremos si le podemos buscar la vuelta por otro lado...

Saludos. :)

aguml
05-06-2013, 16:31:59
Asi va de maravilla pero tiene un pero y que para mi es muy molesto, los bordes de los paneles que no se pueden quitar. O sea, entre panel y panel hay una linea que se ve feo. Ademas, el CheckBoxList al alinearlo al cliente se pega al lado derecho y no deja despegarlo un poco del lado derecho y del lado izquierdo.

aguml
05-06-2013, 17:06:20
Lo he conseguido, ha quedado fenomenal asi, y si que he podido trabajarme los bordes para separar de los lados y que no se vean los bordes de los paneles toqueteando en las propiedades de los paneles jejeje. Muchas gracias. Y sin tener que hacer calculos como yo hacia en tiempo de ejecucion. ¡Genial!

ecfisa
05-06-2013, 17:17:42
Hola aguml.

Revisá si con estas modificaciones te sirve.

Saludos. :)

Edito: No había visto tu mensaje, me alegro que lo solucionaras.;)
De todos modos, tal vez te pueda interesar revisar el uso de un TSplitter para redimensionar la imágen verticalmente)

aguml
05-06-2013, 20:17:57
Gracias amigo, sobre el tSplite se como usarlo y en este caso no me interesa que puedan modificar nada jejeje.