| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Lun 14 Nov, 2005 4:14 pm Asunto: Ajustar MDIChild activa a través de código |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 15 Nov, 2005 4:43 am Asunto: |
|
|
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 |
|
 |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Mar 15 Nov, 2005 4:55 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 16 Nov, 2005 12:00 am Asunto: |
|
|
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 |
|
 |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Mie 16 Nov, 2005 11:31 am Asunto: |
|
|
Muy bien, ahora si , 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 |
|
 |
|