Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Colocación de un formulario (https://www.clubdelphi.com/foros/showthread.php?t=93606)

Angel.Matilla 27-11-2018 13:00:07

Colocación de un formulario
 
Tengo una aplicación en la que el formulario principal es un fsMDIForm con un TToolBar que hace las veces de menú. Al llamar a uno de los formularios fsMDIChild, y sólo a uno concreto, me está ocurriendo esto:

Siempre se me desplaza hacia abajo y saca la barra de desplazamiento vertical en vez de centrarlo. He probado con todas las combinaciones de posición del formulario (poDesigned, poDefault...) e incluso las lógicas para centrarlo (poScreenCenter, poOwnerFormCenter y poMainFormCenter) me hace lo mismo. He intentado forzar la posición vertical del segundo formualrio pero me da lo mismo y siempre me lo desplaza hacia abajo

ecfisa 28-11-2018 13:30:05

Hola.

Siempre que el MDIForm sea mayor, podes centrar los MDIChilds luego de la creación, v. gr.:

Código PHP:

void __fastcall TMDIForm::CenterForm(TForm *F)
{
  
F->Left = (this->ClientWidth  F->Width) / 2;
  
F->Top  = (this->ClientHeight F->Height this->ToolBar1->Height ) / 2;
}

// Ejemplo de uso:
void __fastcall TMDIForm::ToolButton1Click(TObject *Sender)
{
  if (!
MDIChild1)  // ( * )
    
MDIChild1 = new TMDIChild1(this);
  else
    
MDIChild1->BringToFront();
  
//...
  
CenterForm(MDIChild1);


( * ) Usando Action = caFree. La comprobación de la existencia del MDIChild requiere que pongas a nulo la instancia al cierre,
o podrá provocar una excepcion al intentar traer al frente un objeto ya liberado.
Código PHP:

void __fastcall TMDIChild1::FormClose(TObject *SenderTCloseAction &Action)
{
  
Action caFree;
  
MDIChild1 NULL// <- 


Si dejas el MDIChild minimizado al cerrarlo (no usas Action = caFree) deberías cambiar la linea,
Código PHP:

 MDIChild1->BringToFront(); 

por:
Código PHP:

 MDIChild1->WindowState wsNormal

Muestra:

(ajusté los tamaños de los MDIChild para que no se solapen)

Saludos :)

Angel.Matilla 28-11-2018 13:51:43

Gracias por la respuesta. Básicamente era lo que estaba intentando, pero tengo una duda.

Yo ahora lanzo así los MDIChild:
Código PHP:

void __fastcall TfMenu::GesAfiClick(TObject *Sender)
{
     
Application->CreateForm(__classid(TfPersona), &fPersona);
     
fPersona->Show();


Sé que no es la forma más correcta, y de hecho me has añadido una aclaración que iba a preguntar en otro momento.Este código:

Cita:

Empezado por ecfisa (Mensaje 529777)
Código PHP:

void __fastcall TMDIForm::ToolButton1Click(TObject *Sender)
{
  if (!
MDIChild1)  // ( * )
    
MDIChild1 = new TMDIChild1(this);
  else
    
MDIChild1->BringToFront();
  
//...
  
CenterForm(MDIChild1);



¿Tendría que ponerlo antes del Show() que muestra el formulario?

ecfisa 28-11-2018 14:09:04

Hola.
Cita:

Empezado por Angel.Matilla (Mensaje 529778)
...
¿Tendría que ponerlo antes del Show() que muestra el formulario?

No necesariamente, en el ejemplo anterior el centrado se produce luego de los eventos OnCreate/OnShow de los MDIChilds.

El evento OnShow se dispara justo antes de que el formulario sea haga visible y recuerda que tratándose de MDIChilds, la propiedad Visible siempre tiene el valor true. Es decir, que es llamado de forma automática luego de la creación.

Saludos :)

Angel.Matilla 28-11-2018 19:05:06

^\||/ Muchas gracias. Ha funcionado a la perfección.


La franja horaria es GMT +2. Ahora son las 05:34:51.

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