Newsgroup: it.comp.lang.delphi
Titolo: Creare TreeView da PopUpMenu (senza Jedi) - XE2 Win32

Naturalmente potrei usare JvTreeView tramite la proprietà Menu ed 
aggangiare un PopUpMenu : TreeView1.Menu := PopUpMenu1; ma non fa parte 
delle esigenze (creano il PopUpMenu leggendo un file esterno, non 
importa il perche').
 
Ho trovato il modo di farlo, ma ci sono alcune controindicazioni
-1- non so a priori quanti sub nodi ci saranno
-2- per leggere i nodi figli devo leggere un'array
 
if PopUpMenu1.Items[i1][i2][i3].Count > 0  then
 
non esiste un modo migliore ?
 
se volessi trasportarlo su FireMonkey non funzionerebbe.
 
Maurizio
 
 
procedure TForm1.Button1Click(Sender: TObject);
var i1,i2,i3,i4,i5: integer;
begin
   Memo2.Clear;
   for i1 := 0 to PopUpMenu1.Items.Count - 1 do
     begin
      Memo2.Lines.Add(PopUpMenu1.Items[i1].Caption);
      Panel1.Caption := IntToStr(PopUpMenu1.Items.Count - 1);
 
     //Sub Nodo 1
     Panel1.Caption := IntToStr(PopUpMenu1.Items[i1].Count);
     if PopUpMenu1.Items[i1].Count > 0  then
       begin
         for i2  := 0 to PopUpMenu1.Items[i1].Count - 1 do
           begin
             Memo2.Lines.Add('--> ' + PopUpMenu1.Items[i1][i2].Caption);
 
             //sub nodo 2
             if PopUpMenu1.Items[i1][i2].Count > 0  then
               begin
                 for i3 := 0 to PopUpMenu1.Items[i1][i2].Count - 1 do
                   begin
                     Memo2.Lines.Add('------> ' + 
PopUpMenu1.Items[i1][i2][i3].Caption);
 
                     //sub nodo 3
                     if PopUpMenu1.Items[i1][i2][i3].Count > 0  then
                       begin
                         for i4 := 0 to 
PopUpMenu1.Items[i1][i2][i3].Count - 1 do
                           Memo2.Lines.Add('--------> ' + 
PopUpMenu1.Items[i1][i2][i3][i4].Caption);
                       end;
                   end;
               end;
           end;
       end;
     end;
end;

 Naturalmente potrei usare JvTreeView tramite la proprietà Menu [...]
 
La tua domanda è abbastanza ingarbugliata e non si capisce esattamente quale sia il problema che poni, oltre al fatto che aggiungi una ulteriore domanda riguardo la portabilità su "FireMonkey".
 
Secondo me, dovresti porre i quesiti tenendo conto che chi legge non è a conoscenza dello scenario in cui ti trovi se non descrivi con cura quali sono le sue caratteristiche.
 
Qual è la funzionalità che devi implementare nello specifico? Cosa devi ottenere esattamente? In quale contesto si colloca?
 
-- 
MARCO BREVEGLIERI
#Home: 
http://www.marco.breveglieri.name
 
#Blog: 
http://www.compilaquindiva.net
 


Hai ragione, faccio un po' di chiarezza:
 
eiste un progetto (non mio) che per vari motivi crea a runtime i 
PopUpMenu leggendo i titoli che compariranno sui vati Items del 
TPopUpMenu da un database.
 
Scopo:
- leggere il contenuto del TPopupMenu (che evidentemente non puo' essere 
toccato - ereditato da altro form).
 
- creare un TreeView leggendo gli Items del TPopUpMenu (ma questo non e' 
il problema).
 
Problema:
- trovare un modo piu' semplice o meno ingarbugliato per leggere i vari 
  figli.
 
es: una struttura simile ha già 3 livelli
 
A
B
C -- 1          <----- livello figli i1
   .. 2
   ..... 21      <----- livello figli i2
   ..... 22
   ..... 23
   ......... 231 <----- livello figli i3
   ......... 232
   .. 3
D
 
e per leggere il testo (231 e 232) devo leggere anche gli array 
precedenti [i1][i2]
 
//sub nodo 3
if PopUpMenu1.Items[i1][i2][i3].Count > 0  then
begin
   for i4 := 0 to PopUpMenu1.Items[i1][i2][i3].Count - 1 do
       Memo1.Lines.Add('--------> ' + 
PopUpMenu1.Items[i1][i2][i3][i4].Caption);
end;
 
la richiesta e' se si ci siano modi alternativi a questo 
PopUpMenu1.Items[i1][i2][i3] che mi pare davvero brutto.
 
spero sia piu' chiaro.

 PopUpMenu1.Items[i1][i2][i3] che mi pare davvero brutto.
 
Se devi localizzare un elemento specifico di un sottomenu in modo diretto, non ci sono molte alternative rispetto allo specificare le coordinate del menu stesso come indici dell'elemento padre, del padre di quest'ultimo e così via.
 
Se invece devi costruire una logica che genericamente vada a esplorare la struttura gerarchica dei menu con qualunque profondità, allora puoi scrivere una procedura ricorsiva.
 
Ciao,
  Marco.
