PDA

Ver la Versión Completa : Asignarle distintos Popups a los Nodos de TreeView


fide_uci
21-01-2011, 17:36:09
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?pid=527657&id=100000461193039
http://www.facebook.com/photo.php?pid=526033&id=100000461193039

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
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 (http://msdn.microsoft.com/en-us/library/bb773897(VS.85).aspx). 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
Para saberlo utiliza el procedimiento TreeView_HitTest (http://msdn.microsoft.com/en-us/library/bb773897(VS.85).aspx). 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:


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
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 (http://msdn.microsoft.com/en-us/library/bb773897%28VS.85%29.aspx). 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..


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.