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 Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-02-2017
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
Caption de un menú

Tal vez os parezca un poco enrevesado el método, pero no se me ha ocurrido uno mejor.

Tengo el menú de la imagen (es un TPopUpMenu que monto de forma dinámica en función de un TRadioGroup), por ejemplo:



Cada una de las opciones del mismo tiene un valor Tag diferente dependiendo del contenido de la opción (70, 7111, 7112, etc.); el primer dígito indica él ItemIndex del TRadioGroup, el segundo la primera opción del menú (Desconocida, etc.) y los otros, si los hay, la opción de cada uno de los siguiente submenús. Parece un poco complejo, pero es fácil en serio.

Por necesidades de la aplicación, para no tener que estar añadiendo código complejo e innecesario, me intesaría poder sacar el caption de la primera opción del menú. Por ejemplo: si he seleccionado Banco > Ctas. correctas > Por entidad me interesa quedarme con el valor Banco. Hay que tener en cuenta que las opciones pueden variar de una ejecución a otra.

En el evento OnClick del menú tengo definido esto:
Código:
void __fastcall TfLisPer::MenuClick(TObject *Sender)
{
     TMenuItem *mOpcLis = ((TMenuItem *)Sender);
     RadioGroup1->Tag = mOpcLis->Tag;
     RadioGroup1Exit(NULL);
     return;
}
//---------------------------------------------------------------------------
pero cuando voy a coger el caption con
Código:
Query->ParamByName("Literal")->AsString = mOpcLis->Items[cOpcion.c_str()[0] - 48]->Caption;
Ese cOpcion guarda el tag del TMenuItem seleccionado como un AnsiString. Al pasar por esa línea de código me da un error Menu index out of range.

En esencia ¿Cómo pudo acceder al caption de las opciones de nivel superior en un TPopUpMenu?
Responder Con Cita
  #2  
Antiguo 08-02-2017
bitbow bitbow is offline
Miembro
 
Registrado: jul 2006
Posts: 366
Poder: 18
bitbow Va camino a la fama
Con el parent puedes acceder al elemento padre y asi hasta encontrar la raiz.

ShowMessage(TMenuItem(Sender).Parent.Parent.Caption);

Adicional tendrias que validar que exista ese elemento para que no te tire error.

Saludos.
__________________
¡Ni como ayudarte Niño!!
bitbow
Responder Con Cita
  #3  
Antiguo 08-02-2017
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.195
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Lo siguiente asigna el Caption del formulario con el Caption del ItemMenu padre de toda la lista de submenús:

Código PHP:
void __fastcall TForm1::tres1Click(TObject *Sender)
{
  
TMenuItem *static_cast<TMenuItem*>(Sender);
  while(((
TMenuItem *)(I->Parent))->Parent)
    
= (TMenuItem *)(I->Parent);
 
Caption I->Caption;


Saludos.
Responder Con Cita
  #4  
Antiguo 08-02-2017
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.195
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Simplificando, no es necesario realizar tanto cast y se puede escribir así:

Código PHP:
void __fastcall TForm1::tres1Click(TObject *Sender)
{
  
TMenuItem *static_cast<TMenuItem*>(Sender);
  while(
I->Parent->Parent)
    
I->Parent;
  
Caption I->Caption;


Saludos.
Responder Con Cita
  #5  
Antiguo 09-02-2017
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 por las respuestas. Ayer, después de poner el mensaje y según apgaba el PC, me di cuenta de donde estaba equivocándome: Estaba buscando el Caption en la opción seleccionada y no en el menú definido. Por eso aparece el mensaje de error. En vez de
Código:
Query->ParamByName("Literal")->AsString = mOpcLis->Items[cOpcion.c_str()[0] - 48]->Caption;
tengo que poner
Código:
Query->ParamByName("Literal")->AsString = Menu->Items->Items[cOpcion.c_str()[0] - 48]->Caption;

Última edición por Angel.Matilla fecha: 09-02-2017 a las 10:53:13.
Responder Con Cita
  #6  
Antiguo 09-02-2017
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.195
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
El código que te puse localice el caprino que buscas sin liarte con valores guardados en tu tag, requiere menos código y sirve para cualquier situación.

Saludos.
Responder Con Cita
  #7  
Antiguo 09-02-2017
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
Sí, no te lo niego. El problema es que el menú es dinámico y sus valores dependen de una serie de opciones que no tienen por qué repetirse; por eso es el follón de usar los tag de las opciones.
Responder Con Cita
  #8  
Antiguo 09-02-2017
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.195
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por Angel.Matilla Ver Mensaje
Sí, no te lo niego. El problema es que el menú es dinámico y sus valores dependen de una serie de opciones que no tienen por qué repetirse; por eso es el follón de usar los tag de las opciones.
Es por eso por lo que hago el comentario. El código que propuse navega hasta el Ítem padre independientemente de las opciones existentes, sean dinámicas o no.

Saludos.
Responder Con Cita
  #9  
Antiguo 08-03-2017
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
Cita:
Empezado por escafandra Ver Mensaje
Código PHP:
void __fastcall TForm1::tres1Click(TObject *Sender)
{
  
TMenuItem *static_cast<TMenuItem*>(Sender);
  while(
I->Parent->Parent)
    
I->Parent;
  
Caption I->Caption;

Par no variar tenías razón en tu sugerencia; es muchísimo más sencilla.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Usar la tecla menú del movil para mostrar un menú cocute Desarrollo en Delphi para Android 0 06-06-2014 14:59:08
iconos para el el menu main o pop menu... vroa74 Gráficos 0 06-10-2008 16:54:56
Cambiar Caption Caral Varios 13 08-02-2008 15:22:13
Imagen o texto sobre el menu / menu con align / menu movible dajaji Varios 12 21-09-2007 01:30:19
Agregar un item de menu al "System Menu" Neftali [Germán.Estévez] Trucos 0 30-06-2006 18:59:41


La franja horaria es GMT +2. Ahora son las 15:13:08.


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