Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Lun 14 Ene, 2008 1:53 pm Asunto: Crear CoolBar a partir de un TMenu |
|
|
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
 _________________
 |
|