Newsgroup: it.comp.lang.delphi
Titolo: Riportare TreeView allo stato iniziale

Salve, dovrei riportare una TreeView allo stato iniziale precisamente 
allo stato in cui non vi è stato inserito ancora nessun nodo.
Ho provato con Items.clear ma quando vado a ricaricare la Treeview 
dall'array mi restituisce un errore di indice.
Dani

Omega ha scritto:

Mostra un po' di codice.
Ciao
ACSH
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

vuoi dire che a runtime fai inserire nuovi nodi e nuovi figli?
------------------------
Diego Di Filippo
  R&amp;D Software Developer
 
www.ada-project.com
-----------------------
--- posted by geoForum on 
http://www.delphiedintorni.it

 dall'array mi restituisce un errore di indice.
Probabilmente, fai riferimento - attraverso l'indice - ad un elemento 
che non esiste e che non hai ancora creato, poichè hai "pulito" l'intera 
TreeView con il metodo /Clear/ di /Items/.
Come ha detto ACSH, se non ci mostri un po' di codice è difficile capire 
dove sia il problema e come risolverlo adeguatamente. :-)
-- 
Marco «Alka» Breveglieri
  (marco [@] abls [.] it)
  ABLS Team S.n.c. - Software & Web
  42019 Scandiano (Reggio Emilia)
 
http://www.abls.it

Volevo sapere se nel tuo programma facevi inserire degli item padre e poi 
dei figli xche se tu in un punto del tuo codice vuoi fare in modo che il 
treeview ritorni allo stato in cui non sono stati inseriti item dovresti :
1. Mettere in file la struttura iniziale del TreeView.
2. Caricarlo il file da codice.
3. Far inserire all'utente altri item.
4. Se vuoi ritornare allo stato iniziale riesegui il punto 2.
spero di averti aiutato...o almeno capito il problema!!!


 
La procedura che chiamo la prima volta per caricare la tree funziona 
proprio come mi aspetto in quanto la tree a runtime la prima volta è 
vuota. Quando poi cancello  per ricaricarla mi dà un errore di indice.
Non ho postato il codice perchè al quanto incomprensibile ma se può 
servire ecco il codice incriminato l'errore è compreso tra -------------:
procedure TfrmConfigprod.SpBtCaricaClick(Sender: TObject);
var
indice: integer;
secindice: integer;
indiceItem: integer;
cicliLivello: integer;//numero di volte che deve essere eseguito il ciclo di
//ricera livello
nodo: TTreeNode;
indiceNodi: integer;
nome: string;
nomeTmp: string;
LungNome: integer;
posizione: integer;
idprod: string;
begin
//ArRec carica da array scindendendo le categorie dalle macro
indice := 0;
secindice:=0;
cicliLivello:=0;
indiceItem:=0;
for indice := 0 to High(ArRec) do begin
	if ArRec[indice].livelloFiglio = '0' then begin
		nodo:=TrVCategorie.Items.Add(nil,ArRec[indice].nomeVis + ';' + 
IntToStr(ArRec[indice].codiceCatProd));//aggiungere codicecatprod
		//per l'estrazione di codicecatprod usare operazioni stringa
		Inc(indiceItem);
	end;
	if StrToInt(ArRec[indice].livelloFiglio) > cicliLivello then begin
		cicliLivello := StrToInt(ArRec[indice].livelloFiglio);
	end;
end;
indice:=0;
//secindice:=1;
indiceNodi:=0;
if ciclilivello > 0 then begin
	for secindice := 1 to cicliLivello do begin //utilizzare secindice per 
spostarsi nella ricerca
		indice := 0;
		for indice := 0 to indiceItem  do begin
------------------------------------------------------------------------
			nodo := TrVCategorie.Items[indice]; //qui genera l'errore
			nome := TrVCategorie.Items[indice].Text;//di controllo eliminare 
