Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-02-2010
LoPiTaL LoPiTaL is offline
Miembro
 
Registrado: abr 2009
Posts: 168
Poder: 16
LoPiTaL Va por buen camino
Cambiar comportamiento de Align

Hola a todos.
Tengo un ligero problemilla con la propiedad align de los formularios / paneles etc... y es que me gustaría que no pusiese primero los componentes con alineamiento alTop y alBottom, sino que pusiese primero los alLeft / alRight, ya que me gustaría que:
un panel que tengo en el lateral ocupase todo el formulario de arriba a abajo, y que el que está arriba ocupe sólo lo que a este le sobre; y no que
el que está en la parte de arriba ocupe toda la pantalla de izda a derecha y que el que está al lado ocupe sólo lo que le sobra al otro.

No me sirve usar "alNone" para el de arriba y ajustarlo a mano con las anchors y tal, ya que estoy haciendo una aplicación MDI y con docking, y si pongo alNone el panel se me queda "flotando" y ni el MDI ni el dock me lo detectan.

Se agradece cualquier sugerencia.
Un saludo,
LoPiTaL
Responder Con Cita
  #2  
Antiguo 10-02-2010
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Pues hay que meter un panel de relleno (si lo he entendido bien).

En el centro añade un panel con alClient, y dentro de éste, añade otro más llamado "arriba" con align alTop.
(izq, dcho, centro, arriba son todos paneles)

izq.align := alLeft;
dcho.align := alright;
centro.align := alClient; << este panel es de relleno
centro.arriba.align := alTop; <<
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 10-02-2010
LoPiTaL LoPiTaL is offline
Miembro
 
Registrado: abr 2009
Posts: 168
Poder: 16
LoPiTaL Va por buen camino
Gracias por la respuesta. Esta solución es válida para solucionar el problema que expongo, del alineamiento. También funciona perfectamente el docking.
Sin embargo, las ventanas MDI se me quedan por detrás del panel, quedándose invisibles.He probado a darles el Parent=Panel y tampoco hace nada.
He probado a usar JvPanel (que puede ser transparente), pero tampoco funciona.Sería una solución buena si pudiese hacer que las ventanas MDI no estuviesen limitadas a estar en la parte "Client" del formulario, sino que pudiesen estar en la parte "Client" de cualquier otro componente, en este caso del panel.

¿Se os ocurre alguna otra cosa?
Un saludo,
LoPiTaL
Responder Con Cita
  #4  
Antiguo 10-02-2010
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Hola,

Yo he logrado algo como esto:



No sé si es lo que quieres. Para ello, redefino el método CustoAlignPosition del formulario:

Código Delphi [-]
procedure TForm1.CustomAlignPosition(Control: TControl; var NewLeft,
    NewTop, NewWidth, NewHeight: Integer; var AlignRect: TRect;
    AlignInfo: TAlignInfo);
begin
    inherited;

    if Control = Panel3 then
    begin
        NewLeft := Panel1.Left + Panel1.Width;
        NewTop := 0;
        NewWidth := ClientWidth - Panel1.Width - Panel2.Width;
    end;
end;

Panel1 tiene alineación alLeft, Panel2 alRight y Panel3 alCustom. Esto último es importante porque si no, no se llama al método CustomAlignPosition.

Lo malo es que la posición y tamaño iniciales del formulario hijo no se ajustan al área sobrante y tienes que moverlo tú mismo.

// Saludos
Responder Con Cita
  #5  
Antiguo 10-02-2010
LoPiTaL LoPiTaL is offline
Miembro
 
Registrado: abr 2009
Posts: 168
Poder: 16
LoPiTaL Va por buen camino
Hola otra vez!! Tu solución funciona a la perfección Román, sólo que hay que hacer una pequeña modificación:

Tenéis toda la info referente a lo que voy a contar aquí

http://www.marteens.com/trick49.htm
(quitad los dos espacios, que no sé por qué, me dice que aún no tengo permitido poner enlaces ni imágenes....)

