TTreeView <edit>Node-Hierarchie stimmt nicht</edit>



  • Hi hab problem mit TreeView
    ich will einene Ordner Strucktur samt unterordner wie im exploerer anzeigen.

    hier ist mein ansatz

    void __fastcall TForm1::Ordner(AnsiString path,int wo,int zelle){
      if(wo == 1){
    
    		 CheckBox6->Checked = false;
    		 CheckBox7->Checked = false ;
      }else{
    	if(wo == 2){
    		StringGrid2->RowCount = 0;
    		CheckBox6->Checked = true;
    		CheckBox7->Checked = true ;
    	}
      }
      if(wo <=2 && wo > 0){
    	 AnsiString Text = path;
    	 Text.SetLength(Text.Length()-3);
    	 TSearchRec sr;
    	 int iAttributes = 0;
    	 iAttributes |= faReadOnly * CheckBox1->Checked;
    	 iAttributes |= faHidden * CheckBox2->Checked;
    	 iAttributes |= faSysFile * CheckBox3->Checked;
    	 iAttributes |= faVolumeID * CheckBox4->Checked;
    	 iAttributes |= faDirectory * CheckBox5->Checked;
    	 iAttributes |= faArchive * CheckBox6->Checked;
    	 iAttributes |= faAnyFile * CheckBox7->Checked;
    	 if (FindFirst(path, iAttributes, sr) == 0)
    	  {
    		do
    		{
    		  if ((sr.Attr & iAttributes) == sr.Attr)
    		  {
    				if(wo == 1){
    					if(sr.Name != ".." && sr.Name != "."){
    					StringGrid1->RowCount = StringGrid1->RowCount + 1;
    					StringGrid1->Cells[0][StringGrid1->RowCount-1] = Text+sr.Name;
    					TTreeNode* T;
    					if(zelle > 0){
    					T = TreeView1->Items->Item[TreeView1->Items->Count-zelle];
    					Label2->Caption = zahler-1;
    					TreeView1->Items->AddChild(T,Text+sr.Name);
    					//TreeView1->Items->Add(0,sr.Name) ;
    					}else{
    						TreeView1->Items->Add(0,sr.Name);
    					}
    					zahler++;
    					Ordner(Text+sr.Name+"\\*.*",1,zelle+1);
    					}
    				}else{
    					if(sr.Name != ".." && sr.Name != "."){
    					AnsiString Test;
    					int Test2 = sr.Name.Length()-3;
    					Test=sr.Name.SubString(Test2,1);
    					if(Test == "."){
    					Label2->Caption = Test;
    						 StringGrid2->RowCount = StringGrid2->RowCount + 1;
    						 StringGrid2->Cells[0][StringGrid2->RowCount-1] = Text+sr.Name;
    					}
    					}
    				}
    		  }
    		} while (FindNext(sr) == 0);
    		FindClose(sr);
    	  }
      }
    }
    

    derzeit bekomme ich die unterordner der root Ordner angezeigt aber immer so

    root
        Unterordner von Root
           Unterordner von Unterordner
               Unterordner von Root
    root
       Unterordner von Root
          Unterordner von Unterordner
            Unterordner von Root
    

    eignetlich will ich es so

    root 
       Unterordner von Root
           Unterordner von Untrerordner
       Unterordner von Root
    root 
       Unterordner von Root
           Unterordner von Untrerordner
       Unterordner von Root
    

    wo ist mein denkfehler??

    Edit:
    Bitte aussagekräftige Überschriften wählen. Danke!



  • Hallo

    Statt dem anfälligen Zugreifen über den Index solltest du lieber der Methode zusätzlich noch den Parentnode übergeben, unter den die neuen Childs eingefügt werden.

    bis bald
    akari



  • eine frage, was wird hiermit bewerkstelligt?

    iAttributes |= faReadOnly * CheckBox1->Checked;
         iAttributes |= faHidden * CheckBox2->Checked;
         iAttributes |= faSysFile * CheckBox3->Checked;
         iAttributes |= faVolumeID * CheckBox4->Checked;
         iAttributes |= faDirectory * CheckBox5->Checked;
         iAttributes |= faArchive * CheckBox6->Checked;
         iAttributes |= faAnyFile * CheckBox7->Checked;
    

    finde das sehr interessant
    eine kleine erklärung wäre mir ganz recht



  • Hallo

    @dsd :
    Das sind Bitoperationen, um einzenle Ja-Nein-Zustände in einem Integer-Wert zu speichern. (in diesen Fall, um Vergleichsmerkmale festzulegen)

    Allerdings ist das effizienter

    iAttributes |= (faReadOnly & CheckBox1->Checked);
    

    bis bald
    akari



  • akari schrieb:

    Hallo

    @dsd :
    Das sind Bitoperationen, um einzenle Ja-Nein-Zustände in einem Integer-Wert zu speichern. (in diesen Fall, um Vergleichsmerkmale festzulegen)

    Allerdings ist das effizienter

    iAttributes |= (faReadOnly & CheckBox1->Checked);
    

    bis bald
    akari

    ok, und könntest du mir hier mal genau erklären, was passiert??
    versteh das nochnicht so ganz! 😞



  • hab mmich einafach an das Balspiel für FindFirst gehalten da waren chckboxen drin die bestimmen was für Adribute die Datei haben soll

    Parentnode ???? was ist das akari????



  • Hallo

    also & ist der Operator für binäres Und.
    | ist der Operator für binäres Oder
    |= ist eine Zusammenfassung von | und =, ähnlich +=
    Details dazu findest du hier.

    In diesem Fall ist der Ablauf folgender :

    // Ausgangspunkt
    Suchflag iAttributes = 0     -> binär 00000000
    Optionsflag faReadOnly = 1   -> binär 00000001 // Annahme für dieses Beispiel  
    Optionsflag faHidden = 2     -> binär 00000010
    Optionsflag faSysFile = 4    -> binär 00000100
    ... // Folge von Option, immer 2^n
    
    // Setzen einer Option im Suchflag, je nachdem ob Checkbox ausgewählt ist
    iAttributes |= (faReadOnly & CheckBox1->Checked);
    1. faReadOnly & CheckBox1->Checked
    Auswahl       true        false
    faReadOnly    00000001    00000001
    Checked       11111111    00000000
    ZE            00000001    00000000
    
    2. iAttributes |= ZE
    iAttributes   00000000    00000000
    Ergebnis      00000001    00000000
    
    // Auswertung nächster Option
    iAttributes |= (faHidden * CheckBox2->Checked);
    1. faHidden & CheckBox2->Checked
    Auswahl       true        false
    faHidden      00000010    00000010
    Checked       11111111    00000000
    ZE            00000010    00000000
    
    2. iAttributes |= ZE (davon ausgehend, das iAttributes bereits mit faReadonly belegt ist)
    iAttributes   00000001    00000001
    Ergebnis      00000011    00000001
    
    usw.
    Das Auslesen der Optionen erfolgt analog.
    

    bis bald
    akari



  • Werner2005 schrieb:

    hab mmich einafach an das Balspiel für FindFirst gehalten da waren chckboxen drin die bestimmen was für Adribute die Datei haben soll

    Parentnode ???? was ist das akari????

    Ein Zeiger den du selbst deklarieren und benutzen sollst.
    Hier mal Pseudocode

    void __fastcall TForm1::Ordner(AnsiString path, TTreeNode* parent)
    {
      TTreeNode* newnode;
      // Schleife über Elemente, für die Subnodes zu erstellen sind
      {
        newnode = TreeView->Items->AddChild(parent, ...);
        // Wenn Element Unterelemente hat
        {
          Ordner(Subpath, newnode);
        }
      }
    }
    

    Um diese Methode dann einmal anzustoßen, must du natürlich einen gültigen Start-Node übergeben, in der Regel den Root-Node.
    Aber achtung, wenn du sehr viele Verzeichnisse hast, kann es im Worst-Case zu Stack-Überläufen kommen, weil zu viele Rekursive Aufrufe gemacht werden.

    bis bald
    akari


Log in to reply