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 

TCategoryPanelGroup
Ir a página 1, 2  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: TCategoryPanelGroup Responder citando

Hola,

¿Es posible decir a un panel de un TCategoryPanelGroup que sea extensible? Es decir, similar a la propieda Align = alClient?

Si esto no se pudiera hacer, como se puede hacer extensible como cuando pones un TSplitter entre dos paneles.

Espero haberme explicado bien.

Muchas gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Te refieres a que cada vez que abres un panel se cierren los demás y este ocupe todo el espacio posible (al estilo de cómo funcionaba la vieja barra de Outlook) ?

Uploaded with ImageShack.us

Para probarlo ponemos el siguiente código en el constructor del Form:
Código:
    #pragma warn -mls
    static struct EXPERIMENTO {
        __fastcall EXPERIMENTO(TCategoryPanelGroup* group) : group_(group)
        {
            group_->VertScrollBar->Visible = false;
            group_->CollapseAll();

            for (int i = 0; i < group_->Panels->Count; i++) {
                GetPanel(i)->OnExpand = CategoryPanelOnExpand;
                if (!GetPanel(i)->Top) GetPanel(i)->Expand();
            }

            group_->OnResize = CategoryPanelGroupOnResize;
        }

        void __fastcall CategoryPanelOnExpand(TObject* Sender)
        {
            TCategoryPanel* panel = static_cast<TCategoryPanel*>(Sender);

            for (int i = 0; i < group_->Panels->Count; i++)
                if (GetPanel(i) != panel) GetPanel(i)->Collapse();

            ResizePanel(panel);
            lastExpanded_ = panel;
        }

        void __fastcall CategoryPanelGroupOnResize(TObject* Sender)
        {
            ResizePanel(lastExpanded_);
        }

        void __fastcall ResizePanel(TCategoryPanel* panel)
        {
            int HeadersHeight = (group_->HeaderHeight + 6)
                * (group_->Panels->Count - 1);
            panel->Height = group_->ClientHeight - HeadersHeight;
        }

        TCategoryPanel* __fastcall GetPanel(int num)
        {
            return static_cast<TCategoryPanel*>(group_->Panels->Items[num]);
        }

        TCategoryPanelGroup* group_;
        TCategoryPanel* lastExpanded_;
    } experimento(CategoryPanelGroup1);
    #pragma warn .mls

[05/05/10 - Editado para añadir el código]


Ultima edición por _Leo el Mie 05 May, 2010 2:45 am, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

No, aunque me valdría para empezar.

Para que te hagas una idea es un formulario con tres paneles.
Lo que quiero es que cada Panel dentro del TCategoryPanelGroup pueda tratarlo como los tipicos Paneles con TSplitter y que pueda hacer mas grande o más pequeño a mi gusto.

No se si me he explicado, pero es como si pongo tres paneles normales, uno alTop, otro alClient y otro alBottom, y dos Tsplitter entre medias para agrandar o empequeñecer dependiendo de lo que necesite.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

A ver si esto se parece más a lo que necesitas ?


Uploaded with ImageShack.us

Añadimos el siguiente código en el constructor del Form:
(lo hacemos así para probar, luego cada uno que lo organice a su manera)
Código:
    #pragma warn -mls
    static struct EXPERIMENTO {
        __fastcall EXPERIMENTO(TCategoryPanelGroup* group)
        {
            for (int i = 0; i < group->Panels->Count; i++) {
                TCategoryPanel* panel = static_cast<TCategoryPanel*>(
                        group->Panels->Items[i]);
                TPanel* splitter = new TPanel(panel);
                splitter->Height = 5;
                splitter->Color = clRed;
                splitter->ParentBackground = false;
                splitter->Cursor = crVSplit;
                splitter->BevelOuter = bvNone;
                splitter->Align = alBottom;
                splitter->Parent = panel;
                splitter->OnMouseMove = PanelOnMouseMove;
            }
        }

        void __fastcall PanelOnMouseMove(TObject* Sender, TShiftState Shift,
                int X, int Y)
        {
            TControl* splitter = static_cast<TControl*>(Sender);
            static bool pulsado = false;
            static int y0;

            if (!pulsado && Shift.Contains(ssLeft))
                y0 = Y;

            pulsado = Shift.Contains(ssLeft);
            int incr = Y - y0;
            if (pulsado && splitter->Parent->Height + incr > 10)
                splitter->Parent->Parent->Height += incr;
        }
    } experimento(CategoryPanelGroup1);
    #pragma warn .mls


Ultima edición por _Leo el Sab 17 Ago, 2013 3:48 am, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Me dejas impresionado.
Exacto... voy a probarlo y te cuento, pero seguro que estará perfecto
Gracias, gracias, gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Pues ya esta, al final he hecho una mezcla de las dos cosas.
En un panelgroup con 3 paneles, el del medio cambia de tamaño (Al igual que la propiedad alClient)


