PDA

Ver la Versión Completa : como capturar el click en un componete TcxGrid Agrupado


cmfab
14-11-2011, 14:38:35
Hola a todos, preferentemente esta pregunta es para quellos que usan los componentes DevExpress. Hace algun tiempo puse una pregunta en este foro similar, pero por necesidad trato de volver a explicarme, pues no consigo informacion de como hacerlo. uilizo el componente TcxGrid para representar los datos de una tabla que necesito agrupar por uno de sus campos. para ello creo una vista usando el componente TcxGridDBTableView y asignabdo los campos a mostrar y agrupando por un campo "x". lo que necesito es capturar cuando se hace click derecho sobre el campo que esta agrupado que es un evento diferente al que se desencadena cuando se hace click derecho sobre una celda del componente TcxGridDBTableView (en este caso las celdas se representan por los detalles debajo del campo agrupado). si uso la propiedad popupmenu de dicho componente entonces no me permite desplegar el menupopup cuando se hace click derecho sobre una celda del detalle, ya que dicha pripiedad (menupopup) se aplica a toda la grilla. osea resumiento necesito que un menu popup se desplieque con ciertas acciones cuando se hace click derecho sobre la linea donde esta el campo por el cual se agrupa y que otro menu popup con diferentes acciones se despliegue al hacer click derecho sobre una celda de los detalles del grupo. espero haberme explicado correctamente. gracias a todos por sus atenciones

ecfisa
14-11-2011, 17:47:39
resumiento necesito que un menu popup se desplieque con ciertas acciones cuando se hace click derecho sobre la linea donde esta el campo por el cual se agrupa y que otro menu popup con diferentes acciones se despliegue al hacer click derecho sobre una celda de los detalles del grupo. espero haberme explicado correctamente.

Hola cmfab.

Voy a hacerte una sugerencia que funciona para un TDBGrid.
Basándome en el supuesto que la primera columna es el campo por que se agrupa, asigna a PopupMenu1 al Grid y luego este código al evento OnColEnter del mismo.

procedure TForm1.DBGridColEnter(Sender: TObject);
begin
with Sender as TDBGrid do
if SelectedField.FieldName = 'NOMBRE_DE_TU_CAMPO_AGRUPADO' then
PopupMenu:= PopupMenu1
else
PopupMenu:= PopupMenu2;
end;

Como no utilizo esos componentes, no sé si será aplicable, pero al menos espero que te aporte alguna idea.

Un saludo.

cmfab
14-11-2011, 22:48:41
Gracias lo probaré a ver si resulta y despues os comento

Neeruu
18-11-2011, 14:31:42
Hola.....

Podrías decir que es lo que quieres hacer.... yo utilizo devexpress.... capas si describes lo que necesitas puedo ayudarte....


Saluda Atte Neeruu!!!:)

cmfab
21-11-2011, 16:03:00
Gracias y disculpen porque me ausente unos dias. el tema es que tengo la grilla agrupada por un campo, por ejemplo por el numero de la venta. entonces debajo de cada numero de la venta estan los detalles, lo que necesito es que cuando se haga click derecho en el numero de la venta, aparezca un menu popup con variantes diferentes a las que deben salir cuando se hace click sobre los detalles. sucede que uso el evento oncellclick para desplegar el popup que necesito que emerja cuando se hace click derecho en el detalle, pero como el grupo (numero de venta) se encuenta en una fila que no se considera como una celda, pues alli dicho evento no se desencadena, solo me funciona si le asigno a la grilla un menupopup en su propiedad "PopupMenu", pero al hacer esto entonces prevalece ese menu para todo el detalle tambien. espero que se me haya entendido y gracias una vez mas

ecfisa
21-11-2011, 17:13:44
Hola.

Aunque no conozco el TcxGrid, creo entender que en una fila aparece el título, como por ejemplo: NRO DE VENTA o DETALLES y debajo el contenido del campo.
De ser así, ¿ Hay algun patrón para guiarse como por ejemplo que los títulos estén en fila par o impar ?

Un saludo.

cmfab
21-11-2011, 18:57:53
Gracias, así mismo es como vos lo entendió, pero no tengo idea del patron que me comentas. un saludo

