Mensaje    Asunto: Crear CoolBar a partir de un TMenu Responder citando

Intentado NO TRABAJAR y tratando que la programación sea mas facil y placentera y como siempre he dicho, no soy muy fanatico del uso de componentes me di a la tarea de elaborar una funcion que permite crear una barra de Botones en el Formulario que se desee a partir de un componente TMenu.

la barra de botones toma la propiedad Tag de las opciones del Menú, para indicar si es mostrada o no la Opción del Menú dentro de la barra.

si la propiedad Tag tiene el valor de 1, la opción que la contenga se muestra, en caso contrario tenga 0 la opción no se muestra.

la funcion es si es la siguiente

Código:
void __fastcall CrearBotonesToolBar(TForm *pForm, TMenu *pMenu, enum TAlign pAlineacion )
{
   // si el Tag de la opcion es 1, no se muestra.
   int z;
   // TCoolBar
   TCoolBar *pCoolBar=NULL;
   // BUSCAMOS LA TCOOLBAR
   for(z=0; z< pForm->ComponentCount; z++)
   {
      Application->ProcessMessages();
      if(pForm->Components[z]->InheritsFrom(__classid(TCoolBar)))
      {
           // Si hay barra, la traemos
         pCoolBar = dynamic_cast< TCoolBar *>(pForm->Components[z]);
         break;
      }
   }
   // si no encontramos la barra, creamos una nueva con el parent
   // del Form
   if(pCoolBar == NULL)
   {
      pCoolBar = new TCoolBar(pForm);
   }
   // ponemos los valores a la Barra
   pCoolBar->Parent = pForm;
   pCoolBar->Align = (TAlign) pAlineacion;
   pCoolBar->BandBorderStyle = bsNone;
   pCoolBar->BandMaximize = bmNone;
   pCoolBar->Height = 41;
   pCoolBar->ParentColor = false;
   pCoolBar->ParentFont = false;
   // Buscamos la BARRA DE HERRAMIENTAS. TToolBar
   TToolBar *pToolBar=NULL;
   for(z=0; z< pCoolBar->ComponentCount; z++) // buscamos la barra
   {
      Application->ProcessMessages();
      String componente = pCoolBar->Components[z]->Name;
      if(pCoolBar->Components[z]->InheritsFrom(__classid(TToolBar)))
      {
           // si encontramos una barra la cargamos
         pToolBar = dynamic_cast< TToolBar *>(pCoolBar->Components[z]);
         break;
      }

   }
   // si no ha barra la creamos
   if(pToolBar == NULL)
   {
      pToolBar = new TToolBar(pCoolBar);
      pToolBar->AutoSize = true;
      pToolBar->Name = "ccsgBarraBotones";
      pToolBar->ParentColor = false;
      pToolBar->ParentFont = false;
      pToolBar->ShowCaptions = true;
      pToolBar->ShowHint = true;
      pToolBar->Flat = true;
   }
   // TCOOLBand
   if(!pCoolBar->Bands->Count) // si no hay bandas, se agrega una
   {
      pCoolBar->Bands->Add();
      pCoolBar->Bands->Items[0]->ImageIndex =-1;
      pCoolBar->Bands->Items[0]->BorderStyle = bsSingle;
      pCoolBar->Bands->Items[0]->Break = true;
      pCoolBar->Bands->Items[0]->FixedSize = true;
      pCoolBar->Bands->Items[0]->ParentBitmap = false;
      pCoolBar->Bands->Items[0]->ParentColor = false;
      pCoolBar->Bands->Items[0]->MinHeight = 43;
      pCoolBar->Bands->Items[0]->Control = pToolBar;
   }
   // si hay botones se borran
   if(pToolBar->ButtonCount)
   {
      for(int cc=0; cc < pToolBar->ButtonCount; cc++)
      {
         SendMessage(pToolBar->Handle, TB_DELETEBUTTON, SendMessage(pToolBar->Handle, TB_COMMANDTOINDEX, cc, 0), NULL);
         Application->ProcessMessages();
      }
   }
   TToolButton *pToolButtom;
   TMenuItem *pMenuItem;
   int a,b;
   for(a= pMenu->Items[0].Count-1; a>-1; a--)
   {
      Application->ProcessMessages();
      if(pMenu->Items[0].Items[a]->Count)
      {
         Application->ProcessMessages();
         /// Por cada comienzo del Menu metemos un Separador
         if(!pToolBar->FindComponent("ccsgSeparador"+IntToStr(a)))
         {
            pToolButtom = new TToolButton(pToolBar);
            pToolButtom->Parent   = pToolBar;
            pToolButtom->AutoSize = true;
            pToolButtom->Style = tbsSeparator;
            pToolButtom->Name = "ccsgSeparador"+IntToStr(a);
         }
         int b;
         for(b=pMenu->Items[0].Items[a]->Count-1; b >-1 ; b--)
         {
            Application->ProcessMessages();
            pMenuItem = dynamic_cast<TMenuItem*>(pMenu->Items[0].Items[a]->Items[b]);
            if(!pToolBar->FindComponent(pMenuItem->Name))
            {
               if(pMenuItem->Caption!="-" && pMenuItem->Tag == 1)
               {
                  // creamos un boton, mientras no es un separador
                  // y Ademas la propiedad tag, del menu esta puesta a 1
                  // esto significa que si tiene uno en el Tag
                  // se muestra en la CoolBar, si tiene cero en el tag
                  // la opcion del Menu NO se pone en la barra
                  pToolButtom = new TToolButton(pToolBar);
                  pToolButtom->Parent   = pToolBar;
                  pToolButtom->Name = pMenuItem->Name;
                  pToolButtom->ShowHint=true;
                  pToolButtom->ImageIndex =  pMenuItem->ImageIndex;
                  // ponemos el Hint
                  if(pMenuItem->Hint.IsEmpty())
                  {
                     pToolButtom->Hint = pMenuItem->Caption;
                  }
                  else
                  {
                     pToolButtom->Hint = pMenuItem->Hint;
                  }
                  //----------------------------
                  // ponemos el nombre del boton en el caption
                  pToolButtom->Caption = pMenuItem->Caption;
                  //----------------------------
                  // en el evento onClic, del Boton del la barra
                  // redireccionamos el evento del Menu. para que
                  // al presionar el boton, se vaya a la opcion del
                  // menu.
                  pToolButtom->OnClick =  pMenuItem->OnClick;
                  pToolButtom->Style = tbsButton;
                  if(pMenuItem->Count)
                  {
                     // si el menu tiene mas opciones.
                     // estas se meten con la ayuda de un
                     // popMenu para que al presionar el boton
                     // de el efecto que es un boton y el menu
                     TPopupMenu *pPopMenu = new TPopupMenu(NULL);
                     pPopMenu->Images = pMenu->Images;
                     for(int c=0;c<pMenuItem->Count;c++)
                     {
                        if(pMenuItem->Caption!="-")
                        {
                           TMenuItem *pMenuItem2 = new TMenuItem(NULL);
                           pMenuItem2->Caption = pMenuItem->Items[c]->Caption;
                           pMenuItem2->OnClick = pMenuItem->Items[c]->OnClick;
                           pMenuItem2->Name = "sb"+pMenuItem->Items[c]->Name;
                           pMenuItem2->ImageIndex = pMenuItem->Items[c]->ImageIndex;
                           pPopMenu->ParentBiDiMode = true;
                           pPopMenu->AutoPopup = true;
                           pPopMenu->Items->Add(pMenuItem2);
                        }
                     }
                     pToolButtom->DropdownMenu =pPopMenu;
                     pToolButtom->PopupMenu = pPopMenu;
                  }
                  pToolButtom->Enabled = pMenuItem->Enabled;
               }
            }
         }
         // Fin de la Opcion
      }
   }
   pToolBar->HotImages = pMenu->Images;
   pToolBar->Images = pMenu->Images;
   pCoolBar->AutoSize = true;
   pToolBar->Parent = pCoolBar;
}


El metodo de uso es relativamente sencillo, Pongamos un nuevo proyecto en nuestro IDE, dentro de él usar un componete TMenu y establecer las opciones deseadas, posteriormente si se desea aun que puede ser en el momento de Creacion del Form, pero usando un botón, y con el siguiente codigo pueden ver los resultados.

Código:
void __fastcall TForm::BotonClick(TObject *Sender)
{
      ::CrearBotonesToolBar(this,this->mmMenuPrincipal, alTop);
}


Como pueden ver a la función se le pasan 3 parametros.
1.- El form donde se va a crear
2.- el TMenu de donde se van a sacar las opciones
3.- el tipo de alineacion de la barra (top, bottom, left, right)

y el resultado es el siguiente


_________________
Cool