1.- Creas un TCategoryPanelGroup (llamado CategoryPanelGroup1)
2.- Creo 3 paneles
3.- En el del medio meto un TPanel (llamado Panel2)
4.- Le pongo Align a Panel2 = alBottom
5.- En el evento Resize del CategoryPanel1
Código:
   
CategoryPanel2->Height = CategoryPanelGroup1->ClientHeight - CategoryPanel1->Height - CategoryPanel3->Height;


Todos los eventos OnCollapse y OnExpand de los paneles

Código:

CategoryPanelGroup1Resize(NULL);



Y por ultimo en el evento OnMouseMove de Panel2 (El emulador de TSplitter)
Código:

   static bool pulsado = false;
   static int y0;

   if (!pulsado && Shift.Contains(ssLeft))
      y0 = Y;

   pulsado = Shift.Contains(ssLeft);
   int incr = Y - y0;
   if (pulsado && Panel2->Parent->Height + incr > 10)
   {
      CategoryPanelGroup1->VertScrollBar->Visible=false;
      CategoryPanel2->Height += incr;
      CategoryPanel3->Height -=incr;
      CategoryPanelGroup1->VertScrollBar->Visible=true;
   }
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: y ocultarla? Responder citando

Muy buen componente, pero no tiene alguna propiedad o truco para que se pueda ocultar o aparecer con efecto de desplazamiento?
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: noticias estilo barra lateral de facebook Responder citando

hola a todos.


lo que al final estoy intentando emular es una barra lateral derecha que muestre noticias, estilo face.

qué componente es el ideal para dicho diseño?
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Re: noticias estilo barra lateral de facebook Responder citando

jotny escribió:
lo que al final estoy intentando emular es una barra lateral derecha que muestre noticias, estilo face.

qué componente es el ideal para dicho diseño?

¿Te refieres al "ticker" (donde pone información instantánea)? Si es así, no tiene mucho que ver con el look de este componente no? Es más como una lista, yo o lo dibujaría o usaría un simple TListBox pero dibujando cada elemento para darle el look que quiera.

En caso de que no sea, mejor si pones alguna captura..
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: gracias por responder gran leo_ Responder citando

lo que debo hacer es una barra lateral derecha en que muestre lo siguiente en el ejemplo:

Fecha publicacion: 15-08-2013 10:00
Titulo: noticia de prueba 1
2 Comentarios

Leo_ 15-08-2013 22:10
"comentario de prueba 1"

Jotny 15-08-2013 22:16
"comentario de prueba 2"

Fecha publicacion: 14-08-2013 09:00
Titulo: noticia de prueba 2
1 Comentario

Leo_ 14-08-2013 09:10
"comentario de prueba 2"


lo que me gustó es el TCategoryPanelGroup porque puedo poner 2 paneles, el de las noticias (con algo como el ejemplo anterior) y un calendario en el segundo panel para mostrar una agenda (eso es facil).
pero la barra debe de poder ocultarse y el componente TCategoryPanelGroup no tiene o simplemente no veo que tenga un boton en donde presionar y ocultarlo, y luego presionar y hacer que aparezca nuevamente (estilo un >> para ocultarlo y luego el << para aparecer).

el diseño de las noticas claro que podria utilizar el TListBox como indicas e ir incrustando la noticia y todos los comentarios que han generado los usuarios a ella, veré si logro algun diseño agradable, pero el que se pueda ocultar y aparecer me complica Sad.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Re: gracias por responder gran leo_ Responder citando

jotny escribió:
TCategoryPanelGroup no tiene o simplemente no veo que tenga un boton en donde presionar y ocultarlo, y luego presionar y hacer que aparezca nuevamente (estilo un >> para ocultarlo y luego el << para aparecer).

Tendrás que decidir tú como y donde colocar un botón que te permita ocultarlo.. quizás un botón en la parte superior derecha el cual cambies de posición si está oculto o no..

Por si te sirve, aquí una muestra del botón, pero sin colocarlo en ningún sitio en especial, solo para que veas si te vale la pena y ya el resto lo puedes hacer a tu gusto:


Uploaded with ImageShack.us

