![]() |
Verzeichnisse in Listbox auflisten
Hi!
Soo, habs jetzt so weit dass mein "Client" das Verzeichnis in einer Listview anzeigt - allerdings immernoch alles zusammen - Dateiname, Datum, Zugriffsrechte.... Wie kann ich diese ganzen Werte aus der Stringliste extrahieren um sie dann in "Colums" sortirt anzeigen zu können? Danke schonmal! Lamy |
Re: Verzeichnisse in Listbox auflisten
Wie hast du die Daten in der StringList vorliegen? Du musst die erstmal aufspalten, dann kannst du mit
Delphi-Quellcode:
eine neue Spalte hinzufügen. Beachte dass du aber zuerst die Eigenschaft Columns der ListView entsprechend konfigurieren musst.
ListView1.Items[Index].SubItems.Add(<Detail>);
|
Re: Verzeichnisse in Listbox auflisten
Zitat:
So wird die Stringliste "aufgeladen" und in die Listview übertragen:
Delphi-Quellcode:
Aber ich weiß beim besten Willen nicht wie die Dateien in der Stringliste vorliegen - wie kann ich das rausfinden und aufsplitten?
Form1.Listftpdir.Items.Clear; // Verzeichnisanzeige leeren
IdFTP1.List(Stringliste); FOR i := 1 TO Stringliste.Count DO WITH Form1.Listftpdir.Items.Add DO Caption := Stringliste.Strings[i - 1]; P.S.: immer die aktuellste Verion [wen's interessiert, s' gibt noch nicht viel was man machen kann^^]: ![]() |
Re: Verzeichnisse in Listbox auflisten
Also, die Daten werden mit Leerzeichen getrennt. Speicher mal einen Entrag der Stringlist in eine Datei, dann kann ich ihn auch besser analysieren. Soviel zum ersten Thema. Zum zweiten, dein Programm. Ein FTP-Client ist ja ganz nett, aber erstens würde ich gern von der Update-Funktion ein Fenster sehen, welches mir anzeigt dass die Datei heruntergeladen wird. So weiß ich ob das Programm hängt oder was los ist. Zweitens, Bringe die Fenster in den Mittelpunkt des Geschehens, also des Bildschirms. Drittens, ich sehe keinen Grund, das Fenster für Verbindung herstellen und Einstellungen als bsSizeable einzustellen. Mach die beiden als bsDialog, so kann man die Größe nicht mehr ändern. Und last but definitely not least:
:warn: Ein Plaintext-Passwort in einer INI-Datei im Verzeichnis des Programms ist für mich ein Grund das Programm zu löschen und den Programmierer zu terminieren. Auch wenns nur eine Beta ist, aber nachdem du das Passwort in den Edits brav versteckst, kannst du es auch verschlüsselt in die INI geben. Also, ändere das bitte schnellstens! :warn: |
Re: Verzeichnisse in Listbox auflisten
Zitat:
1.: Wie kann ich das denn in ner Datei speichern? *keineahnunghat* 2.: Danke für die Kritik! Ich wollte eh noch fragen wie man das Resizen unterbinden kann :D aber wie kriege ichs in den Mittelpunkt des Bildschirms? :angle2: Zum Thema Passwort: Ich hatte sowiso noch vor das zu verschlüsseln und dann in der .ini zu speichern oder vielleicht in der Registry aber erstmal eins nach dem andern :stupid:... Wie gesagt, vielen Dank für Kritik & Tips, aber lieber back2Topic sonst wird der Thread wieder geschlossen *angst* Lamy |
Re: Verzeichnisse in Listbox auflisten
Ok, also, du kanst den String auch in ein Edit reinschreiben oder sonstwas, hauptsache du kannst eines der Elemente in der StringList mit Ctrl+C kopieren und dann hier posten. Mich interessiert ob das mit Tabs oder sowas gelöst wird. Bezüglich der Position: die Eigenschaft "Position" des Forms auf poMainFormCenter setzen, um das Form in der Mitte des Hauptformulars anzeigen zu lassen. Aber wieder zurück zum Topic. Setze einen Breakpoint in die Schleife, und werte mit Strg+F7 ein Feld der Stringlist aus. Dann kopierst du das Ergebnis und stellst es hier online, ich habe leider keine Zeit ein FTP-Programm zu schreiben um das herauszufinden. Aber sowas Ähnliches hats hier schon mal gegeben:
![]() Ganz wichtig sein könnte dieser Beitrag: ![]() Ich habs nicht probiert, also, viel Glück... PS: Wegen dem Passwort: Na dann lieber mal nicht abspeichern als Plaintext, wirklich... |
Re: Verzeichnisse in Listbox auflisten
Also, so hab ichs verstanden:
stringliste[0] wäre Zugriffsrechte 11 jaschu-mac4win homepages 4096 May 5 14:47 . Jetzt suche ich die Trennzeichen mit pos [die Leerzeichen], und mit copy splitte ich mir dann den ersten block ab. Aber wie ging das nu? In der Delphihilfe habsch schon nachgeguckt, ist aber nicht aufschlussreich für mich... |
Re: Verzeichnisse in Listbox auflisten
HI Lamy,
ich hab ne Funktion geschrieben, die einen TExt automatisch anhand eines Trennzeichen aufsplittet und das ERgebnis in eine STringList schreibt. DAs sollte Dir weiter helfen :
Code:
GRuß Data
// splittet einen bestehenden String anhand eines Trennzeichen in mehere Strings auf
Function VBSplit(Liste : TStringList; Text2Split : String; SeperatorStr : String) : Boolean; Var Posi : Longint; strTemp : String; strPart : String; bInLoop : Boolean; sepLen : Longint; begin result := true; bInLoop := false; try //Liste leeren Liste.clear; strTemp := Text2Split; sepLen := Length(SeperatorStr); Posi := Pos(SeperatorStr,strTemp); While Posi > 0 do begin bInLoop := true; strPart := Copy(strTemp,1,Posi-1); Liste.Add(strPart); strTemp := copy(strTemp,Posi+sepLen,Length(strTemp)-(Posi+sepLen-1)); Posi := Pos(SeperatorStr,strTemp); end; if (bInLoop) or (Length(strTemp)>0) then Liste.add(strTemp); except Result := false; end; end; |
Re: Verzeichnisse in Listbox auflisten
@DataCool: Nix gegen dich persönlich aber deine Funktion ist ziemlich unperformant da du mit copy ständig nen riesen string neu zusammensetzt... Von der Performance her sollte folgende Procedure um einiges besser sein..
Delphi-Quellcode:
procedure splitString(const Source: String; const Delimiter: String; var Dest: TStringlist);
var count: Integer; LStartpos, LEndepos, LSourcelength: Integer; begin Dest.Clear; count := 1; LStartpos := 0; LEndepos := 0; LSourcelength := length(Source); while count <= LSourcelength do begin if copy(Source, count, length(Delimiter)) = Delimiter then begin LEndepos := count; dest.Add(copy(Source, LStartpos + 1, LEndepos - LStartpos - 1)); LStartpos := count + length(Delimiter) - 1; count := count + length(Delimiter); end else begin count := count + 1; end; end; if LEndePos <> Count - length(Delimiter) then dest.Add(copy(Source, LStartpos + 1, count - LStartpos - 1)); end; Hab eben noch nen kleinen Test durchgeführt. Meine Funktion brauchte für einen kleinen String von 10 MB (jedes vierte zeichen ein Delimiter) zwischen 7 und 8 Sekunden. Die Funktion von Datacool wurde jedesmal nach ca 13 Sekunden mit dem Fehler "Out of Memory" beendet. Keine Ahnung wann bei meiner Funktion so eine Meldung kommmt. Den größten String den ich bisher damit zerlegt hab war ein etwa 50 MB großer String (Datenbank-Tabellen-Abbild) |
DP-Maintenance
Dieses Thema wurde von "Sharky" von "Internet / IP / LAN" nach "VCL-Komponenten und Controls" verschoben.
Irgendwie fehlt mir der Bezug zu LAN ;-) |
Re: Verzeichnisse in Listbox auflisten
@SirThornberry
Mal nur so eine Idee, wie wär's damit :?:
Delphi-Quellcode:
Gruß
Dest.Lines.Text := StringReplace(Source, Delimiter, #13#10, [rfReplaceAll, rfIgnoreCase]);
s14 |
Re: Verzeichnisse in Listbox auflisten
@s14: Auf den ersten Blick ne supi variante ABER:
versuch mal
Delphi-Quellcode:
Ergebnis davon ist das es in einem Item ist:
Stringliste.Add('abc'#13#10'def');
Wenn du allerdings mit deinem Stringreplace arbeitest wird es in zwei items aufgeteilt. Wenn du jetzt folgenden String hast
Code:
und "|" der Delimiter ist so wirst du bei deiner Stringreplacevariante & Items in der Stringliste vorfinden...
Item1
Entry1 Entry2 | Item2 Entry1 Entry2 (korrigiert mich wenn ich nen denkfehler hab, aber eigentlich hab ich damals wegen genau diesem problem die funktion geschrieben) |
Re: Verzeichnisse in Listbox auflisten
@SirThornberry: Da hast Du natürlich Recht, NUR :wink:
die Frage bezog sich doch auf das Trennen einer einzigen Zeile nach Leerzeichen, also ohne weitere Umbrüche. Gruß s14 |
Re: Verzeichnisse in Listbox auflisten
Also, ich habs jetzt doch mal probiert, funktioniert eigentlich 8)
Delphi-Quellcode:
Aufruf dann beispielsweise zum testen mit:
procedure SplitStrToStringList(const source: String; const Delimiter: String; Dest: TStrings);
begin Dest.Text := StringReplace(Source, Delimiter, #13#10, [rfReplaceAll, rfIgnoreCase]); end;
Delphi-Quellcode:
procedure TForm1.Button24Click(Sender: TObject);
begin SplitStrToStringList('Zugriffsrechte 11 jaschu-mac4win homepages 4096 May 5 14:47 ', ' ', memo1.Lines); end; |
Re: Verzeichnisse in Listbox auflisten
@s14: hast recht, für die einzelne Zeile reicht nadürlich nen StringReplace...
|
Re: Verzeichnisse in Listbox auflisten
@SirThornberry:
Gut dann ist meine Function halt unperformat :sad: :oops: Aber ich habe die vor 2/3 Jahren geschrieben und muss damit eigentlich immer nur Strings splitten, alle unter 1 MB :mrgreen: Werde mir aber gleiche Deine Funktion mal näher betrachten. GRuß Data |
Re: Verzeichnisse in Listbox auflisten
Hi!
Danke für die vielen Antworten, aber irgendwie kapier ich hier gar nix mehr :gruebel: Wie ist die Prozedur vopn SirThornberry einzubinden? Was genau macht die mit Dest.Clear; count := 1; LStartpos := 0; LEndepos := 0; LSourcelength := length(Source); ? Danke schonmal! |
Re: Verzeichnisse in Listbox auflisten
DataCool war so freundlich meine Funktion noch ein bischen zu verbessern - THANKS
Delphi-Quellcode:
@Lamy: eigentlich brauchst du die funktion nicht da dein Problem einzeilig ist und somit stringreplace die einfacherere alternative ist.
procedure splitString(const Source: String; const Delimiter: String; var Dest: TStringlist);
var count: Integer; LStartpos, LEndepos, LSourcelength: Integer; LDelimiterLength : Integer; begin Dest.Clear; count := 1; LStartpos := 0; LEndepos := 0; LSourcelength := length(Source); LDelimiterLength := Length(Delimiter); while count <= LSourcelength do begin if copy(Source, count, LDelimiterLength) = Delimiter then begin LEndepos := count; dest.Add(copy(Source, LStartpos + 1, LEndepos - LStartpos - 1)); LStartpos := count + LDelimiterLength - 1; inc(count,LDelimiterLength); end else begin inc(count); end; end; if LEndePos <> Count - LDelimiterLength then dest.Add(copy(Source, LStartpos + 1, count - LStartpos - 1)); end; Zu deinen Fragen:
Delphi-Quellcode:
Beispielaufruf:
Dest.Clear; //leert die Ziel-Stringliste (dem user bissl arbeit abnehmen)
count := 1; //Count ist der Index wo wir uns gerade im String befinden LStartpos := 0; //anfangs wird die startposition auf 0 gesetzt damit, irgendwo muss ja der string anfangen LEndepos := 0; //Da wir noch nicht parsen muss die endeposition auch auf 0 - wird später hochgezählt LSourcelength := length(Source); //wird für schleifenabbruch bedingung gebraucht. gibt an wie lang der string ist der zerteilt werden soll
Delphi-Quellcode:
[Edit]Fehler in Funktion beseitigt[/Edit]
var LListe: TStringlist;
begin LListe := TStringlist.create; splitString('Part1|Part2|Part3', '|'; LListe); //jetzt sollte in LListe der geteilte sting sein - also 3 Items [...] //dein source (also das auswerten der items) LListe.Free; end; |
Re: Verzeichnisse in Listbox auflisten
Danke, die Erklärung sagt mir so einiges :)
Aber: Zitat:
Ist das die Methode die S14 gepostet hat? Die kapier ich auch nicht - da ist ja nicht nur "Zugriffsrechte 11 jaschu-mac4win homepages 4096 May 5 14:47" in der Stringliste sondern auch diese Daten aller anderen Dateien / Ordner die er vom ftp ausliest... |
Re: Verzeichnisse in Listbox auflisten
genau, das ist die funktion die s14 gepostet hat. bei seiner variante musst du auch jede zeile nochmal in eine stringliste aufsplitten. Man könnte auch noch die unperfomantere Variante nehmen und sich jedes Element extra holen. Hab da glaube irgendwann mal ne funktion gepostet die "splitOutIndex" oder so hieß. Allerdings ist die funktion noch nicht geschwindigkeits optimiert...
|
Re: Verzeichnisse in Listbox auflisten
Zitat:
Naja, ich glaub' ich nehm dann doch lieber das was du gepostet hast, ist zwar länger aber dafür kapier ichs einigermaßen ^^ Dankööö!! :hello: |
Re: Verzeichnisse in Listbox auflisten
Och nööö - zu früh gefreut :(
Delphi-Quellcode:
Oh mann ich bin so saudumm, ich hab wirklich keinen Schimmer wie das zum Teufel nochmal zu funktionieren hat :(...
PROCEDURE TForm3.ChangeDir(DirName: STRING);
VAR stringliste: TStringList; i: Integer; BEGIN Stringliste := TStringList.Create; // Stringliste erzeugen splitString('Part1|Part2|Part3', '|'; Stringliste); TRY IdFTP1.ChangeDir(DirName); // IdFTP1.TransferType := ftBinary; Form1.Listftpdir.Items.Clear; // Verzeichnisanzeige leeren IdFTP1.List(Stringliste); FOR i := 1 TO Stringliste.Count DO WITH Form1.Listftpdir.Clumns[0] DO Caption := Stringliste.Strings[i - 1]; FINALLY Form1.EDftpverzeichnis.Text := IdFTP1.RetrieveCurrentDir; // Aktuelles Verzeichnis in die Combobox zur Verzeichnisauswahl schreiben Stringliste.Free; END; END; Mir ist schon klar, dass man "Part1,2" etc. durch irgendwas ersetzen muss aber durch was? |
Re: Verzeichnisse in Listbox auflisten
Hi,
du nutzt ja scheinbar die Indy-Komponenten um die Daten per FTP abzurufen, oder? Warum machst du dir dann diesen Aufwand die FTP-Dateiliste selber zu bearbeiten und benutzt nicht einfach idFTP.DirectoryListing (ab Indy9). Das liefert dir sämtliche Daten über die Dateien "zerpflückt" zurück, die Indy-Demos machen das ebenfalls darüber. Beispiel:
Delphi-Quellcode:
idFTP.List(FileList);
for i:=0 to idFTP.DirectoryListing.Count-1 do ListBox1.Items.Add(idFTP.DirectoryListing.Items[i].Filename); |
Re: Verzeichnisse in Listbox auflisten
|
Re: Verzeichnisse in Listbox auflisten
nicht
Delphi-Quellcode:
sondern
for i := 1 to stringliste.count do
Delphi-Quellcode:
da das erste item der index 0 ist
for i := 0 to stringliste.count - 1 do
|
Re: Verzeichnisse in Listbox auflisten
@Lamy: Wenns geht füge die Bilder doch als Anhang hinzu, vor allem wenn sie so schön breit sind ;)
|
Re: Verzeichnisse in Listbox auflisten
Ok, sorry, wird nicht wieder vorkommen :)
|
Re: Verzeichnisse in Listbox auflisten
Kein Problem...ich musste es auch mal lernen ;)
PS: Poste den FTP-Client hier sobald er fertig ist, das Preview von vor ein paar Tagen sah interessant aus... |
Re: Verzeichnisse in Listbox auflisten
Zitat:
|
Re: Verzeichnisse in Listbox auflisten
Zitat:
Das kommt daher weil einige FTP-Server noch was mitsenden, was in DirectoryListing rausgenommen wird, in der Stringlist jedoch natürlich noch drinsteht. |
Re: Verzeichnisse in Listbox auflisten
Zitat:
|
Re: Verzeichnisse in Listbox auflisten
Zitat:
|
Re: Verzeichnisse in Listbox auflisten
Ach so ^^
Ich dachte, du meintest eine DirectoryListBox... :mrgreen: Aber danke für den Tip! |
Re: Verzeichnisse in Listbox auflisten
Zitat:
|
Re: Verzeichnisse in Listbox auflisten
Mal nen anderes Problem - warum kommt wohl ein dicker Fehler wenn ich den Style der Listbox auf vsreport umstellen will?
Ich würde ja jetzt code posten, aber ich weiß beim besten Willen nicht worans liegt :wall: |
Re: Verzeichnisse in Listbox auflisten
eventuell hast du noch keine Columns angelegt??!?
|
Re: Verzeichnisse in Listbox auflisten
Zitat:
habs - ![]() Ums beheben zu könknen bräucht ich allerdings die Datei ComCtrls.pas weil ich noch Delphi5 hab... Könnte mir das wohl bitte wer mailen? master@toolsnfun.de Dankeschön! |
Re: Verzeichnisse in Listbox auflisten
Hmm, eigentlich Neues Thema = Neuer Thread.
tritt der fehler nur auf wenn der style auf vsreport ist?? Und wenn du den Style wieder zurück stellst kommt der Fehler nicht mehr??? |
Re: Verzeichnisse in Listbox auflisten
Nochmal :):
Kann mir die bitte mal wer schicken? Danköö! |
Re: Verzeichnisse in Listbox auflisten
Ich glaub da hat borland was dagegen. Kannst es ja mal mit ner mail an borland versuchen
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz