Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   PopupMenu en modo de ejecución (https://www.clubdelphi.com/foros/showthread.php?t=94185)

chinchan 20-09-2019 19:21:40

PopupMenu en modo de ejecución
 
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:

Código Delphi [-]
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

Código PHP:

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

#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(TComponentOwner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif 

Código PHP:

//---------------------------------------------------------------------------  
#include <vcl.h> 
#pragma hdrstop 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponentOwner)
  : 
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,

Cita:

Empezado por chinchan (Mensaje 533558)
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

Cita:

Empezado por dec (Mensaje 533559)
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:
Código PHP:

MyPopupMenu = new TPopupMenu(0); 

Y para destrir en C++
Código PHP:

delete MyPopupMenu 


Saludos.

dec 23-09-2019 16:16:13

Cita:

Empezado por escafandra (Mensaje 533561)
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:
Código PHP:

MyPopupMenu = new TPopupMenu(0); 

Y para destrir en C++
Código PHP:

delete MyPopupMenu 


Saludos.

^\||/ ^\||/


La franja horaria es GMT +2. Ahora son las 21:27:09.

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