Y para seguir con el mismo formato de los "experimentos" de arriba.. añade el siguiente código al constructor del Form:
Código:
   #pragma warn -mls
   static struct EXPERIMENTO
   {
      TWinControl* control;
      TWndMethod OldWndProc;
      TButton* button;

      __fastcall EXPERIMENTO(TWinControl* c, TButton* b) : control(c), button(b)
      {
         OldWndProc = control->WindowProc;
         control->WindowProc = WndProc130;
         button->Caption = ">>";
         button->OnClick = ButtonClick;
      }

      void __fastcall WndProc130(TMessage& msg)
      {
         if (msg.Msg == WM_PRINTCLIENT)
            control->PaintTo((HDC)msg.WParam, -2, -2);
         OldWndProc(msg);
      }

      void __fastcall ButtonClick(TObject* Sender)
      {
         button->Tag = !button->Tag;
         button->Caption = button->Tag ? "<<" : ">>";
         if (button->Tag) {
            AnimateWindow(control->Handle, 200, AW_HOR_POSITIVE | AW_SLIDE | AW_HIDE);
         } else {
            AnimateWindow(control->Handle, 200, AW_HOR_NEGATIVE | AW_SLIDE);
            RedrawWindow(control->Handle, 0, 0, RDW_INVALIDATE  | RDW_ALLCHILDREN);
         }
      }
   } experimento(CategoryPanelGroup1, Button2);
   #pragma warn .mls
   //                      ^              ^
   // Asigna aquí el TCategoryPanelGroup y el botón al que quieras aplicar el efecto
   // y no olvidar que el TCategoryPanelGroup debe de estar alineado a la derecha

(Lo hago así para que se pueda probar con un simple copiar y pegar, pero ya luego tu distribuye el código a tu gusto)

Interceptamos el mensaje "WM_PRINTCLIENT" para que al usar "AnimateWindow" se dibuje correctamente. Desgraciadamente Embarcadero no presta atención a estos pequeños detalles ni aunque se lo soliciten en sus foros durante años.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: fantastico el efecto Responder citando

graacias leo_ Smile, puse el boton justificado a la derecha para poder lograr el efecto que necesitaba, que el tcategory se ocultada hacia el boton.

y no sabes que componente sirve para poner una especie de noticia y comentarios?, no logro hacerlo con un stringgrid.

Noticia 1.
Fecha
autor.
usuario1 fecha:hora
.......comentario1....

usuario2 fecha:hora
.......comentario2....

Noticia 2.
Fecha
autor.
usuario1 fecha:hora
.......comentario1....
usuario2 fecha:hora
.......comentario2....
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: ya casi lo logrooo Responder citando

gracias leo por la gran ayuda, he podido hacer lo que necesito de un listado de noticias en barra lateral derecha que se pueda ocultar, utilice un grid y además que desde mi base de datos busco la informacion incorporando los saltos de linea que luego en el grid se logran mostrar hacia abajo.

lo que no puedo lograr es que, si tengo un texto largo, éste se me pierde a la derecha.

como puedo ajustar el texto al tamaño de la celda (ancho columna) y si el texto es largo se muestre en lineas siquientes?.

alguna idea?
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Re: ya casi lo logrooo Responder citando

jotny escribió:
como puedo ajustar el texto al tamaño de la celda (ancho columna) y si el texto es largo se muestre en lineas siquientes?.

Tienes la función del API "DrawText", que te permite de una forma sencilla dibujar el texto ajustado a un rectángulo partiéndolo en líneas, entre otras cosas..

Aquí tienes un ejemplo aplicado a un TStringGrid:

    [Varias lineas en StringGrid]
    https://cppbuilder.es/viewtopic.php?p=24299#24299

(En el foro hay más ejemplos de la misma función aplicada a otros componentes)
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: con una imagen seré mas clarito :) Responder citando

lo que he logrado es lo siguiente.



en azul coloreo una noticia (cabecera) y los comentarios en verde.

si te das cuenta la segunda noticia, puse un comentario largo y no baja sólo. he usado el codigo para poder mostrar multiples lineas, pero esa descripcion viene desde una base de datos que se puso en un formulario en un tmemo.

cuando busco la info a la base de datos la extraigo como usuario+char(10)+char(13) fecha etc. y resulta super bien, pero cuando el origen ya es un texto largo, en la celda no se ajusta el texto al ancho fijo que le indiqué.

y el codigo que utilizo para mostrar el texto es el siguiente.
Código:

         grid->Canvas->Brush->Style = bsClear;
         SetTextColor(grid->Canvas->Handle,clBlack);
         grid->Canvas->FillRect(Rect);
         InflateRect(&rect, -2, -2); // Margenes
         DrawText(grid->Canvas->Handle, grid->Cells[ACol][ARow].t_str(),
         grid->Cells[ACol][ARow].Length(), &rect,
             DT_VCENTER | DT_END_ELLIPSIS | DT_WORDBREAK);



que me faltará para que si existe un texto largo (proveniente de mi bd se muestre po defecto hacia abajo respetando el ancho fijo de la celda del grid?.

de antemano muuchas gracias leo porque ya he logrado mucho, solo me quedaria ese detalle.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
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.