| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Mie 27 Ene, 2010 7:30 pm Asunto: MDI a Popup |
|
|
Hola amigos del foro
Me he encontrado con la necesidad de crear formularios MDI, cuando creo los formularios para verlos en un menu creo un MainMenu, asocio WindowMenu del formualario a el item del MainMenu y asi puedo ver una lista de ventanas MDI abiertas. Pero por cuestiones de estetica no puedo agregar un menu al programa y quiciera poder agregar esas ventans MDI a un PopupMenu, pero por mas que intento no se como agregarle un Item a un PopupMenu, alguien me puede ayudar en este tema por favor...el codigo que tengo para crear las ventanas MDI es asi
funcion
| Código: | bool __fastcall TfrmMain::OpenChild (String name){
for (int i = 0; i <MDIChildCount>Name == name) {
return true;
}
}
return false;
} |
llamada a la ventana MDI
| Código: |
if (!OpenChild("frmMarca")) {
Application->CreateForm(__classid(TfrmMarca), &frmMarca);
}else
frmMarca->BringToFront(); |
_________________ Todos somos ignorantes, lo que no todos ignoramos lo mismo... |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Mie 27 Ene, 2010 11:50 pm Asunto: |
|
|
| Código: | TMenuItem* Item;
Item = new TMenuItem(this);
Item->Caption = "Lo que quieras";
Item->OnClick = PopupMenuClick; // Función evento de tratamiento que decidas;
PopupMenu->Items->Add(Item); |
Saludos. |
|
| Volver arriba |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Jue 28 Ene, 2010 12:52 pm Asunto: |
|
|
Hola sacafandra, gracioas por la respuesta, ahora me surge una duda y es como le hago a lo del evento, imaginate que tenga 10 forms MDI y al crearse estas yo le este agregando un item a popupMenu por cada ventana, luego quiciera Traer al frente BringToFront() la ventana X y como vez ya me lio.No se cuantas ventanas MDI creara el usurio y por lo tanto no se cuantos eventos on click debo crear....? Tienes alguna sugerencia.? _________________ Todos somos ignorantes, lo que no todos ignoramos lo mismo... |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Jue 28 Ene, 2010 2:14 pm Asunto: |
|
|
| ifrit escribió: | | ...No se cuantas ventanas MDI creara el usurio y por lo tanto no se cuantos eventos on click debo crear....? Tienes alguna sugerencia.? |
Si, crea un sólo evento.
El Evento OnPopup es del tipo TNotifyEvent , es decir, recive el objeto que lo envía. Dicho en otras palabras la función de definiría así:
| Código: | void __fastcall TForm1::PopupMenuPopup(TObject *Sender); |
De forma que Sender te indica el MenuItem:
| Código: | TMenuItem* Item = static_cast<TMenuItem*>(Sender); |
De esta forma tu evento podría ser algo así:
| Código: | void __fastcall TForm1::PopupMenuPopup(TObject *Sender)
{
TMenuItem* Item = static_cast<TMenuItem*>(Sender);
// Tu código....
}
|
Saludos. |
|
| Volver arriba |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Jue 28 Ene, 2010 2:27 pm Asunto: |
|
|
Hola escafandra, gracias por responder nuevamente, ya vi el codigo y lo probe, efectivamente funciona ok, muchas gracias.
 _________________ Todos somos ignorantes, lo que no todos ignoramos lo mismo... |
