Después de tanto tiempo veo este post... Nunca supe la respuesta...
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?
|