ecfisa
21-11-2011, 19:07:14
Hola cmfab.

Me refiero si las filas donde están los titulos (los que no se consideran como celda) tienen alguna propiedad u órden por los cuales se los pueda identificar.

Sería buenísimo si pudieras graficar como es la disposición, nada muy elaborado, sólo para hacernos una idea. (mejor aún una imágen de la grilla)

Saludos.

cmfab
21-11-2011, 20:53:01
Aqui va la imagen de una parte de la grilla. saludos y gracias

ecfisa
21-11-2011, 21:24:13
Hola cmfab.

Donde dice "Mov. No. :442(SUM=0.00)", es parte del título de la grilla o aparece varias veces como una línea más ?

Perdón por tanta pregunta, pero no conozco el componente y quiero ver como podríamos diferenciarla de una celda.

Saludos.

cmfab
21-11-2011, 21:36:17
todo bien no hay problemas, ese titulo aparece varias veces, es el encabezado del grupo y debajo estan los detalles, solo que puse un grupo pero hay varios mas arriba o mas debajo. gracias por el interes

Neeruu
22-11-2011, 13:26:50
Hola cmfab!!!

Tengo algo que puede llegar a servirte...

No se con que versión de DevExpress trabajas... pero debes agregar un cxGridPopupMenu.

A este Componente se le asocia cxGrid, y luego en la propiedad PopupMenues creas un TcxPopupMenuInfo, donde te permite asignar la GridView, el PopuMenu y activar donde quieres que se muestre....

Fíjate si te sirve sino veremos que podemos hacer por código.

Saluda Atte Neeruu!!!:)

cmfab
22-11-2011, 13:51:22
Gracias muchas, lo pruebo enseguida y les comento

cmfab
22-11-2011, 13:57:24
Pero segun estoy revisando veo que se le asigna el popupmenu a todo el gridView y los datos de las filas y los detalles estan en el mismo gridview. como podria cambiar de popupmenu la hacer el click en la fila del grupo o en las celdas de los detalles ???

cmfab
22-11-2011, 14:19:07
Hola de nuevo, ya hay un avance. les explico. puse en el form el componente cxGridPopupMenu le asigno el cxgrid, despues en la propiedad popupmenus agrego un cxPopupmenusinfo a este ultimi le agrego el Gridview, pero tambien tiene una propiedad popupmenu. alli le asigno el menu popup que quiero que se despliegue pero lo que hace es que cuando hago click derecho sobre la fila con el titulo del grupo me sale un menu popup con las opciones:

Sort by group value;
Sort by group summary;
Sum

no logro que en vez de estas opciones salgan las que tengo en el menu popup que le asigné al cxpopupmenuinfo.

Gracias

Neeruu
22-11-2011, 14:36:18
Porque en las opciones que tiene el TcxPopupMenuInfo, tienes que marcar donde quieres que aparezca el popup que asignaste....

Por ejemplo marca que aparezca en el GroupByBox y cuando hagas clic con el botón derecho del mouse te aparecerá el popup que asignaste!!!!


Saluda Atte Neeruu!!!:)

cmfab
22-11-2011, 14:44:28
Ya lo hice así mismo y me siguen saliendo esas opciones por defecto en vez de los items del popup menu que le asigne al tcxpoppupmenuinfo. será que hay que cambiar alguna otra cosa en las propiedades de esos controles. gracias y disculpen las molestias por el gran debate de este post

cmfab
22-11-2011, 14:48:15
Tendre que analizar cuales de las opciones es la que necesito activar del comp. tcxmenupopupinfo, pues el tema es que el Groupbybox lo tengo oculto, lo puse voisible y funciono correctamente. pero necesito que este oculto. os comento enseguida gracias

Neeruu
22-11-2011, 14:53:33
Prueba si te sirve algunas de las opciones, sino veremos como podemos hacerlo por código.....


Que versión de DevExpress usas???

Saludo Atte Neeruu!!!:)

cmfab
22-11-2011, 15:17:29
cientos de millones de gracias Neeruu, solucionado el problema, tuve que activar en mi caso las opciones: qvhtRecord y gvhtGroupSummary. reitero los agradecimientos. uso las DevExpress 5

