TDirectoryListBox: DirectoryList übergeben?
-
Habe <hasis> Wünsche mal eben deutlich gemacht.
Ich denke es wäre sinnvoller, die Verzeichnisstruktur selbst aufzubauen, in einem eigenen Format zu übertragen und beim Empfänger damit einen TreeView zu füllen. Das mag sich zuerst nach mehr Aufwand anhören, ist aber die sauberere und professionellere Lösung.
-
ahh jetzt versteh ich das, sag das doch gleich *g*
-
jo, so meinte ich das!!
irgendwie wurde meine formatierung weggemacht, deshalb so unklar.
hat jmd. ideen für das format? oder dafür neuer thread?hasi
-
Siehe Jansens beitrag.
-junix
-
also ich möchte das selbe machen und hab so angefangen:
TTreeNode *node ; node->Text = "node"; //Anzahl der '\' auslesen for (int o = 0; o < DirectoryListBox1->Directory.Length();o++) { if (DirectoryListBox1->Directory.SubString(o,1) == "\\") z++; } //Strings aus der DirectoryListBox in TreeView einfügen for (int i = 0; i < DirectoryListBox1->Items->Count;i++) { TreeView1->Items->Add(NULL,DirectoryListBox1->Items->Strings[i]); } //Hier versuche ich die 'Children' des TreeView1 zu erstellen for (int g = 0; g < z; g++) { TreeView1->Items->operator [](g)->HasChildren = true; TreeView1->Items->AddChild(node,"Item"); } delete node;
Jetzt bekomme ich aber die Fehlermeldung, dass der Eintrag nicht eingefügt werden kann.
Wie kann ich das beheben ?
Ich hab scho alles mögliche probiert (BCB-hilfe geschaut, google gesucht ect.)J0
PS: die Onlinehilfe ist ja unter F1 zu erreichen, aber bei mir wird da nur die bcb hilfe angezeigt. woran liegt das? bzw. wie kann i die manuell öffnen?
-
so, habs jetzt anders gemacht:
hab einfach diesen code benutzt:
int alpha; void __fastcall TForm1::SendDirectoryClick(TObject *Sender) { alpha = 0; TStringList * OrdnerUndDateinamen = new TStringList(); OrdnerUndDateinamen->Clear(); OrdnerUndDateinamen->Add("DateienUndOrdner"); OrdnerUndDateinamen->Add(DirectoryListBox1->Directory); for (int i = 0; i < DirectoryListBox1->Directory.Length();i++) { if (DirectoryListBox1->Directory.SubString(i,1) == "\\") alpha++; } for (int beta = 0; beta < DirectoryListBox1->Items->Count; beta++) { if (beta < alpha) OrdnerUndDateinamen->Add(":" + DirectoryListBox1->Items->Strings[beta]); else OrdnerUndDateinamen->Add(DirectoryListBox1->Items->Strings[beta]); } OrdnerUndDateinamen->Add("Dateien"); OrdnerUndDateinamen->Add(FileListBox1->Items->Text); Server->Socket->Connections[0]->SendText(OrdnerUndDateinamen->Text); delete OrdnerUndDateinamen; }
Erklärung:
Der code zählt die '\' im Directory.
Jetzt wie in eine TStringList jeder Unterordner mit ':' + Ordnername eingefügt, jeder ordner im ordner normal gesendet.dann noch die dateinamen.
So kann man alles schön rausfiltern.Kann ja was bringen, wenn jemand mal so was machen will
J0
PS: ich hab jetzt mal n bissel auf formation geachtet, is das so richtig/gut lesbar?
[ Dieser Beitrag wurde am 18.03.2003 um 16:52 Uhr von J0 editiert. ]
-
Original erstellt von J0:
is das so richtig/gut lesbar?Mal abgesehen von deinem furchtbaren Einrück-Stil ...
Zum Code selbst:
Wenn der aktuell angewählte Ordner noch Unterordner enthhält werden diese in OrdnerUndDateinamen nicht als solche gekennzeichnet.Und den Pfad würde ich am Stück zum Client übertragen. Da bietet es sich dann auch an, per StringReplace die "\" durch Zeilenumbrüche ("\r\n") zu ersetzen; wenn du den resultierenden String per Add an eine StringList übergibst wird er dort automatisch "zerlegt".
-
was ist denn mit meinem einrück-stil?
den hab ich mir extra angewöhnt:
immer wenn ein '{' kommt ein tab, wenn ein '}' kommt ein tab weg.Es kommt alles an, der clientcode ein bissel verwurschtelt und kompliziert.
ich überlege ob ich den nochmal neu mache, aber im moment funzt der:void __fastcall TForm1::ParameterChange(TObject *Sender) { /* Parameter = TMemo welches Dateiliste empfängt Dateien = TListBox, welche den Dateiinhalt des Ordners anzeigt DirsBefore = TListBox, welche alle Übergeordneten Ordner anzeigt Ordner = TListBox welche die ersten Unterordner anzeigt */ bool Dateien = false; //if(Parameter->Lines->Strings[0] == "DateienUndOrdner"); { for (int i = 0; i < Parameter->Lines->Count;i++) { if ((Dateien == false)&&(Parameter->Lines->Strings[i] != "Dateien")) { if (Parameter->Lines->Strings[i].SubString(1,1) == ":") DirsBefore->Items->Add(Parameter->Lines->Strings[i].SubString(2,Parameter->Lines->Strings[i].Length()) ); else Ordner->Items->Add(Parameter->Lines->Strings[i]); } if (Parameter->Lines->Strings[i] == "Dateien") { Dateien = true; } if (Dateien == true) { DateiListe->Items->Add(Parameter->Lines->Strings[i]); } } } DateiListe->Items->Delete(0); Ordner->Items->Delete(0); AktuellerOrdner->Caption = Ordner->Items->Strings[0]; Ordner->Items->Delete(0); DirsBefore->Items->Text = DirsBefore->Items->Text + Ordner->Items->Strings[0] ; Ordner->Items->Delete(0); }
J0
-
Hi Jo
Probier mal:
Wenn '{' kommt DANACH den Tab (mit Weite 2 Zeichen = ' ')
Wenn '}' kommt DIE Klammer wieder vorStell Dir mal 4..7 Verschachtelungen vor mit 8x Tabs! (Da brauchst Du DIN A2 Quer!
) Und lesen kann's keiner mehr!
Schau mal an , wie der BCB Funktionen vorbereitet oder wie das andere im Forum machen. :p
-
Bitte beim Thema bleiben! Stil-Diskussionen gehören nach "Rund um" (und sind dort auch schon reichlich archiviert).
-
ok, ich glaub das thema is jetzt sowieso abgeschlossen, hab lösung gefunden&gepostet(ich glaube recht verständlich).
J0
-
Naja, ich halte das zwar für eine recht zweifelhafte, um nicht zu sagen armselige "Lösung", aber wenn dir das reicht.
Ich würde zB. auf der Serverseite (wo ja wohl niemand vorm Rechner sitzt?) vollkommen auf grafische Komponenten verzichten und eine Standard-FindFirst/FindNext-Routine zum Erzeugen der Verzeichnis- und Dateiliste benutzen, anstatt aus Faulh... äh ... Bequemlichkeit auf Krücken wie die DirectoryListBox zurückzugreifen.
-
naja, das stimmt schon, aber ich bin überhaupt froh, dass ich eine Lösung gefunden habe, die funktioniert.(hab ewig dafür gebraucht, erstmal ne gescheite idee zu finden (obwohl man über die gescheitheit streiten kann
))
Zu FindFirst/Next steht ja auch einiges im board, mal gucken ob ich das noch so mache, is auf jeden fall nen ansatz wert.
J0