Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: xinyiman - Febbraio 28, 2013, 07:35:20 pm

Titolo: Menu
Inserito da: xinyiman - Febbraio 28, 2013, 07:35:20 pm
Ciao ragazzi, secondo voi qual'è il metodo più elegante e veloce per rendere invisibile una voce di menù parametrizzabile?!

Ovvero io so che il menu si chiama

'Mnu_' + Variabile

Come fare per settare il visible a false?! al OnShow della form?!

Grazie
Titolo: Re:Menu
Inserito da: bonmario - Febbraio 28, 2013, 08:31:18 pm
Io queste cose le faccio nella OnCreate, a meno che nel tuo caso, durante l'esecuzione del programma possano cambiare le condizioni per mostrare o meno il menù.
Se non sbaglio, il codice inserito nell' OnShow, viene eseguito ogni volta che il form viene mostrato, quindi verrebbe rieseguito più volte durante l'esecuzione del programma. Messo nell'OnCreate verrebbe eseguito solo in partenza.

Ciao, Mario
Titolo: Re:Menu
Inserito da: xinyiman - Febbraio 28, 2013, 08:49:11 pm
si il mio varia in base al profilo utente
Titolo: Re:Menu
Inserito da: Stilgar - Febbraio 28, 2013, 09:13:47 pm
mmm
Ci sono 2 strade possibili.
1) Abilitare e disabilitare i menu item del main menu.
2) Aggiungere o meno gli item stessi.

Al posto di usare l'on show, non puoi metterlo proprio nel costruttore della form?
Se usi un pattern di tipo MVC sarà il controller a costruire il menu e la view ad agganciarlo dove serve.
Dentro il controller puoi applicare tutti i tuoi algoritmi ACL senza incasinare la form.

Stilgar
Titolo: Re:Menu
Inserito da: xinyiman - Febbraio 28, 2013, 09:18:13 pm
Il discorso è che queste voci di menù hanno già degli eventi associati e via discorrendo. Mi piacerebbe solo renderli visibili oppure no
Titolo: Re:Menu
Inserito da: Stilgar - Febbraio 28, 2013, 09:22:51 pm
Allora l'applicazione dell'ACL deve impattare sulla view, in modo che ci sia l'attribuzione del show/hide per menu item.
Tieni presente che il controller può attivare e costruire la view dopo aver fatto tutti i controlli di rito. In questo modo puoi anche non far partire minimamente la view, se ci sono errori di autenticazione ;)

Stilgar
Titolo: Re:Menu
Inserito da: xinyiman - Febbraio 28, 2013, 09:25:55 pm
Io ho provato questo

procedure TForm2.AbilitaVoceMenu(NomeMenu: string; Valore: boolean);
var
   i: integer;
begin
     i:=0;
     for i:=0 to Self.ControlCount-1 do
     begin
          if Self.Controls.Name=NomeMenu then
          begin
               Self.Controls.Visible:=Valore;
          end;
     end;
end;

Ma Self.ControlCount mi ritorna 1 quando in realtà sono davvero di più
Titolo: Re:Menu
Inserito da: Stilgar - Febbraio 28, 2013, 09:30:21 pm
Secondo me dovresti usare :
ComponentCount e non ControlCount.
Devi mettere a video anche altri componenti?
Altrimenti ti conviene partire dalla root del menu. Così eviti un sacco di controlli inutili su altri rami della gerarchia.
Titolo: Re:Menu
Inserito da: xinyiman - Febbraio 28, 2013, 09:32:16 pm
Secondo me dovresti usare :
ComponentCount e non ControlCount.
Devi mettere a video anche altri componenti?
Altrimenti ti conviene partire dalla root del menu. Così eviti un sacco di controlli inutili su altri rami della gerarchia.

Strada già percorsa ma non trovo il .Visible
Titolo: Re:Menu
Inserito da: Stilgar - Febbraio 28, 2013, 09:35:20 pm
Faccio 2 prove.
Titolo: Re:Menu
Inserito da: Stilgar - Febbraio 28, 2013, 09:37:04 pm
Codice: [Seleziona]
procedure TMainView.AbilitaVoceMenu(NomeMenu: string; Valore: boolean);
var
   i: integer;
begin
     i:=0;
     for i:=0 to Self.MainMenu1.Items.Count-1 do
     begin
          if Self.MainMenu1.Items[i].Name=NomeMenu then
          begin
               Self.MainMenu1.Items[i].Visible:=Valore;
          end;
     end;
end;
Ma che giro facevi con il codice?
EDIT:
Questo controlla solo il primo livello di menu (quello della barra, per capirci)
Ricordati che il menu è un albero. Va navigato tutto...
Titolo: Re:Menu
Inserito da: Stilgar - Febbraio 28, 2013, 09:45:29 pm
Prova:
Codice: [Seleziona]
procedure TMainView.FormCreate(Sender: TObject);
var
  indicePrimoLivello: integer;
begin
  indicePrimoLivello := 0;
  for indicePrimoLivello := 0 to Self.MainMenu1.Items.Count - 1 do
  begin
    if MainMenu1.Items[indicePrimoLivello].Count > 0 then
      AbilitaVoceMenu(Self.MainMenu1.Items[indicePrimoLivello], 'menuFileNuovoDocumento', False)
    else
    if SameText(MainMenu1.Items[indicePrimoLivello].Name, 'menuFileNuovoDocumento') then
    begin
      MainMenu1.Items[indicePrimoLivello].Visible := False;
    end;
  end;
end;

procedure TMainView.AbilitaVoceMenu(Item: TMenuItem; NomeMenu: string; Valore: boolean);
var
  indiceLivello: integer;
  test: TMenuItem;
begin
  indiceLivello := 0;
  for indiceLivello := 0 to Item.Count - 1 do
  begin
    test := Item.Items[indiceLivello];
    if test.Count > 0 then
      AbilitaVoceMenu(test, NomeMenu, Valore)
    else
    if SameText(test.Name, NomeMenu) then
    begin
      test.Visible := valore;
    end;
  end;
end;       
Titolo: Re:Menu
Inserito da: xinyiman - Febbraio 28, 2013, 09:48:33 pm
Codice: [Seleziona]
procedure TMainView.AbilitaVoceMenu(NomeMenu: string; Valore: boolean);
var
   i: integer;
begin
     i:=0;
     for i:=0 to Self.MainMenu1.Items.Count-1 do
     begin
          if Self.MainMenu1.Items[i].Name=NomeMenu then
          begin
               Self.MainMenu1.Items[i].Visible:=Valore;
          end;
     end;
end;
Ma che giro facevi con il codice?
EDIT:
Questo controlla solo il primo livello di menu (quello della barra, per capirci)
Ricordati che il menu è un albero. Va navigato tutto...

Ma così Self.MainMenu1.Items.Name mi restituisce "MainMenu1". Io voglio le voci del menu
Titolo: Re:Menu
Inserito da: Stilgar - Febbraio 28, 2013, 09:49:45 pm
Hai provato l'ultimo esempio?...
Titolo: Re:Menu
Inserito da: xinyiman - Febbraio 28, 2013, 09:51:36 pm
No ora provo e poi ti dico
Titolo: Re:Menu
Inserito da: Stilgar - Febbraio 28, 2013, 09:55:24 pm
(Funzia funzia)
Titolo: Re:Menu
Inserito da: xinyiman - Febbraio 28, 2013, 10:05:17 pm
Perfetto stilgar. Grazie mille   ;)
Titolo: Re:Menu
Inserito da: Stilgar - Febbraio 28, 2013, 10:08:04 pm
Di nulla.