Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Menu Dinamico utilizando Ribbon (https://www.clubdelphi.com/foros/showthread.php?t=94781)

steelha 14-07-2020 19:17:32

Menu Dinamico utilizando Ribbon
 
3 Archivos Adjunto(s)
Muy buenas, asi como el tema dice; necesito ayuda para realizar un menu dinamico utilizando el componente Ribbon pero utilizando una Db. El problema consiste en que puedo montar los tabs que seran las diferentes opciones de menu, pero a la hora de crear grupos y los items en unos me crea en otros no y solo me coloca un item. no tengo idea de que hago mal. A continuacion dejo codigo he imagenes

Código Delphi [-]
procedure Tfrmprincipal.Carga_Menu;
var
  Group     : TRibbonGroup;
  TabItem   : TRibbonTabItem;
  BarItem   : TActionBarItem;
  BarAction : TActionClientItem;
  AnAction  : TAction;
  oldsql    : string;
begin
  oldsql := Dm.qrymenuitems.SQL.Text;
  Dm.qrymenu.Open;
  Dm.qrymenu.First;

  while not dm.qrymenu.Eof  do   //Crear las paginas/pestañas
  begin
    //Crear Pagina de la opcion principales del menu
    TabItem := mnPrincipal.Tabs.Add;
    TabItem.Caption := Trim(Dm.qrymenumCaption.Value);

    dm.qrymenuitems.SQL.Clear;
    dm.qrymenuitems.SQL.Text := 'Select * from tblMenu Where (mactivo = 1) and (mpertenece =' + 
     IntToStr((dm.qrymenuIDmenu.Value)) + ') Order by mpertenece,morden ASC';

    dm.qrymenuitems.Open;
    dm.qrymenuitems.First;

    Group := TRibbonGroup.Create(mnPrincipal);
    Group.Parent := TabItem.Page;
    Group.Caption := Trim(dm.qrymenuitemsmmenu.Value);

    while not Dm.qrymenuitems.eof do
    begin
      BarItem := amPrincipal.ActionBars.Add;
      BarAction := BarItem.Items.Add;
      amPrincipal.ActionBars.Add;
//        BarAction.Action := Action1;
      BarAction.Caption := Trim(Dm.qrymenuitemsmCaption.Value);
      BarItem.ActionBar := Group;

      Dm.qrymenuitems.Next;
    end;
    dm.qrymenu.Next;
  end;
  dm.qrymenuitems.SQL.Text := oldsql;
end;

GerTorresM 19-07-2020 23:46:42

Mira esta opción
 
Hola buen@s días, tardes, noches !!

Te sugiero que te des una visita en esta página https://www.axolot.com/axwribbon.htm, el componente es gratuito y el ejemplo que trae es muy sencillo, sin un poco de paciencia y un poco de tiempo en pruebas a la fija podrás creer el menú en tiempo de ejecución

steelha 21-07-2020 14:18:02

Gracias verificare

steelha 21-07-2020 15:29:20

El componente me trae error y ademas no queria utilizar compenentes de terceros prefiero el que trae delphi por default

steelha 20-05-2025 14:00:33

Retomando Correcion Codigo Menu Ribbon Dinamico
 
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; // This will act as our TCustomActionBar
  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;

  // Limpiar las actionbars antes de empezar el proceso
  amMenu.ActionBars.Clear; // Importante: limpiar las action bars existentes

  while not QryMenu.Eof do // Crear las pestañas principales
  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 '); // Obtener los grupos de la pestaña
    QrySubMenu.SQL.Add('ORDER BY orden ASC');
    QrySubMenu.Parameters.ParamByName('PadreIDTab').Value := PadreIDTab;
    QrySubMenu.Open;
    QrySubMenu.First;

    while not QrySubMenu.Eof do // Crear los grupos dentro de la pestaña
    begin
      if UpperCase(QrySubMenu.FieldByName('tipo').Value) = 'GRUPO' then
      begin
        GroupCaption := Trim(QrySubMenu.FieldByName('titulo').AsString);
        Group := nil; // Inicializamos Group a nil

        // Buscar si ya existe un grupo con este Caption en la pestaña actual
        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; // Se encontró el grupo existente, salir del bucle
          end;
        end;

        // Si no se encontró el grupo, crear uno nuevo
        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; // Capturar el ID del grupo

        // Find or create the TActionBarItem associated with this TRibbonGroup
        CurrentActionBarItem := nil;
        for i := 0 to amMenu.ActionBars.Count - 1 do
        begin
          // A TRibbonGroup can be assigned to an ActionManager through an ActionBarItem
          // We can use the Group itself as the identifier, or set the ActionBarItem.Tag
          if amMenu.ActionBars[i].ActionBar = Group then
          begin
            CurrentActionBarItem := amMenu.ActionBars[i];
            Break;
          end;
          // Alternatively, if you prefer to use Tag (and ensure Tag is set for the ActionBarItem)
          // if (amMenu.ActionBars[i].Tag = PadreIDGrupo) then
          // begin
          //   CurrentActionBarItem := amMenu.ActionBars[i];
          //   Break;
          // end;
        end;

        if not Assigned(CurrentActionBarItem) then // If ActionBarItem for this group doesn't exist, create it
        begin
          CurrentActionBarItem := amMenu.ActionBars.Add; // Add creates a new TActionBarItem
          CurrentActionBarItem.ActionBar := Group; // Assign the TRibbonGroup to the ActionBarItem
          CurrentActionBarItem.Tag := PadreIDGrupo; // Store the group's ID in the ActionBarItem's Tag for lookup
        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 '); // Obtener los ítems del grupo
        QryItems.SQL.Add('ORDER BY orden');
        QryItems.Parameters.ParamByName('PadreIDGrupo').Value := PadreIDGrupo;
        QryItems.Open;
        QryItems.First;

        while not QryItems.Eof do // Crear los ítems dentro del grupo
        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 owner is the form
            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);

            // Add the correct control to the group, linked to the ActionClientItem
            if QryItems.FieldByName('tipo_control').AsString = 'LARGEBUTTON' then
            begin
              Bg := TRibbonLargeButtonControl.Create(Group); // Group as owner
              Bg.ActionClient := BarAction;
            end
            else if QryItems.FieldByName('tipo_control').AsString = 'SMALLBUTTON' then
            begin
              Bs := TRibbonSmallButtonControl.Create(Group); // Group as owner
              Bs.ActionClient := BarAction;
            end;
          end;
          QryItems.Next;
        end;

        QryItems.Close; // Close the query for items

      end; // End of if tipo = 'GRUPO'
      QrySubMenu.Next;
    end;
    QrySubMenu.Close; // Cerrar la consulta de grupos
    QryMenu.Next;
  end;

  if ribMenu.Tabs.Count >= 2 then
  begin
    // Simular click en la segunda pestaña (índice 1)
    ribMenu.TabIndex := 1;
    ribMenu.TabIndex := 0;
  end;

  ribMenu.Refresh;
  QryMenu.Close; // Cerrar la consulta de pestañas
end;

Muchas pero mucha suerte en sus proyectos el mio acaba de empezar asi que preparense para una tanda de preguntadera


La franja horaria es GMT +2. Ahora son las 14:08:40.

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