Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Asignarle distintos Popups a los Nodos de TreeView (https://www.clubdelphi.com/foros/showthread.php?t=71976)

fide_uci 21-01-2011 17:36:09

Asignarle distintos Popups a los Nodos de TreeView
 
Hola amigos. En el tema de mi post creo que dejo claro lo que quiero hacer.
Actualmente me encuentro creando un cliente de jabber y tengo un TreeView donde pinto los Grupos y dentro de cada grupo los usuarios que estan dentro de el. Algo como esto.

Amigos
- Amigo 1
- Amigo 2
Familiares
- Familiar 1
- Familiar 2
etc.

Lo que me hace falta es que al hacer clic derecho sobre Amigos o Familiares (que son grupos) me salga un PopupMenu y cuando haga clic sobre un nodo que no sea un grupo (como el de usuarios) me salga otro Popup. Como podria yo lograr esto?. Gracias desde ya mis amigos.

Aqui les dejo las imagenes de como va quedando el cliente de jabber.

http://www.facebook.com/photo.php?pi...00000461193039
http://www.facebook.com/photo.php?pi...00000461193039

De paso me dicen que les parece como va quedando !

roman 21-01-2011 17:52:00

Puedes usar el evento OnPopup del menú para habilitar/inhabilitar, mostrar/esconder o agregar/eliminar elementos del menú. Este evento se lanza justo antes de que se muestre al usuario.

Otra opción (mejor para mi manera de ver) es no asignar el menú al TreeView y usar el evento OnMouseDown del TreeView para determinar qué menú despliegas usando su método Popup.

// Saludos

fide_uci 21-01-2011 18:02:38

Hmm, ya creo que voy entendiendo. Deja probar y te comento luego como me fue. Muchisimas gracias por la ayuda !

Chris 21-01-2011 18:15:23

Cita:

Empezado por roman (Mensaje 388268)
Puedes usar el evento OnPopup del menú para habilitar/inhabilitar, mostrar/esconder o agregar/eliminar elementos del menú. Este evento se lanza justo antes de que se muestre al usuario.

Otra opción (mejor para mi manera de ver) es no asignar el menú al TreeView y usar el evento OnMouseDown del TreeView para determinar qué menú despliegas usando su método Popup.

// Saludos

A mí me parece más cómoda de programar la primera. Sin embargo, para cualquiera de las dos, lo que se necesita es saber sobre que nodo está el puntero al momento de hacer el click derecho. Para saberlo utiliza el procedimiento TreeView_HitTest. Desconozco si dicho procedimiento está implementado en la unidad Commctrl de delphi. Sino lo está, tendrás que "irte por otro lado", utilizando SendMessage.

MI OPINIÓN DE LA INTERFAZ: 2/3. La interfaz esta muy buena, pero existe mucha similitud en la ventana de inicio de sesión con su contraparte de Windows Live Messanger, lo que podría llevar a una confusión. En menor medida, este problema también ocurre con la lista de contactos, si cambiases los iconos de estado puedes hacer mucha diferencia. En la misma ventana, los nodos correspondientes a los grupos deberían distinguirse (siendo talvez dibujados en negrillas). Estos mismos también deberían de indicar cuántos contactos están disponibles en cada grupo sin necesidad de expandir el nodo. De la misma forma en que lo hace Windows Live. Por último, la ventana de conversación está un poco cruda. Deberías de confeccionarla un poco más siempre manteniendo el minimalismo que tienes por el momento.

Saludos,
Chris

roman 21-01-2011 20:03:30

Cita:

Empezado por Chris (Mensaje 388278)
Para saberlo utiliza el procedimiento TreeView_HitTest. Desconozco si dicho procedimiento está implementado en la unidad Commctrl de delphi.

Tienes razón en el uso del hittest. Aquí un ejemplo de cómo podemos usar el evento MouseDown y el hittest para determinar qué menú desplegar:

Código Delphi [-]
procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
var
    Ht: THitTests;
    Pt: TPoint;

begin
    if Button = mbRight then
    begin
        Ht := TreeView1.GetHitTestInfoAt(X, Y);

        if htOnItem in Ht then
        begin
            Pt := TreeView1.ClientToScreen(Point(X, Y));

            TreeView1.Selected := TreeView1.GetNodeAt(X, Y);

            if Assigned(TreeView1.Selected.Parent) then
                PopupMenu1.Popup(Pt.X, Pt.Y)
            else
                PopupMenu2.Popup(Pt.X, Pt.Y);
        end;
    end;
end;

// Saludos

fide_uci 23-01-2011 06:47:52

Cita:

Empezado por Chris (Mensaje 388278)
A mí me parece más cómoda de programar la primera. Sin embargo, para cualquiera de las dos, lo que se necesita es saber sobre que nodo está el puntero al momento de hacer el click derecho. Para saberlo utiliza el procedimiento TreeView_HitTest. Desconozco si dicho procedimiento está implementado en la unidad Commctrl de delphi. Sino lo está, tendrás que "irte por otro lado", utilizando SendMessage.

MI OPINIÓN DE LA INTERFAZ: 2/3. La interfaz esta muy buena, pero existe mucha similitud en la ventana de inicio de sesión con su contraparte de Windows Live Messanger, lo que podría llevar a una confusión. En menor medida, este problema también ocurre con la lista de contactos, si cambiases los iconos de estado puedes hacer mucha diferencia. En la misma ventana, los nodos correspondientes a los grupos deberían distinguirse (siendo talvez dibujados en negrillas). Estos mismos también deberían de indicar cuántos contactos están disponibles en cada grupo sin necesidad de expandir el nodo. De la misma forma en que lo hace Windows Live. Por último, la ventana de conversación está un poco cruda. Deberías de confeccionarla un poco más siempre manteniendo el minimalismo que tienes por el momento.

Saludos,
Chris

El problema es que lo comenze a desarrollar pero no tenia prototipo de interfaz. Y como ese me gusta mucho (Windows Live Messenger) pues esa fue la que escogi hasta que termine con y tenga una disponible. No obstante voy a tener todas tus opiniones y sugerencias en cuenta para mejorarlo. Gracias a todos por el apoyo. Si fuera posible quiciera que el cliente saliera por aqui por clubdelphi como un logro mas de Delphi.

fide_uci 23-01-2011 07:58:53

me fue muy util este codigo. Era justo lo que necesitaba. Lo unico que con una pequeña modificacion. Por que cuando hacia clic fuera del nombre del elemento en el TreeView no me desplegaba el menu. Asi que le quite ese parametro al Hittest. Como viene a continuacion..

Código Delphi [-]
var
    Ht: THitTests;
    Pt: TPoint;
begin
    //ShowMessage('aa');
    if Button = mbRight then
    begin
        Ht := roster_tree.GetHitTestInfoAt(X, Y);

        {if (htOnItem in Ht) or (htOnIcon in Ht) or (htNowhere in Ht) then
        begin}
            Pt := roster_tree.ClientToScreen(Point(X, Y));
            roster_tree.Selected := roster_tree.GetNodeAt(X, Y);
            if roster_tree.Selected.Level = 1 then
                roster_contact_popup.Popup(Pt.X, Pt.Y)
            else
                roster_group_popup.Popup(Pt.X, Pt.Y);
        //end;
    end;
end;

Muchisimas gracias a todos ustedes que siempre estan ayudando a las personas ggg. Espero poderlos ayudar yo un dia a ustedes.


La franja horaria es GMT +2. Ahora son las 21:02:59.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi