Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Coloboración Paypal con ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #5  
Antiguo 20-05-2025
steelha steelha is offline
Miembro
 
Registrado: mar 2012
Posts: 159
Poder: 15
steelha Va por buen camino
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
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Menu Dinamico Utilizando Componente dxnavbar steelha Varios 13 16-04-2024 01:39:01
Menú dinámico con JavaScript y PHP lucasarts_18 PHP 14 24-11-2007 21:13:54
¿Cómo puedo hacer un menú Ribbon en Turbo Delphi? handel777 Gráficos 3 13-08-2007 09:55:55
Main Menu Dinamico cahosoft Varios 2 30-06-2005 09:45:56
Menu dinamico xxxFALKORxxx OOP 1 23-03-2005 18:06:51


La franja horaria es GMT +2. Ahora son las 04:17:21.


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
Copyright 1996-2007 Club Delphi