WoW tiempo sin pasar por aca. Habia dejado este tema sin resolver por cuestiones de mucho trabajo, malas decisiones y no tenia cabeza para seguir pero haces un mes retome la programación de este tipo de menu. Por fin les puedo dar un código funcional, terminado. Utilícenlo libremente para que no les
duela la cabeza como a mi.
Código Delphi
[-]procedure TfrmPrincipal.Button2Click(Sender: TObject);
var
TabItem: TRibbonTabItem;
Group: TRibbonGroup; BarAction: TActionClientItem;
PadreIDTab: Integer;
PadreIDGrupo: Integer;
Action: TAction;
i: Integer;
GroupCaption: string;
CurrentActionBarItem: TActionBarItem;
Bg: TRibbonLargeButtonControl;
Bs: TRibbonSmallButtonControl;
begin
ribMenu.Tabs.Clear;
QryMenu.Close;
QryMenu.SQL.Clear;
QryMenu.SQL.Add('SELECT * ');
QryMenu.SQL.Add('FROM Menu ');
QryMenu.SQL.Add('WHERE (padre_id IS NULL OR padre_id = 0) AND activo = 1 ');
QryMenu.SQL.Add('ORDER BY orden ASC');
QryMenu.Open;
QryMenu.First;
amMenu.ActionBars.Clear;
while not QryMenu.Eof do begin
TabItem := ribMenu.Tabs.Add;
TabItem.Caption := Trim(QryMenu.FieldByName('titulo').Value);
PadreIDTab := QryMenu.FieldByName('menu_item_id').Value;
QrySubMenu.Close;
QrySubMenu.SQL.Clear;
QrySubMenu.SQL.Add('SELECT * ');
QrySubMenu.SQL.Add('FROM Menu ');
QrySubMenu.SQL.Add('WHERE padre_id = :PadreIDTab AND activo = 1 '); QrySubMenu.SQL.Add('ORDER BY orden ASC');
QrySubMenu.Parameters.ParamByName('PadreIDTab').Value := PadreIDTab;
QrySubMenu.Open;
QrySubMenu.First;
while not QrySubMenu.Eof do begin
if UpperCase(QrySubMenu.FieldByName('tipo').Value) = 'GRUPO' then
begin
GroupCaption := Trim(QrySubMenu.FieldByName('titulo').AsString);
Group := nil;
for i := 0 to TabItem.Page.ControlCount - 1 do
begin
if (TabItem.Page.Controls[i] is TRibbonGroup) and (TRibbonGroup(TabItem.Page.Controls[i]).Caption = GroupCaption) then
begin
Group := TRibbonGroup(TabItem.Page.Controls[i]);
Break; end;
end;
if not Assigned(Group) then
begin
Group := TRibbonGroup.Create(ribMenu);
Group.Parent := TabItem.Page;
Group.Caption := GroupCaption;
end;
PadreIDGrupo := QrySubMenu.FieldByName('menu_item_id').Value;
CurrentActionBarItem := nil;
for i := 0 to amMenu.ActionBars.Count - 1 do
begin
if amMenu.ActionBars[i].ActionBar = Group then
begin
CurrentActionBarItem := amMenu.ActionBars[i];
Break;
end;
end;
if not Assigned(CurrentActionBarItem) then begin
CurrentActionBarItem := amMenu.ActionBars.Add; CurrentActionBarItem.ActionBar := Group; CurrentActionBarItem.Tag := PadreIDGrupo; end;
QryItems.Close;
QryItems.SQL.Clear;
QryItems.SQL.Add('SELECT * ');
QryItems.SQL.Add('FROM Menu ');
QryItems.SQL.Add('WHERE padre_id = :PadreIDGrupo AND activo = 1 '); QryItems.SQL.Add('ORDER BY orden');
QryItems.Parameters.ParamByName('PadreIDGrupo').Value := PadreIDGrupo;
QryItems.Open;
QryItems.First;
while not QryItems.Eof do begin
if UpperCase(QryItems.FieldByName('tipo').Value) = 'ITEM' then
begin
OutputDebugString(PWideChar('Creando ítem: "' + Trim(QryItems.FieldByName('titulo').Value) + '" para el grupo "' + Group.Caption + '"'));
Action := TAction.Create(Self); Action.Caption := Trim(QryItems.FieldByName('titulo').Value);
Action.OnExecute := ItemClick;
Action.Tag := QryItems.FieldByName('menu_item_id').AsInteger;
BarAction := CurrentActionBarItem.Items.Add as TActionClientItem;
BarAction.Action := Action;
BarAction.Caption := Trim(QryItems.FieldByName('titulo').Value);
if QryItems.FieldByName('tipo_control').AsString = 'LARGEBUTTON' then
begin
Bg := TRibbonLargeButtonControl.Create(Group); Bg.ActionClient := BarAction;
end
else if QryItems.FieldByName('tipo_control').AsString = 'SMALLBUTTON' then
begin
Bs := TRibbonSmallButtonControl.Create(Group); Bs.ActionClient := BarAction;
end;
end;
QryItems.Next;
end;
QryItems.Close;
end; QrySubMenu.Next;
end;
QrySubMenu.Close; QryMenu.Next;
end;
if ribMenu.Tabs.Count >= 2 then
begin
ribMenu.TabIndex := 1;
ribMenu.TabIndex := 0;
end;
ribMenu.Refresh;
QryMenu.Close; end;
Muchas pero mucha suerte en sus proyectos el mio acaba de empezar asi que preparense para una tanda de preguntadera