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
akariok, 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 Pseudocodevoid __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