Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Deshabilitar TMainMenu (https://www.clubdelphi.com/foros/showthread.php?t=93389)

Angel.Matilla 05-09-2018 11:22:38

Deshabilitar TMainMenu
 
¿Existe la posibilidad de deshabilitar un TMainMenu por código sin tener que ir yendo opción por opción? He estado mirando y TMainMenu no tiene la propiedad Enabled a nivel de elemento.

dec 05-09-2018 12:20:36

Hola a todos,

¿Deshabilitar todo el menú? Si no se pudiese, tal vez ocultarlo... Personalmente, suelo utilizar "acciones" que luego asocio a los elementos del menú correspondientes: dichas acciones tienen un evento "OnUpdate" muy útil, porque, permite determinar si el elemento en cuestión, la misma acción, debe estar habilitada o no. Así, cada uno de los elementos se habilitan y deshabilitan dependiendo de si sus acciones correspondientes pueden llevarse a cabo o no.

Sé que con esto no respondo a tu pregunta, pero, en fin, igual algún otro compañero puede aportar otra cosa. :)

RRenault 05-09-2018 15:12:39

Saludos
 
Código Delphi [-]
var
Contador, Indice : Integer;
begin
   with Form1 Do begin
          Contador := Form1.ComponentCount;
          for Indice := 0 to Contador - 1 do begin

          if (Form1.Components[Indice] is TMenuItem) then begin
              TMenuItem( FindComponent ( Form1.Components[Indice].Name) ).Enabled := False;
              TMenuItem( FindComponent ( Form1.Components[Indice].Name) ).Visible := False;
          end;

     end;
  end;

Angel.Matilla 05-09-2018 18:33:51

Lo imaginaba. Gracias a los dos por las respuestas.

ecfisa 05-09-2018 20:21:02

Hola.

Otras alternativas:

1.-
Código PHP:

...

void MainMenuEnabled(TMainMenu *mmbool On true)
{
   for( 
int i 0mm->Items->Counti++ )
    
mm->Items->Items[i]->Enabled On;
}

// Ej. de uso:
void __fastcall ...
{
  
MainMenuEnabled(MainMenu1false);  // disabled
  
MainMenuEnabled(MainMenu1);         // enabled    
... 

2.-
Código PHP:

...

class 
TMainMenuEx : public TMainMenu
{
private:
  
SetMainMenuOnOff(const bool On true)
  {
    for( 
int i 0Items->Counti++ )
      
Items->Items[i]->Enabled On;
  }
public:
  
__property bool Enabled = { write SetMainMenuOnOff };
};

// Ej. uso:
void __fastcall ...
{
  
TMainMenuEx *mme static_cast<TMainMenuEx*>(MainMenu1);

  
mme->Enabled false// disabled
  
mme->Enabled true;  // enabled
... 

Saludos :)

bucanero 06-09-2018 11:05:46

hola

una forma simple de ocultar un MainMenu sin alterar sus elementos es asignando NULL a la propiedad menú del formulario contenedor. Esto funciona bien en DELPHI, imagino que al ser los objetos en C++ similares también debería de funcionar

Código Delphi [-]
    procedure SetMainMenuEnabled(const Value: Boolean);
    function GetMainMenuEnabled: Boolean;
...

    property MainMenuEnabled:Boolean read GetMainMenuEnabled write SetMainMenuEnabled;


...

procedure TForm1.SetMainMenuEnabled(const Value: Boolean);
begin
  if value then
    Menu := MainMenu1
  else
    Menu := nil;
end;

function TForm1.GetMainMenuEnabled: Boolean;
begin
  Result := assigned(menu);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MainMenuEnabled := not MainMenuEnabled;
end;

ecfisa 06-09-2018 19:29:23

Hola bucanero.

Si esa también es otra opción que funciona perfectamente en C++ Builder.
Pero como bién indicas, no desactiva el TMainMenu sino que cambia su visibilidad.

Saludos :)


La franja horaria es GMT +2. Ahora son las 18:30:51.

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