|
| Volver arriba |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Jue 28 Ene, 2010 2:36 pm Asunto: |
|
|
Escafandra, como podria recorrer el popupmenu para saber los distintos captions de los menuitems agregados? _________________ Todos somos ignorantes, lo que no todos ignoramos lo mismo... |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Jue 28 Ene, 2010 3:48 pm Asunto: |
|
|
| ifrit escribió: | | Escafandra, como podria recorrer el popupmenu para saber los distintos captions de los menuitems agregados? |
| Código: |
for(int n=0; n<PopupMenu->Items->Count; n++){
PopupMenu->Items->Item[n];
}
|
Saludos. |
|
| Volver arriba |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Jue 28 Ene, 2010 4:36 pm Asunto: |
|
|
Hola escafandra, no me da resultado
1-Poniendo el codigo tal y cual me lo das me dice :
[BCC32 Error] Unit1.cpp(21): E2316 'Item' is not a member of 'TMenuItem'
Full parser context
Unit1.cpp(1 : parsing: void _fastcall TForm1::Button1Click(TObject *)
2-si pongo en vez de me compila pero me dice: acces violation of code....
3-si pongo | Código: | ShowMessage(PopupMenu->Items->Items[n]->Caption); | me da el mismo error..
Alguna sugerencia migo? _________________ Todos somos ignorantes, lo que no todos ignoramos lo mismo... |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Jue 28 Ene, 2010 7:46 pm Asunto: |
|
|
| Código: | for(int n=0; n<PopupMenu->Items->Count; n++)
ShowMessage(PopupMenu->Items->Items[n]->Caption); |
Saludos. |
|
| Volver arriba |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Jue 28 Ene, 2010 8:37 pm Asunto: |
|
|
Es cierto escafandra, funciona muy bien . He estado trabajando algo y me quedan problemas , en el form Principal (el padre) creo los form MDI y agrego un item al popupmenu, cuando cierro el form MDI con antes de eso recorro los items del form Padre y elimino el item que tenga igual caption que el nombre que el form MDI pero al ir al formulario padre el popup sigue mostrandome el caption del item eliminado, como si no ubiese ocurrido nada..., lo compuebo pues tengo un bootn con la opcion popupmenu al popup donde agregue el item...Alguna idea.
Muchas gracias de antemano. _________________ Todos somos ignorantes, lo que no todos ignoramos lo mismo... |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Jue 28 Ene, 2010 8:56 pm Asunto: |
|
|
| Código: | for(int n=0; n<PopupMenu->Items->Count; n++)
if(Borrado == PopupMenu->Items->Items[n]->Caption){
PopupMenu1->Items->Delete(n);
break;
}
|
Saludos. |
|
| Volver arriba |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Jue 28 Ene, 2010 9:39 pm Asunto: |
|
|
Escafandra ese mismo es el codigo que tengo escrito en el form MDI haciendo referencia al PopupMenu del formulario padre, pero nada...
Te cuento por pasos:
1-Creo un formulario MDI desde el Form1
| Código: | if (!Open("Form4")) {
Application->CreateForm(__classid(TForm4),&Form4);
TMenuItem* Item;
Item = new TMenuItem(this);
Item->Caption = Form4->Caption;
Item->OnClick = PopupMenuPopup;
PopupMenu1->Items->Add(Item);
}else
Form3->BringToFront(); |
2-Hago click derecho sobre el Form1 que tiene asignado como su PopupMenu el PopupMenu1 (al mismo que acaba de agregarsele un item) y me aparece Form4 (que es el caption del form MDI que se creo).
3-En el evento On close del Form4
| Código: | for(int n=0; n<Form1>PopupMenu1->Items->Count; n++)
if("Form4" == Form1->PopupMenu1->Items->Items[n]->Caption){
Form1->PopupMenu1->Items->Delete(n);
break;
}
Action = caFree; |
4-Cuando hago clic derecho sobre el Form1 aun sigue apareciendo Form4 (es decir que aun sigue el Item con Caption "Form4" en el PopupMenu1), es algo ilogico porque supuestamente acabo de eliminar ese Item no?
Bueno escafandra es ese el problema, espero me puedas seguri ayudando , muchas gracias. _________________ Todos somos ignorantes, lo que no todos ignoramos lo mismo... |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Vie 29 Ene, 2010 7:54 am Asunto: |
|
|
Para crear un Form en tiempo de ejecución debes tenerlo fuera de la lista de formularios autocreados de tu proyecto. La forma de crear el form es simplemente:
| Código: | new Form4(this); // siendo this el dueño contenedor MDI y Form4 un MDIchild |
| ifrit escribió: | Escafandra ese mismo es el codigo que tengo escrito en el form MDI haciendo referencia al PopupMenu del formulario padre, pero nada...
En el evento On close del Form4
| Código: | for(int n=0; n<Form1>PopupMenu1->Items->Count; n++)
if("Form4" == Form1->PopupMenu1->Items->Items[n]->Caption){
Form1->PopupMenu1->Items->Delete(n);
break;
}
Action = caFree; |
|
¿Has comprobado que ese código se ejecuta? ¿Cuantos PopupMenu tienes?. ¿El PopupMenu del que hablas es miembro de Form1?.
Saludos. |
|
| Volver arriba |
|
 |
ifrit Master


Registrado: 12 Jun 2007Mensajes: 509Ubicación: La Habana, Cuba
|
Publicado: Vie 29 Ene, 2010 12:43 pm Asunto: |
|
|
Hola escafandra,
| Cita: | | Para crear un Form en tiempo de ejecución debes tenerlo fuera de la lista de formularios autocreados de tu proyecto. |
Eso lo tengo presente, y es asi como lo tengo.
| Cita: | | La forma de crear el form es simplemente:new Form4(this); // siendo this el dueño contenedor MDI y Form4 un MDIchild |
Se que asi se pueden crear , pero yo los creo de la otra forma que mostre al inicio del tema. Si crees que no debo crearlos asi , sino como tu me indicas aca, ok sin problemas lo asumo, pero lo hacia de la otra forma pues fue como aprendi y me era mas sencillo hacer la pregunta por si estaba el formulario creado llevarlo al frente.
| Cita: | | ¿Has comprobado que ese código se ejecuta? |
Si ya lo probe, le puse unos puntos de ruptura y un ShowMessage(...) y mustra que lo ejecuta pero no hace lo deseado.
| Cita: | | ¿Cuantos PopupMenu tienes? ¿El PopupMenu del que hablas es miembro de Form1? |
Cada vez que me mandas codigo creo un proyecto desde cero para probar todo el codigo en limpio, solo tengo un PopupMenu que es miembro del Form1 (el form padre)
Te cuento algo muy curioso, si le doy click derecho al boton que tiene asignado el PopupMenu antes de crear la ventana MDI no mustra nada, creo la ventana y al dar clic derecho dice Form4, elimino la ventana y no lo dice mas...Ahora si primero creo la ventana MDI y luego doy clic derecho dice Form4, eleimino la ventana MDI, y doy clic derecho aun dice Form4...recorro el popup como me enseñastes y aun mustra el caption Form4 Esto me tiene molesto...y me pone a dudar mucho...
Escafandra, ya hicistes algunas pruebas??
Bueno epero me puedas seguir ayudando.[/quote] _________________ Todos somos ignorantes, lo que no todos ignoramos lo mismo... |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Vie 29 Ene, 2010 3:17 pm Asunto: |
|
|
| ifrit escribió: |
Te cuento algo muy curioso, si le doy click derecho al boton que tiene asignado el PopupMenu antes de crear la ventana MDI no mustra nada, creo la ventana y al dar clic derecho dice Form4, elimino la ventana y no lo dice mas...Ahora si primero creo la ventana MDI y luego doy clic derecho dice Form4, eleimino la ventana MDI, y doy clic derecho aun dice Form4...recorro el popup como me enseñastes y aun mustra el caption Form4 Esto me tiene molesto...y me pone a dudar mucho...
Escafandra, ya hicistes algunas pruebas?? |
Las pruebas que he hecho me funcionan bien. Claro que no están en tu entorno.
No se exactamente que es lo que haces. No se si tu popupmenu está creado dinámicamente o en fase de diseño. En este caso deberías crearlo en fase de diseño y añadir los Items dinámicamente. Te comento esto porque parece que te falla si no muestras tu menú antes de crear una MDIChild. Eso puede ser debido a algún tipo de error al crear el menú que impida una correcta comunicación con él.
Sin conocer mas no te puedo comentar mas cosas.
Saludos. |
|
| Volver arriba |
|
 |
|