| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Cerúleo Master


Registrado: 04 Ago 2003Mensajes: 332Ubicación: Santander, España
|
Publicado: Jue 20 Oct, 2005 12:15 pm Asunto: Alineación de paneles y splitters |
|
|
Hola a todos.
Estoy haciendo una división de un panel en otros dos en tiempo de ejecución. Con la división horizontal no tengo problema, pero con la división vertical sí. En el panel que divido creo un panel a la izquierda (PanelIzq), un splitter (Splitter1) y un panel a la derecha (PanelDer), y ajusto sus propiedades de la misma forma que si lo estuviera haciendo en tiempo de diseño:
| Código: | ···
TPanel *PanelIzq=new TPanel(this);
PanelIzq->Parent=PanelPadre;
PanelIzq->Name="PanelIzq";
PanelIzq->Align=alLeft;
···
TSplitter *Splitter1=new TSplitter(this);
Splitter1->Parent=PanelPadre;
Splitter->Align=alLeft;
···
TPanel *PanelDer=new TPanel(this);
PanelDer->Parent=PanelPadre;
PanelDer->Name="PanelDer";
PanelDer->Align=alAllclient;
··· | Y el splitter me lo coloca pegado al borde izquierdo, y no entre el panel izquierdo y el derecho.
¿Alguna sugerencia?
Un saludo. _________________ Nunca digas "Es imposible" sin intentarlo antes. |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 20 Oct, 2005 4:17 pm Asunto: |
|
|
Usa la propiedad Left del Splitter para indicarle la posición (más o menos como harías en tiempo de diseño al moverlo), por ejemplo:
TSplitter *Splitter1=new TSplitter(this);
Splitter1->Left = PanelIzq->Width;
Splitter1->Parent=PanelPadre;
Splitter1->Align=alLeft;
o bien cambia el orden de creación. Crea primero el splitter, luego el panel izquierdo y luego el panel derecho. |
|
| Volver arriba |
|
 |
Cerúleo Master


Registrado: 04 Ago 2003Mensajes: 332Ubicación: Santander, España
|
Publicado: Jue 20 Oct, 2005 6:34 pm Asunto: |
|
|
Hola _Leo.
Me lo hace bien si alineo los paneles y el splitter a la derecha según el siguiente código:
| Código: | ···
TPanel *PanelDer=new TPanel(this);
PanelDer->Parent=PanelPadre;
PanelDer->Name="PanelDer";
PanelDer->Align=alRight;
···
TSplitter *Splitter1=new TSplitter(this);
Splitter1->Parent=PanelPadre;
Splitter->Align=alRight;
···
TPanel *PanelIzq=new TPanel(this);
PanelIzq->Parent=PanelPadre;
PanelIzq->Name="PanelIzq";
PanelIzq->Align=alAllclient;
··· | No entiendo por qué así si funciona. De todas formas voy a probar tu sugerencia y mañana te diré.
Un saludo. _________________ Nunca digas "Es imposible" sin intentarlo antes. |
|
| Volver arriba |
|
 |
Cerúleo Master


Registrado: 04 Ago 2003Mensajes: 332Ubicación: Santander, España
|
Publicado: Vie 21 Oct, 2005 10:16 am Asunto: |
|
|
Hola otra vez.
He probado la inclusión de la línea que me has indicado y funciona correctamente. Ahora viene la segunda parte, el borrado de los paneles y splitters en tiempo de ejecución.
Cuando con el splitterX, que separa el panelY y el panelZ, hago que uno de éstos tenga una altura (o anchura) igual a 0, debo eliminar tanto el splitterX como el panelY y el panelZ. Para ello uso el siguiente código:
| Código: | void __fastcall TForm1::PanelResize(TObject *Sender){
int i;
TPanel *Panel=(TPanel *)Sender,*Panel1,*Panel2;
TSplitter *Splitter;
AnsiString ASPanel;
if(Panel->Height==0){
ASPanel=Panel->Name;
i=ASPanel.SubString(6,ASPanel.Length()-5).ToInt();
// ShowMessage(i);
if(i%2==1)
i--;
// ShowMessage(i);
Panel1=(TPanel *)FindComponent("Panel"+AnsiString(i));
ShowMessage(Panel1->Name);
delete Panel1;
Splitter=(TSplitter *)FindComponent("Splitter"+AnsiString(i/2));
ShowMessage(Splitter->Name);
delete Splitter;
Panel2=(TPanel *)FindComponent("Panel"+AnsiString(i+1));
ShowMessage(Panel2->Name);
delete Panel2;
}
// else if(Panel->Width==0){
// }
} | Esto borra los panels y el splitter pero manda un error y se detiene la aplicación. ¿Alguna sugerencia?
Un saludo y buen fin de semana. _________________ Nunca digas "Es imposible" sin intentarlo antes. |
|
| Volver arriba |
|
 |
|