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 

Ajustar MDIChild activa a través de código

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Ajustar MDIChild activa a través de código Responder citando

Tengo varias ventanas MDIChild abiertas y lo que quiero es ir cambiando de ventana activa al pulsar las diferentes pestañas de un TTabSet. En el evento OnChange del TTabSet he puesto esto:
Código:

MDIChildren[NewTab]->BringToFront();

Pero no funciona bien (activa ventanas hija aleatoriamente). Gracias.
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

El índice de MDIChildren cada vez que seleccionas una ventana MDI cambia, por lo que no se puede usar como referencia.

Tendrías que asociar la pestaña del TTabSet al añadirla con la ventana MDI en cuestión. Si ahora usas el método "Add" del TabSet para añadir una nueva pestaña cámbialo por "AddObject" así podrás asociar a cada pestaña un puntero, en este caso la dirección de la ventana MDI, por ejemplo:
Código:
TForm2* frm = new TForm2(this);
TabSet1->Tabs->AddObject("TITULO PESTAÑA", frm);
TabSet1->Refresh();

Y luego en el evento "OnChange" del TTabSet algo así:
Código:
// Extraemos el puntero a la ventana MDI anteriormente asociado
TForm* frm = static_cast<TForm*>(TabSet1->Tabs->Objects[NewTab]);
frm->BringToFront();
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Va perfecto _Leo, muchas gracias. En el mismo programa ahora me surge otra complicación, y es hacer justo lo contrario: al ir cambiando entre las diferentes ventanas hija tengo que activar su pestaña correspondiente en el TTabSet. Lo he intentado en el evento OnActivate del formulario hijo que utilizo para crear los MDIChild pero me da le típico error "LitstIndex out of bounds" cuando intenta acceder al listado de pestañas del TabSet1, el código que utilizo es:
Código:

void __fastcall TfrmDocumento::FormActivate(TObject *Sender)
{
    Form1->TabSet1->TabIndex = Form1->TabSet1->Tabs->IndexOf(this->Caption);
}

Creo que el problema está en que cuando creo el formulario hijo se llama automáticamente también a su evento "OnActivate" por lo que el "Caption" del formulario que creo todavía no tiene el valor definitivo por lo que cuando le digo que busque el índice de las pestañas con el valor del caption del formulario hijo no lo encuentra y salta el error. Saludos.
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

El problema esta en que al cambiar por código de pestaña también salta el evento OnChange del TabSet (posiblemente el valor de NewTab sea -1), al menos en las pruebas que yo he hecho. Pero no se si tu estas asociando cada pestaña con el puntero del Form, ya que como veo que en tu código buscas las pestañas por el titulo y no por el puntero asociado...

Según el código anterior que puse, en el evento OnActivate podríamos poner algo así, para que no se dispare el OnChange al cambiar de pestaña por código:
Código:
TTabChangeEvent OldEvent = Form1->TabSet1->OnChange;
Form1->TabSet1->OnChange = 0;
Form1->TabSet1->TabIndex = Form1->TabSet1->Tabs->IndexOfObject(this);
Form1->TabSet1->OnChange = OldEvent;




O bien ponemos en el OnChange del TabSet lo siguiente:
Código:
if (NewTab != -1)
{
    TForm* frm = static_cast<TForm*>(TabSet1->Tabs->Objects[NewTab]);
    frm->BringToFront();
}

Y en el OnActivate:
Código:
Form1->TabSet1->TabIndex = Form1->TabSet1->Tabs->IndexOfObject(this);




Lo que intentas hacer es similar al componente del que se habla en el siguiente enlace, quizás te sirva como base:

  https://cppbuilder.es/viewtopic.php?t=8167
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muy bien, ahora si Very Happy, gracias otra vez _Leo.
Gracias por sugerirme el "ElegantMDIinterface" pero de momento prefiero hacerlo sin componentes extra. Saludos.
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
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.