Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-02-2016
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Modificar TMenuItem

Tengo un componente TMenuItem en el que necesito, en función de unos parámetros, que en una de las opciones se cree un submenú. He estado probando esto:
Código:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
     TMenuItem *mItem0 = new TMenuItem(this);
     TMenuItem *mItem1 = new TMenuItem(this);

     for (int nItem = 0; nItem < MainMenu1->Items->Count; nItem ++)
     {
          if (StringReplace(MainMenu1->Items->Items[nItem]->Caption, "&", "", TReplaceFlags() << rfReplaceAll) == "Opción 8")
          {
               mItem0 = (TMenuItem *)this->Components[nItem];
               mItem0->Add(mItem1);
               mItem1->Caption = "Prueba 1";

               mItem0 = (TMenuItem *)this->Components[nItem];
               mItem0->Add(mItem1);
               mItem1->Caption = "Prueba 2";
               
               mItem0 = (TMenuItem *)this->Components[nItem];
               mItem0->Add(mItem1);
               mItem1->Caption = "Prueba 3";
               break;
          }
     }
}
Pero al tratar de insertar la segunda opción del submenú (Prueba 2) me salta este error:
Cita:
exception class EMenuError with message 'Menu inserted twice'
Además ese ítem Prueba 1 me lo inserta en la Opción 7 del TMainMenu en vez de en la que me interesa.
Responder Con Cita
  #2  
Antiguo 06-02-2016
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Vale. Parte del problema lo he solucionado. Simplemente se me había olvidado crear el nuevo TMenuItem.

Sin embargo, me sigue creando el submenú en la opción anterior a la que me interesa:
Código:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
     TMenuItem *mItem0 = new TMenuItem(this);
     TMenuItem *mItem1 = new TMenuItem(this);

     for (int nItem = 0; nItem < MainMenu1->Items->Count; nItem ++)
     {
          mItem0 = (TMenuItem *)this->Components[nItem];
          if (StringReplace(MainMenu1->Items->Items[nItem]->Caption, "&", "", TReplaceFlags() << rfReplaceAll) == "Opción 8")
          {
               mItem1 = new TMenuItem(mItem0);
               mItem0->Add(mItem1);
               mItem1->Caption = "Prueba 1";

               mItem1 = new TMenuItem(mItem0);
               mItem0->Add(mItem1);
               mItem1->Caption = "Prueba 2";

               mItem1 = new TMenuItem(mItem0);
               mItem0->Add(mItem1);
               mItem1->Caption = "Prueba 3";
               break;
          }
     }
}
Ahora no me da el error, pero sigue colgando el submenú de Opción 7. El primer elemento del menú ¿no es el ítem 0?
Responder Con Cita
  #3  
Antiguo 06-02-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Angel.Matilla
Cita:
Empezado por Angel.Matilla Ver Mensaje
...
Ahora no me da el error, pero sigue colgando el submenú de Opción 7. El primer elemento del menú ¿no es el ítem 0?
Fijate si este ejemplo es similar a lo que estas buscando.
Código PHP:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 for (
int i 08i++) {
    
TMenuItem *mi = new TMenuItem(MainMenu1);
    
mi->Caption "Opción &" IntToStr(i+1);
    
MainMenu1->Items->Add(mi);
  }
  
// mostrar leyenda e índice correspondiente en ListBox
  
for (int i 0MainMenu1->Items->Counti++)
    
ListBox1->Items->Add(MainMenu1->Items->Items[i]->Caption
      
"      " IntToStr(i)) ;
}

void __fastcall TForm1::CreateItems(const AnsiString parentCapt)
{
  for (
int i 0MainMenu1->Items->Counti++ ) {
    if (
MainMenu1->Items->Items[i]->Caption == parentCapt) {
      for (
int j 1<= 3j++) {
        
TMenuItem *mi = new TMenuItem(MainMenu1);
        
mi->Caption "Prueba " IntToStr(j);
        
MainMenu1->Items->Items[i]->Add(mi);
      }
      break;
    }
  }
}

void __fastcall TForm1::btSubItemsClick(TObject *Sender)
{
  
CreateItems("Opción &8");
  
btSubItems->Enabled False;

Salida:


Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 06-02-2016
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Sí, el primer elemento es cero.

No tiene sentido el error, porque comparas directamente con el caption "opción 8". El error debe estar por otro lado.

Por cierto, las dos primeras líneas sobra el "= new TMenuItem...", porque mItem0 lo vas a usar como puntero a un elemento ya creado. El mItem1, lo creas manualmente.

No pasa mucho porque has puesto que el dueño (Owner) será el Form, así que él lo destruirá cuando termine, pero no tiene sentido dejarlo así.

¿Para qué todo eso?
Entiendo que hace, pero no sé por qué lo haces.

Yo por ejemplo no me guiaría del caption de los menúes (es muy común que una vez terminada la aplicación, quieras cambiar un Caption, porque es más descriptivo que el original, hay 2 muy parecidos, etc), yo más bien:
- asignaría el "mItem0->Name" por código y es lo que usaría para buscar con FindComponent
- o simplemente mantendría un puntero al elemento que tendrá submenues, así no tienes que buscarlo en tiempo de ejecución (evitas el bucle principal por el TMainMenu).

Pero eso depende de qué flexibilidad quiere que tengas tus menús.

Podrías guardar el Name, Caption y Owner.name en la Base de datos, en un .ini o como quieras, evitas bucles y la programación es más simple.

Saludos.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 06-02-2016
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Gracias a los dos por los comentarios. Me han ayudado mucho.
Cita:
Empezado por Lepe Ver Mensaje
Por cierto, las dos primeras líneas sobra el "= new TMenuItem...", porque mItem0 lo vas a usar como puntero a un elemento ya creado. El mItem1, lo creas manualmente.
Cierto. Ya las eliminé.
Cita:
Empezado por Lepe Ver Mensaje
Entiendo que hace, pero no sé por qué lo haces.
Es que en función de otras opciones que se seleccionan en el formulario varían las opciones del menú. Una alternativa sería habilitar o no (Enabled true o false) las que se puedan elegir.
Responder Con Cita
Respuesta



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
TMenuItem en tiempo de ejecución PaFernan99 OOP 2 06-07-2008 13:30:23
Error en TmenuItem pmtzg Varios 1 28-11-2007 20:29:32
modificar con sql Cosgaya SQL 5 20-12-2005 00:27:51
ActiveX Form & TMenuItem neon Internet 0 15-11-2005 14:52:27
Invalid call typecast - As TMenuItem dmguridi Varios 4 14-01-2005 15:49:32


La franja horaria es GMT +2. Ahora son las 18:03:55.


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