Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   popupmenu, menuitems y eventos (https://www.clubdelphi.com/foros/showthread.php?t=82122)

cd.rafael 30-01-2013 02:04:00

popupmenu, menuitems y eventos
 
Cordial Saludo,

Solicito colaboración para resolver el siguiente tema:

Quiero generar un menú con base en los PopUpMenus contenidos en un Form. Ej.

(POPUPMENU)

Menu1 -> SubMenu1
--------> SubMenu2
Menu2 -> SubMenu3
--------> SubMenu4 -> SubMenu5
--------> SubMenu6
Menu3 -> SubMenu7
Menu4

El menú que se quiere crear es con un Ribbon (no fue decisión mia). La idea es que todos los menús y submenús que tengan eventos, se vuelvan botones en el ribbon.

Lo que no tengo ni idea es como hacer para leer la jerarquía de menús y submenús para q con los menús armar grupos y con los submenús los botones de cada grupo y además asignarle a cada OnExecute de cada uno de los TAction los eventos OnClick del SubMenú.



Agradezco de Antemano toda la colaboración que me puedan brindar.

cd.rafael 30-01-2013 20:32:16

Cordial Saludo,

Logré realizar el armado del Menú Ribbon, pero ahora tengo problemas de Access Violation cuando cierro el form (MDICHILD). A continuación pongo el código para ver si alguien me puede indicar en dónde estoy cometiendo un error. Cabe anotar que en el evento close del formulario libero los objetos.

Los objeto globales son:

Código:

crpOpPagina: TCustomRibbonPage;
rtiOpTab:    TRibbonTabItem;
rgpOpciones: array of TRibbonGroup;
aclOpLista:  TActionList;
actOpciones: array of TAction;

Código:

var
    mniMenu:  TMenuItem;
    i, j:    integer;
    lBlItems: Boolean;
begin
    //Creación del ActionList
    aclOpLista := TActionList.Create(self);
    aclOpLista.Name := 'OpcionesForma';

    //Crear Página (TAB) Ribbon
    with FrmPrincipal.Ribbon1.Tabs.Add do
    begin
        Caption := 'Opciones Forma';
        KeyTip := 'OpcionesForma';
    end;

    crpOpPagina := FrmPrincipal.Ribbon1.Tabs[FrmPrincipal.Ribbon1.Tabs.Count - 1].Page;

    //Crear Grupos Ribbon
    for i := 0 to ComponentCount - 1 do
    begin
        if (Components[i].ClassName = 'TMenuItem') then
        begin
            if (TMenuItem(Components[i]).Caption <> '-') then
            begin
                if (Length(Trim(TMenuItem(Components[i]).Parent.Caption)) = 0) then
                begin
                    SetLength(rgpOpciones, Length(rgpOpciones) + 1);
                    rgpOpciones[Length(rgpOpciones)] := TRibbonGroup.Create(crpOpPagina.Parent);
                    rgpOpciones[Length(rgpOpciones)].Caption := TMenuItem(Components[i]).Caption;
                    rgpOpciones[Length(rgpOpciones)].Parent := crpOpPagina;
                    rgpOpciones[Length(rgpOpciones)].ActionManager := FrmPrincipal.MnuPrincipal;
                    rgpOpciones[Length(rgpOpciones)].KeyTip := TMenuItem(Components[i]).Caption;
                    rgpOpciones[Length(rgpOpciones)].Enabled := true;
                    rgpOpciones[Length(rgpOpciones)].Rows := 2;
                    rgpOpciones[Length(rgpOpciones)].GroupAlign := gaVertical;
                    with FrmPrincipal.MnuPrincipal.ActionBars.Add do
                    begin
                        lBlItems := False;
                        ActionBar := rgpOpciones[Length(rgpOpciones)];
                        //Crear las Opciones para cada grupo
                        for j := 0 to ComponentCount - 1 do
                        begin
                            if (Components[j].ClassName = 'TMenuItem') then
                            begin
                                mniMenu := TMenuItem(Components[j]);
                                while (Length(Trim(mniMenu.Parent.Caption)) > 0) do
                                begin
                                    if (mniMenu.Parent.Caption = TMenuItem(Components[i]).Caption) then
                                    begin
                                        SetLength(actOpciones, Length(actOpciones) + 1);
                                        actOpciones[Length(actOpciones)] := TAction.Create(aclOpLista);
                                        actOpciones[Length(actOpciones)].Name := mniMenu.Name;
                                        actOpciones[Length(actOpciones)].OnExecute := mniMenu.OnClick;
                                        with Items.Add do
                                        begin
                                        Action := actOpciones[Length(actOpciones)];
                                        KeyTip := mniMenu.Caption;
                                        Caption := mniMenu.Caption;
                                        CommandStyle := csButton;
                                        (CommandProperties as TButtonProperties).ButtonSize := bsLarge;
                                        ImageIndex := 49;
                                        Enabled := mniMenu.Enabled;
                                        end;
                                        lBlItems := true;
                                    end;
                                    mniMenu := mniMenu.Parent;
                                end;
                            end;
                        end; //--for j := 0 to ComponentCount - 1 do
                        if (not lBlItems) then
                        begin
                            mniMenu := TMenuItem(Components[i]);
                            SetLength(actOpciones, Length(actOpciones) + 1);
                            actOpciones[Length(actOpciones)] := TAction.Create(aclOpLista);
                            actOpciones[Length(actOpciones)].Name := mniMenu.Name;
                            actOpciones[Length(actOpciones)].OnExecute := mniMenu.OnClick;
                            with Items.Add do
                            begin
                                Action := actOpciones[Length(actOpciones)];
                                KeyTip := mniMenu.Caption;
                                Caption := mniMenu.Caption;
                                CommandStyle := csButton;
                                (CommandProperties as TButtonProperties).ButtonSize := bsLarge;
                                ImageIndex := 49;
                                Enabled := mniMenu.Enabled;
                            end;
                        end;
                    end; //--with FrmPrincipal.MnuPrincipal.ActionBars.Add do
                end;
            end;
        end;
    end;
    //
    crpOpPagina.Refresh;
    crpOpPagina.SetFocus;
end;

Muchas gracias.

cd.rafael 30-01-2013 21:00:11

Cordial Saludo,

Ya encontré el error. Debe ser causa del cansancio por tanto trabajo que tengo.

En las referencias a los array me estoy pasando por uno los índices:


Código:

//En vez de
rgpOpciones[Length(rgpOpciones)]
actOpciones[Length(actOpciones)]

//debe ser
rgpOpciones[Length(rgpOpciones) - 1]
actOpciones[Length(actOpciones) - 1]

Espero que esto pueda servir de ayuda a alguien.

Muchas gracias.

Neftali [Germán.Estévez] 31-01-2013 08:47:26

Movido de foro.


La franja horaria es GMT +2. Ahora son las 21:05:37.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi