PDA

Ver la Versión Completa : PopupMenu en modo de ejecución


chinchan
20-09-2019, 19:21:40
Hola. Tengo un programa en C++ que crea varios paneles en modo de ejecución, pero también quería (en modo de ejecución) crear y asociarles un PopupMenu con tres opciones (opacionA; OpnciónB y OpciónC). Llevo ya varias horas y no doy con la solución; me haríais el favor de echarme una mano?... !cada vez estoy más perdido!. Muchas Gracias!!!

dec
20-09-2019, 20:17:34
Hola a todos,

¿Dónde encuentras el problema? O sea, en qué punto... Sea como sea, la siguiente unidad, aunque de Delphi, acaso pueda ayudarte:


unit Unit1;

interface

uses
Vcl.Forms,
Vcl.Menus;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
// Manejador del evento click de nuestros items
procedure MenuItemClick(Sender: TObject);
private
// Nuestro PopupMenu
FPopupMenu: TPopupMenu;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

uses
Vcl.Dialogs;

procedure TForm1.FormCreate(Sender: TObject);
var
MenuItem: TMenuItem;
begin
// Creamos el PopupMenu
FPopupMenu := TPopupMenu.Create(nil);

// Creamos un item
MenuItem := TMenuItem.Create(FPopupMenu);
MenuItem.Caption := 'Opción A';
MenuItem.OnClick := Self.MenuItemClick;
FPopupMenu.Items.Add(MenuItem);

// Creamos otro item
MenuItem := TMenuItem.Create(FPopupMenu);
MenuItem.Caption := 'Opción B';
MenuItem.OnClick := Self.MenuItemClick;
FPopupMenu.Items.Add(MenuItem);

// Creamos el tercer item
MenuItem := TMenuItem.Create(FPopupMenu);
MenuItem.Caption := 'Opción C';
MenuItem.OnClick := Self.MenuItemClick;
FPopupMenu.Items.Add(MenuItem);

// Asignamos al formulario nuestro PopupMenu
Self.PopupMenu := FPopupMenu;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
// Destruimos nuestro PopupMenu
FPopupMenu.Free();
end;

procedure TForm1.MenuItemClick(Sender: TObject);
begin
// Mostramos el index del item al que se ha hecho click
ShowMessageFmt('Has pulsado en el item con index: "%d"',
[FPopupMenu.Items.IndexOf((Sender as TMenuItem))]);
end;

end.

escafandra
21-09-2019, 20:14:59
dec te ha puesto un ejemplo perfecto en delphi, si te parece y con su permiso, lo lo traduzco a C++ Builder


//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
private: // User declarations
TPopupMenu *MyPopupMenu;
void __fastcall MenuItemClick(TObject *Sender);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif



//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
TMenuItem *MenuItem;
MyPopupMenu = new TPopupMenu(this);
// Creamos un item
MenuItem = new TMenuItem(MyPopupMenu);
MenuItem->Caption = "Opción A";
MenuItem->OnClick = MenuItemClick;
MyPopupMenu->Items->Add(MenuItem);

// Creamos otro item
MenuItem = new TMenuItem(MyPopupMenu);
MenuItem->Caption = "Opción B";
MenuItem->OnClick = MenuItemClick;
MyPopupMenu->Items->Add(MenuItem);

// Creamos el tercer item
MenuItem = new TMenuItem(MyPopupMenu);
MenuItem->Caption = "Opción C";
MenuItem->OnClick = MenuItemClick;
MyPopupMenu->Items->Add(MenuItem);

// Asignamos al formulario nuestro PopupMenu
PopupMenu = MyPopupMenu;

}
//---------------------------------------------------------------------------

void __fastcall TForm1::MenuItemClick(TObject *Sender)
{
TMenuItem *MenuItem = dynamic_cast<TMenuItem*>(Sender);
if(MenuItem)
ShowMessageFmt("Has pulsado en el item con index: \"%d\"", ARRAYOFCONST((PopupMenu->Items->IndexOf(MenuItem))));
}
//---------------------------------------------------------------------------







Saludos.

dec
22-09-2019, 11:10:49
Hola a todos,

Ahora este hilo también sirve para comparar el código de C++ con el de Delphi. Gracias escafandra. :)

chinchan
23-09-2019, 13:12:05
Hola. Muchísimas gracias.!!!!... todo perfecto y funcionando... y lo que es mejor, creo que lo he entendido.

dec
23-09-2019, 13:30:26
Hola a todos,

Hola. Muchísimas gracias.!!!!... todo perfecto y funcionando... y lo que es mejor, creo que lo he entendido.

Eso está bien. :) Quizás lo que pueda llamar la atención (al menos en el código Delphi...) es que el PopupMenu lo creamos sin "owner", es decir, seremos nosotros quienes tendremos que hacernos cargo de la destrucción del PopupMenu, como lo hacemos en el evento "Destroy" del formulario. Sin embargo, los items sí que tienen "owner", el propio PopupMenu, de modo que dejamos a este que se encargue de su destrucción cuando ya no sean necesarios.

escafandra
23-09-2019, 15:34:13
Hola a todos,



Eso está bien. :) Quizás lo que pueda llamar la atención (al menos en el código Delphi...) es que el PopupMenu lo creamos sin "owner", es decir, seremos nosotros de hacernos cargo de la destrucción del PopupMenu, como lo hacemos en el evento "Destroy" del formulario. Sin embargo, los items sí que tienen "owner", el propio PopupMenu, de modo que dejamos a este que se encargue de su destrucción cuando ya no sean necesarios.

Ocurre lo mismo en C++ Builder. No fui completamente fiel en la traducción y preferí una destrucción automática. Podemos escribir esto, pero tendremos que destruirlo luego explicitamente:

MyPopupMenu = new TPopupMenu(0);

Y para destrir en C++
delete MyPopupMenu


Saludos.

dec
23-09-2019, 16:16:13
Ocurre lo mismo en C++ Builder. No fui completamente fiel en la traducción y preferí una destrucción automática. Podemos escribir esto, pero tendremos que destruirlo luego explicitamente:

MyPopupMenu = new TPopupMenu(0);

Y para destrir en C++
delete MyPopupMenu


Saludos.

^\||/ ^\||/