successivamente
------------------------------------------------------------------------
			posizione := Pos(';',nome);
					//prima lung tot poi sottrai da sinistra
			LungNome := Length(nome);
			nomeTmp := nome;
			nomeTmp:= RightStr(nomeTmp,LungNome - posizione);
 
       idprod := nometmp;
			indiceNodi:=0;
			for indiceNodi := 0 to High(ArRec) do begin
				 //seguire il livello con incremento 1 per l'associazione dei nodi
				 // al posto di codicecatprod preso da array dobbiamo assegnare al 
text di nodo principale il codicecatprod per l'associazione corretta
				 nome:= ArRec[indicenodi].nomeVis;
				 if (ArRec[indiceNodi].id = idprod) and (ArRec[indiceNodi].inserito 
= false) then begin//And 
(StrToInt(ArRec[indicenodi].livelloFiglio)=secindice) then begin
						nome:=nodo.Text;
						TrVCategorie.Items.AddChild(nodo,ArRec[indiceNodi].nomeVis
						+ ';' + IntToStr(ArRec[indicenodi].codiceCatProd));
						ArRec[indicenodi].inserito := true;
						Inc(indiceItem);
				 end;
			end;
		end;
	end;
end;
end;
Poi uso all'occorrenza
TrVCategorie.Items.Clear;
per svuotare la tree
Dani

 [...]
Credo che il tuo codice abbia bisogno di un pesante refactoring poichè, 
secondo me, pur trovandomi mentalmente estraneo alla problematica che 
stai cercando di risolvere, la tua implementazione è molto criptica e 
difficile da interpretare.
A prima vista, mi pare che tu esegua un incremento della variabile che 
determina il valore di conclusione del ciclo *for*; probabilmente, 
arrivi a "forare" il limite per l'indice che identifica un determinato nodo.
Non saprei come correggere il tuo codice; al massimo, data una serie di 
precisi requisiti e scopi, è possibile valutare soluzioni che possano 
portarti ad avere codice più pulito e soprattutto più semplice, 
rimuovendo automaticamente il problema che hai riscontrato.
Ciao! :-)


 
Ecco perchè non volevo postarlo inizialmente in effetti è l'unica 
soluzione che ho trovato per caricare la tree da un array di record di 
questo tipo
type ArRecord = packed record
		 nomeVis: string;//il nome visualizzato del prodotto o della 
macrocategoria
		 macrocategoria: Integer;//valore no si se prodotto singolo(no) o 
riferimento a macrocategoria(si)
		 codiceCatProd: Integer;//indica il codice progressivo del prodotto oppure
		 //della macrocategoria che la lega al sottogruppo (contatore univoco)
		 prezzo: Currency;//il prezzo del prodotto
		 id: String;// in relazione 1 a molti con codiceCatProd registrato in Hint
		 icona: string;//l'icona e il suo path
		 livelloFiglio: string;//fissare il livello delle sotto categorie a 9
		 inserito: boolean; //controllo per evitare doppioni in TreeView
end;
Comunque a parte stò casino di procedura che ho implementato e che alla 
fine funziona ho trovato l'errore che era nel resettare il campo del 
record 'inserito'.
Scusatemi credo che d'ora innanzi cercherò di scrivere codice più pulito 
prima di rompere al gruppo.
Dani

 prima di rompere al gruppo.
Ti ho suggerito di controllare attentamente il codice non perchè la sua 
forma mi disturbasse particolarmente...era solo per richiamare la tua 
attenzione sul fatto che un codice più semplificato e ben formattato, a 
volte, può esserti utile nel trovare errori altrimenti difficilmente 
individuabile. In sostanza, è una cosa che fai per tua utilità... :-)
Ovvio che se ti trovi nella condizione di chiedere aiuto, avere un 
codice chiaro ti permette di ottenere una risposta in tempi più stretti.
Se può esserti utile, leggi anche questo documento:
http://makeashorterlink.com/?H3022179A


 
Molte grazie mi mancava senz'altro mi sarà di aiuto !!!!!!!
Dani