Con alCustom no sólo se llama el método que tú indicas, sino que se llama también el de CustomAlignInsertBefore. Éste sirve para ordenar los componentes con alCustom y poder decidir cuál se pinta primero y cuál después.
En mi caso, no hace falta llamarlo dado que sólo tengo un componente con alCustom.

Con lo referente al otro método, CustomAlignPosition, sí es capaz de modificar el área de cliente, quedando las MDI perfectamente posicionadas sin tener que hacer nada más. Para ello se utiliza el parámetro AlignRect, que tiene el rectángulo del área sobrante (área cliente). Al final mi método quedó así (no hago diferenciación sobre quién es Control, ya que sólo tengo uno; si tuviese más de uno, con esta implementación, todos tendrían un pseudo-alTop, uno debajo del otro sin solaparse):

Código Delphi [-]
procedure TForm1.CustomAlignPosition(Control: TControl; var NewLeft,
NewTop, NewWidth, NewHeight: Integer; var AlignRect: TRect;
AlignInfo: TAlignInfo);
begin
inherited;
NewLeft := AlignRect.Left; //Nos ponemos en el borde más a la izda que podamos.
NewTop := AlignRect.Top; //Nos ponemos lo más arriba que podamos
NewWidth := AlignRect.Right-AlignRect.Left; //Tomamos todo el ancho de la aplicación.
//Hacemos más pequeño el rectángulo de alineamiento para que las ventanas MDI se pinten en la zona correcta.
Inc(AlignRect.Top,NewHeight);
end;
AlignRect: rectángulo que queda libre para alinear componentes. Una vez todos están colocados, es el que se utiliza para alClient.
Control: control que se está alineando en este momento.
NewXXX: dimensiones del componente. Inicialmente las que tuviese en tiempo de diseño o antes de llamar a esta función. Se pueden modificar para redimensionar el componente.
AlignInfo: información de alineamiento. Contiene una lista con todos los alCustom, el índice del Control actual, el tipo de alineación que tiene (alCustom siempre..) y otro parámetro Scratch que creo que no se utiliza para nada aunque no estoy seguro.

Así, el resto de posibles paneles con alCustom recibirán el Rect modificado y se pintarán sin sobreponerse sobre ningún otro, y lo más importante, el espacio sobrante de AlignRect es el utilizado finalmente para alClient (o en mi caso para las MDI)

Muchas gracias de nuevo,
Un saludo,
LoPiTaL

Última edición por LoPiTaL fecha: 10-02-2010 a las 18:29:56.
Responder Con Cita
  #6  
Antiguo 10-02-2010
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Hola,

Pues qué gusto que ya lo hayas resuelto y agradezco el enlace que pones, que está muy interesante.

Por cierto, ya corregí el enlace. A partir de tu próximo mensaje ya podrás ponerlos tú mismo. Tenemos la restricción de diez mensajes para evitar el SPAM.

También te recomiendo que uses las etiquetas [code] o [delphi] para poner tu código, para que quede bien indentado y coloreado.

// Saludos
Responder Con Cita
  #7  
Antiguo 10-02-2010
LoPiTaL LoPiTaL is offline
Miembro
 
Registrado: abr 2009
Posts: 168
Poder: 16
LoPiTaL Va por buen camino
Ok, gracias. Ya he corregido lo del código.

Un saludo,
LoPiTaL
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Propiedad align xanxov Lazarus, FreePascal, Kylix, etc. 3 06-02-2009 17:33:54
Align en Printer.Canvas principiante22 Impresión 1 18-12-2008 17:29:51
Quickreport, qrmemo autostrech i qrdbtext align bottom rafa_adrim Impresión 1 05-06-2007 16:55:09
Comportamiento de bde con oracle 10 g opsi Conexión con bases de datos 4 27-09-2006 22:32:47
Controlar la propiedad Align de dos derivados de TControl.. pvizcay Varios 2 05-07-2006 01:49:34


La franja horaria es GMT +2. Ahora son las 12:03:43.


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
Copyright 1996-2007 Club Delphi