un saludo

NizamUlMUlk
29-05-2012, 15:00:18
Buen día, me pasa algo similar al problema que describiste.
El tema es que cuando uno hace click derecho sobre la grilla TcxGrid se dispara un popup construído por Developer Express (TcxGridPopupMenu) con opciones típicas como las de mostrar zona de Grupos, pies, alineación, mejorar el ancho de columnas, orden ascendente, descendente, selector de campos, etc.
Yo quiero que además de esos se muestre otros que le agrego como TcxPopupMenuInfo, por ejemplo un ítem de menú para expandir o contraer todo, que se active cuando se agrupa la información de la grilla por alguna columna.
En el TcxPopupMenuInfo le tildo gvhtExpandButton... Pero ese ítem de menú nunca aparece agregado a los estándares q trae el TcxGridPopupMenu. Cómo hacer q aparezca, que sea visible, y que realmente haga la tarea q debe hacer?.
Muchas gracias

Casimiro Notevi
29-05-2012, 15:10:54
Bienvenido a clubdelphi, NizamUlMUlk, ¿ya leiste nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php)?, gracias por tu colaboración :)

NizamUlMUlk
10-08-2013, 01:50:37
Por lo que he leído, hay que trabajar como rinoceronte para hacer que funcione como uno espera.
Corríjanme si me equivoco...

Todo ocurre en el evento OnPopup del componente TcxGridPopupMenu. Allí el método ofrece una variable (AHitTest: TcxCustomGridHitTest) la cual hay que evaluar más o menos así:

if (AHitTest is TcxGridRecordCellHitTest) then //identifico un record
...
else if (AHitTest is TcxGridHeaderHitTest) then //identifico una cabecera de columna
...
else if (AHitTest is TcxGridGroupByBoxHitTest) then //identifico una columna de grupo
...
if ASenderMenu is TcxGridStdHeaderMenu then // identifico que el disparador es el built-in menu
..
//acá puedo agregarle ítems al menú por defecto de la forma:
TPopupMenu(ASenderMenu).Items.Add(NewItem('E&xpandir', TextToShortCut('Ctrl-X'), False,
True, Expandir, 0, 'pmCustomEntry'));
TPopupMenu(ASenderMenu).Items.Add(NewItem('E&xpandir', TextToShortCut('Ctrl-X'), False,
True, Contraer, 0, 'pmCustomEntry'));
..
donde los procedimientos Expandir y Contraer son
procedure TForm1.Expandir(Sender: TObject) ;
begin
<aGrid>.ActiveView.DataController.Groups.FullExpand;
end;

procedure Contraer(Sender: TObject);
begin
<aGrid>.ActiveView.DataController.Groups.FullCollapse;
end;

Entonces con AHitTest identifico en que zona se hizo el click, con lo cual puedo habilitar o deshabilitar popups.
ej:
menuExpandir.Enabled := (AHitTest is TcxGridGroupByBoxHitTest) and (not <aGrid>.ActiveView.Controller.FocusedRow.Expanded);
menuContraer.Enabled := (AHitTest is TcxGridGroupByBoxHitTest) and <aGrid>.ActiveView.Controller.FocusedRow.Expanded;

Pero, eso si, hay que tener popups independientes al menú built-in, porque éste solo se dispara en las cabeceras de columna.
Aunque se lo puede lanzar llamándolo desde el evento OnMouseDown del GridView.... haciendo que en su evento OnPopup se construya con los ítems que uno quiere, y habilitando/deshabilitando cada ítem de acuerdo a la info que recabe de AHitTest, y otros datos extra.... como en el ejemplo mostrado arriba

Entonces, en síntesis, no se puede hacer que sea automático, hay q laburar mucho... De hecho conviene hacer una clase que herede de TcxGridPopupMenu y dotarla de estos comportamientos para que se haga "automático" para los "descendientes"....
Q tul?

Casimiro Notevi
10-08-2013, 01:59:52
Recuerda poner los tags al código fuente, ejemplo:

http://www.clubdelphi.com/images/UtilizarTAGs.png

Gracias :)