Newsgroup: it.comp.lang.delphi
Titolo: E' possibile......

...... assegnare la proprietà treeview.selected ad un nodo di mio
piacimento? Nel senso che io devo fare la treeview1.items.delete() di un
nodo che prendo in input in un forrm, quindi il nome del nodo da cancellare
è in formato testo, mentre la delete prende in input solo il titpo
ttreenode. Come posso realizzare questa cosa? L'idea che mi era venuta è
quella di fare qualcosa di questo tipo:
treeview1.selected.text:=combobox1.text, solamente che l'esecuzione,
arrivata in quel punto mi da un crash da paura. Quindi mi chiedevo se era
possibile assegnare manualmente la proprietà selected.
Grazie a tutti
Davide

 Davide
Ciao
Andrea

 end;
Molte grazie per la tua sollecita risposta ora però posso farti una paio di
domande sul codice da te postato?
-  non ho ben capito a cosa serve la variabile node_index e perchè il test
lo hai messo > 0. Io ho provato a vedere un po come funziona ed
effettivamente i nodi li scorre tutti, dal primo (radice) all'ultimo, però
il caso che sia > 0 non si avvera mai perchè è sempre = 0 e quindi non fa
mai la chiamata ricorsiva..... allora io gli ho messo >=0 e in questo caso
le chiamate ricorsive le fa tutte e trova pure il nodo che voglio, stampo la
stringa associata al nodo prima di uscire dalla procedura ricorsiva (per
avere la conferma che il nodo che sto restituendo è effettivamente quello
cercato) però purtroppo quando assegno come input alla procedura
treeview1.items.delete il nodo restituito dalla tua funzione questa non mi
cancella il nodo dall'albero e non capisco proprio il motivo. qualcuno sa
come posso risolvere il problema?
Saluti
Davide

PS: quando compilo il tutto il compilatore mi da questo warning: return
value of function GetNodeFromText might be undefined
davide

 Davide
Ciao
Andrea

 davide
Ciao
Andrea

Perdona la mia insistenza ma "ne approfitto" visto che te ne intendi
certamente moooolto + di me a riguardo di delphi. Mi permetto di postarti la
mia funzione (che non si discosta di molto dalla tua soluzione:
function GetNodeFromText( miastringa : String; ParentNode : TTreeNode )
:TTreeNode;
var
  Node_Index : Integer;
begin
  if ParentNode.Text = miastringa then
  begin
     Result := ParentNode;
     Exit;
  end;
  for Node_Index := 0 to Pred( ParentNode.Count ) do
  begin
     if ParentNode.Item[ Node_Index ].Count >= 0 then
       GetNodeFromText( miastringa,ParentNode.Item[ Node_Index ] );
  end;
end;
//poco + sotto all'interno di una procedura ho queste righe di codice
form1.treeview1.items.beginupdate;
form1.treeview1.Items.delete(GetNodeFromText(combobox1.Text,
form1.treeview1.Items.GetFirstNode));
form1.TreeView1.items.endupdate;
Premetto che non ho sotto-rami cioč la radice ha solamente una lista di suoi
figli i quali sono direttamente foglie dell'albero.
Do in pasto alla tua funzione il testo che l'utente poi seleziona come
foglia da eliminare (combobox1.text) e gli fornisco come input la radice
dell'albero.
Effettivamente l'esecuzione funziona e ha senso, il fatto č che secondo me
non ritorna un nodo valido (o per lo meno un nodo presente nell'albero).
Infatti non si spiegherebbe il fallimento della delete. Il fatto č che non
ho neanche il modo di visualizzare il nodo ritornato.... ti faccio vedere
come ho fatto:
procedure XXX (senter: Tobject)
var
    mynode: ttreenode;
begin
    //codice
    mynode:=GetNodeFromText(combobox1.Text,
form1.treeview1.Items.GetFirstNode);
    showmessage ('il nodo ritornato č: '+mynode.text);
    // a questo punto il programma va in mega crash e non ne ho una mezza
idea del motivo dal momento che se la funzione ritorna un nodo dovrebbe
anche dirmi che nodo č!!!
Il fatto č che se durante l'esecuzione, prima di ritornare il valore result
della tua funzione, stampo il valore di Parentnode.text questo č giusto, č
esattamente la categoria che voglio eliminare.
Cmq, questo č quanto, ti ringrazio tanto della disponibilitŕ mostrata. Se
avrai tempo e soprattutto voglia (mettiamoci anche un po di pietŕ :))   )
scrivi pure...
Saluti
Davide

Se ti può aiutare ho appena scoperto che inizializzando result=nil come
prima riga della procedura (dopo il begin per intenderci) il nodo ritornato
è SEMPRE nil.
davide

Noto che in questo periodo non me ne esce una giusta... <G>
Però prova a mettere il controllo per la proprietà Text
DENTRO al ciclo.
Ciao
Andrea

Mi sono improvvisamente ricordato di una cosa: se usi D5 o sup.
il confronto tra stringhe è case-sensitive.
Questo potrebbe essere il problema.
Ciao
Andrea


Prova con questo esempio:
function GetNodeFromText(AText:String; TreeNodes:TTreeNodes):TTreeNode;
var i : Integer;
begin
  Result:=nil;
  for i:=0 to TreeNodes.Count-1 do
    begin
      if TreeNodes[i].Text=AText then
        begin
          Result:=TreeNodes[i];
          Exit;
        end;
    end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var Node:TTreeNode;
begin
  Node:=GetNodeFromText(Edit1.Text,TreeView1.Items);
  if Assigned(Node) then Node.Delete;
end;
In Edit1.Text ci dev'essere il testo del nodo.
Fammi sapere se sei riuscito a farlo funzionare.
Ciao
Giorgio

 end;
Giorgio sei stato fantastico (spero di non essere l'unico a dirtelo
))))  ). La tua procedura pare funzionare bene. Per quanto riguarda
TheDeerBear, grande anche te.... hai dato un ottimo sputno....
Vorrà dire che negli Special TNX compariranno anche i vostri nomi. ^__^
Ciao e grazie 1000 per il vostro prezioso aiuto
Saluti
Davide