Dateinamen einer Listbox schneller einlesen
Dateinamen einer Listbox schneller einlesen
Hi,
ich habe ein kleines Problem, bei dem ich eure Lösungsvorschläge gerne mal gehört hätte:
Ich habe ein Programm, das ein Hauptfenster besitzt. In diesem Hauptfenster werden zwei Bearbeitungsschritte dargestellt. Angepsrochen werden diese
Bearbeitungsschritte mit einem "Weiter" bzw. "Zurück" Button:
--
Fenster 1
"Weiter"
(Mit dem "Weiter" Button gelange ich zum Fenster 2)
Fenster 2
"Zurück"
(Mit dem "Zurück" Button gelange ich zum Fenster 1)
--
Im Fenster 1 gibt es ein Stringgadget, in das der Benutzer eine Pfadangabe (C:\Ordner\Test) eingibt. Dieser Ordner enthält zum Beispiel 10 BMP Dateien.
Drückt nun der Benutzer auf dem Button"Weiter" gelangt er zum Fenster 2. Dort gibt es für ihn die Möglichkeit, dem angegebenen Ordner (C:\Ordner\Test) virtuell weitere
Dateien zuzuordnen, ohne das diese wirklich in dieses Verzeichnis kopiert werden. Diese Bearbeitung findet dabei NICHT im hauptfenster, sondern in einem weiteren
Fenster statt, das sich öffnet, sobald der benutzer
den vorhandenen Button "Zusammenstellung bearbeiten" drückt. Dieses weitere geöffnete Fenster hat eine eigen WindowID, nennen wir es
hier einfach Fenster 3.
Im Fenster 3 bekommt nun der benutzer die Möglichkeit, die Zusammenstellung des Ordners (C:\Ordner\Test) zu bearbeiten. Er kann virutell,
neue Dateien hinzufügen und bestehende entfernen. Hier entfernt er beispielsweise von den 10 BMP Dateien 5 Dateien. Somit hat er nur
noch 5 BMP-Dateien. Dafür fügt er 5 TXT Dateien hinzu.
Dieses neue Zusammenstellung speichert der benutzer nun mit einen Klick auf "Speichern". Das Programm merkt sich nun, das bei der
zukünftigen Bearbeitung nicht mehr 10 BMP-Dateien, sondern nur noch 5 BMP Dateien + 5 TXT Dateien bearbeitet werden sollen. Mit dem Klick auf "Speichern"
gelangt er auch wieder in das Fenster 2.
Soweit so gut. Nun habe ich das problem, das beim Einlesen der Inhalte des Ordner (C:\Ordner\Test) oftmals sehr viel Bearbeitungszeit drauf geht, da es nicht selten
mehr als 100 Dateien sind.
Derweil habe ich das ganze sehr ungünstig gelöst:
Der benutzer wählt im Fenster 1 einen ordner aus (C:\Ordner\Test). Sobald er den "Weiter" Button drückt, liest Purebasic das genannte Verzeichnis aus und schreibt alle
Dateinamen sämtlicher enthaltener Dateien in eine Listbox (hier als Listbox 1 bezeichnet). Die Listbox ist versteckt und dem hauptfenster zugeordnet.
Drückt nun der Benutzer im Fenster 2 den Button "Zusammenstellung bearbeiten", liesst Purebasic den Inhalt aus der Listbox 1 aus, öffnet das Fenster 3, das eine weitere
Listbox mit dem namen Listbox 2 enthält und schreibt den Inhalt der Listbox 1 in die Listbox 2.
Wenn nun der benutzer seine Änderungen vorgenommen hat (5 BMP-Dateien + 5 TXT Dateien) und das ganze speichert, schreibt Purebasic den Inhalt von Listbox 2 wieder
in Listbox 1, da ja beim Speichern auch das fenster 3 mit seiner Listbox 2 zerstört wird und somit der Inhalt weg wäre, und schließt das Fenster. Der Benutzer ist nun
wieder im Fenster 2.
Zum Schluss aller Bearbietungschritte liesst Purebasic den Inhalt der Listbox 1 aus und bearbeite alle Dateien nach einen vorgelegten Muster.
Meine Frage ist daher, ob es möglich ist, Dateien schneller in eine Art Listbox (keine Ahnung was es da noch so gibt = Strukturen etc) einzutragen, ohne das mit einer
Standartlistbox zu machen. Mit einer Listbox dauert das einfach zu lange. Daher, was meint ihr wie ihr das machen würdet? Ich hatte schon die idee, den ordner erst
einzulesen, wenn er den Button "Zusammenstellung bearbeiten" drückt, doch brauche ich bei der Endbearbeitung zum Schluss eine Art Listbox, aus dem die Bearbeitungsprocedure lesen kann.
ich habe ein kleines Problem, bei dem ich eure Lösungsvorschläge gerne mal gehört hätte:
Ich habe ein Programm, das ein Hauptfenster besitzt. In diesem Hauptfenster werden zwei Bearbeitungsschritte dargestellt. Angepsrochen werden diese
Bearbeitungsschritte mit einem "Weiter" bzw. "Zurück" Button:
--
Fenster 1
"Weiter"
(Mit dem "Weiter" Button gelange ich zum Fenster 2)
Fenster 2
"Zurück"
(Mit dem "Zurück" Button gelange ich zum Fenster 1)
--
Im Fenster 1 gibt es ein Stringgadget, in das der Benutzer eine Pfadangabe (C:\Ordner\Test) eingibt. Dieser Ordner enthält zum Beispiel 10 BMP Dateien.
Drückt nun der Benutzer auf dem Button"Weiter" gelangt er zum Fenster 2. Dort gibt es für ihn die Möglichkeit, dem angegebenen Ordner (C:\Ordner\Test) virtuell weitere
Dateien zuzuordnen, ohne das diese wirklich in dieses Verzeichnis kopiert werden. Diese Bearbeitung findet dabei NICHT im hauptfenster, sondern in einem weiteren
Fenster statt, das sich öffnet, sobald der benutzer
den vorhandenen Button "Zusammenstellung bearbeiten" drückt. Dieses weitere geöffnete Fenster hat eine eigen WindowID, nennen wir es
hier einfach Fenster 3.
Im Fenster 3 bekommt nun der benutzer die Möglichkeit, die Zusammenstellung des Ordners (C:\Ordner\Test) zu bearbeiten. Er kann virutell,
neue Dateien hinzufügen und bestehende entfernen. Hier entfernt er beispielsweise von den 10 BMP Dateien 5 Dateien. Somit hat er nur
noch 5 BMP-Dateien. Dafür fügt er 5 TXT Dateien hinzu.
Dieses neue Zusammenstellung speichert der benutzer nun mit einen Klick auf "Speichern". Das Programm merkt sich nun, das bei der
zukünftigen Bearbeitung nicht mehr 10 BMP-Dateien, sondern nur noch 5 BMP Dateien + 5 TXT Dateien bearbeitet werden sollen. Mit dem Klick auf "Speichern"
gelangt er auch wieder in das Fenster 2.
Soweit so gut. Nun habe ich das problem, das beim Einlesen der Inhalte des Ordner (C:\Ordner\Test) oftmals sehr viel Bearbeitungszeit drauf geht, da es nicht selten
mehr als 100 Dateien sind.
Derweil habe ich das ganze sehr ungünstig gelöst:
Der benutzer wählt im Fenster 1 einen ordner aus (C:\Ordner\Test). Sobald er den "Weiter" Button drückt, liest Purebasic das genannte Verzeichnis aus und schreibt alle
Dateinamen sämtlicher enthaltener Dateien in eine Listbox (hier als Listbox 1 bezeichnet). Die Listbox ist versteckt und dem hauptfenster zugeordnet.
Drückt nun der Benutzer im Fenster 2 den Button "Zusammenstellung bearbeiten", liesst Purebasic den Inhalt aus der Listbox 1 aus, öffnet das Fenster 3, das eine weitere
Listbox mit dem namen Listbox 2 enthält und schreibt den Inhalt der Listbox 1 in die Listbox 2.
Wenn nun der benutzer seine Änderungen vorgenommen hat (5 BMP-Dateien + 5 TXT Dateien) und das ganze speichert, schreibt Purebasic den Inhalt von Listbox 2 wieder
in Listbox 1, da ja beim Speichern auch das fenster 3 mit seiner Listbox 2 zerstört wird und somit der Inhalt weg wäre, und schließt das Fenster. Der Benutzer ist nun
wieder im Fenster 2.
Zum Schluss aller Bearbietungschritte liesst Purebasic den Inhalt der Listbox 1 aus und bearbeite alle Dateien nach einen vorgelegten Muster.
Meine Frage ist daher, ob es möglich ist, Dateien schneller in eine Art Listbox (keine Ahnung was es da noch so gibt = Strukturen etc) einzutragen, ohne das mit einer
Standartlistbox zu machen. Mit einer Listbox dauert das einfach zu lange. Daher, was meint ihr wie ihr das machen würdet? Ich hatte schon die idee, den ordner erst
einzulesen, wenn er den Button "Zusammenstellung bearbeiten" drückt, doch brauche ich bei der Endbearbeitung zum Schluss eine Art Listbox, aus dem die Bearbeitungsprocedure lesen kann.
- NicTheQuick
- Ein Admin
- Beiträge: 8820
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
- NicTheQuick
- Ein Admin
- Beiträge: 8820
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Eine LinkedList sind um einiges schneller als eine ListViewGadget.
Wenn du mit einer [c]ForEach[/c]-[c]Next[/c]-Schleife die einzelnen Elemente nacheinander durchgehst sind LinkedLists sogar schneller als Arrays. Wenn du allerdings pro Schleifendurchlauf immer ein anderes Element anspringen willst, eignen sich dafür eher Arrays.
Wenn du mit einer [c]ForEach[/c]-[c]Next[/c]-Schleife die einzelnen Elemente nacheinander durchgehst sind LinkedLists sogar schneller als Arrays. Wenn du allerdings pro Schleifendurchlauf immer ein anderes Element anspringen willst, eignen sich dafür eher Arrays.
Hi,

Werde mich mal rantrauen, danke für den Linked List Tipp
Edit:
Hab das mal an einem beispiel probiert:
Die Procedure "ReadDirs" schreibt nun alle Daten in eine LinkedList, bei mir zeigt die ElapsedMilliseconds() "5" an. Wende ich die gleiche Procedure an, lasse aber das ganze nicht in eine Linked List sondern in eine Listbox schreiben, gibt ElapsedMilliseconds() als Zeit "58" aus.
Ist die Nutzung der Linked List nun so auch richtig oder hab ich das nur wieder falsch verstanden?
Damit wir besser vergleichen können, habe ich das SpaceTaxi Verzeichnis eingelesen
Das soll einer schnalle, der null Ahnung vom Programmieren hatWenn du mit einer ForEach-Next-Schleife die einzelnen Elemente nacheinander durchgehst sind LinkedLists sogar schneller als Arrays. Wenn du allerdings pro Schleifendurchlauf immer ein anderes Element anspringen willst, eignen sich dafür eher Arrays.
Werde mich mal rantrauen, danke für den Linked List Tipp
Edit:
Hab das mal an einem beispiel probiert:
Code: Alles auswählen
#TreeGadget = 0
Global Field1,Field2,Field3
Structure BasicStructure
Field1.s
Field2.s
Field3.w
EndStructure
NewList TestList.BasicStructure()
Procedure ReadDirs(Pfad.s,PfadID.l);OK
If Right(Pfad,1)="\":Pfad=Left(Pfad,Len(Pfad)-1):EndIf
NextOK.l:Name.s
ExamineDirectory(PfadID,Pfad,"")
Repeat
NextOK=NextDirectoryEntry()
Name=DirectoryEntryName()
If NextOK=2 And Name<>"." And Name<>".."
ReadDirs(Pfad+"\"+Name,PfadID+1)
While WindowEvent():Wend
UseDirectory(PfadID)
ElseIf NextOK=1
Ganz.s=Pfad+"\"+Name
Ausgangs$=Trim(Pfad)
If Right(Ausgangs$,1)="\":Ausgangs$=Left(Ausgangs$,Len(Ausgangs$)-1):EndIf
Ausgangs$=GetFilePart(Ausgangs$)
Ganz=ReplaceString(GetPathPart(Ganz),Start_Dateiverzeichnis$,"")
Ganz=Mid(Ganz,1,Len(Ganz)-1)
;AddGadgetItem(144,-1,Name+Chr(10)+Ausgangs$)
AddElement(TestList())
TestList()\Field1 = Name
TestList()\Field2 = Ausgangs$
EndIf
Until NextOK=#False
EndProcedure
If OpenWindow(0, 216, 0, 620, 520, #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "New window ( 0 )")
If CreateGadgetList(WindowID())
ListIconGadget(1, 5, 5, 0, 515,"",100)
AddGadgetColumn(1,1,"",100)
; ListIconGadget(144, 310, 5, 0, 515,"",100) ;ListIconGadget(144,0,0,0,0,"",0)
; AddGadgetColumn(144,1,"",100)
EndIf
EndIf
zeit2 = ElapsedMilliseconds()
ReadDirs("C:\Eigene Dateien\SpaceTaxi", 0)
zeit2 = ElapsedMilliseconds() - zeit2
MessageRequester("Information","Zeit: "+Str(zeit2),#PB_MessageRequester_Ok)
ResizeGadget(1, -1, -1, 305, -1)
;ResizeGadget(144, -1, -1, 305, -1)
zeit1 = ElapsedMilliseconds()
ForEach TestList()
AddGadgetItem(1,-1,TestList()\Field1+Chr(10)+TestList()\Field2)
Next
zeit1 = ElapsedMilliseconds() - zeit1
MessageRequester("Information","Zeit: "+Str(zeit1),#PB_MessageRequester_Ok)
Repeat
Until WaitWindowEvent() = #PB_EventCloseWindowIst die Nutzung der Linked List nun so auch richtig oder hab ich das nur wieder falsch verstanden?
Damit wir besser vergleichen können, habe ich das SpaceTaxi Verzeichnis eingelesen
[OffTopic] Ich wundere mich immer wieder wie du Selbst dieses Nascari geschrieben haben sollst......[/Offtopic]CNESM hat geschrieben:...Das soll einer schnalle, der null Ahnung vom Programmieren hat
.....
Ist die Nutzung der Linked List nun so auch richtig oder hab ich das nur wieder falsch verstanden?
Rings hat geschrieben:ziert sich nich beim zitieren
-
DarkDragon
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Nacasi heißt das gute Stück, und er hatte Hilfe von einem aus nem anderen Forum(old_bill wenn ich mich richtig erinnere).
Ich dachte auch er hätte ein wenig mehr Erfahrung mit fast nem Jahr(glaub ich) PBErfahrung.
Ich dachte auch er hätte ein wenig mehr Erfahrung mit fast nem Jahr(glaub ich) PBErfahrung.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
- NicTheQuick
- Ein Admin
- Beiträge: 8820
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Hi,
das das ganze wirklich deutlich schneller sein soll, ist mir nicht klar. Ich hab das ganze jetzt umgestellt und rechnerisch lässt sich eine deutliche Beschleunigung auch feststellen, doch bei der Anwendung merke ich nur gering einen Geschwindigkeitsverbesserung.
Wenn jetzt jemand sagt "Wieso erscheint der nicht als Mit-Autor" kann ich sagen, das Mischa das nicht wollte. Veilleicht wollte er nicht mit einen solch schrecklichen Programmierstyl in Verbindung gebracht werden, wer weiss
Ich habe bei der Umstellung sehr viel Zeit reingesteckt, aber auch nur deswegen, weil ich sehr viele verschiedene Sachen versucht habe und die Funktionen teils rapide umbauen musste, um Sie zum einen an den neuen PB-Standart anzupassen, aber auch an meine Oberfläche. Hinzukam, das ich nicht die beste Erfahrung habe.
Ich nutze viele der PB-Funktionen, nur leider weiss ich bei den meisten Sachen nicht wie Sie eigentlich heissen. Bei der Linked List Sache sprach ich immer von Strukturen und als ich das gestern mal runter geschrieben habe, habe ich gemerkt das ich selbst sogar mehrere solcher LinkedListen verwende
Du sieht, RINGS, mach braucht keine Ahnung haben vom Programmieren, man muss nur wissen was mal will und ein Forum, bei dem man immer wieder nachfragen kann *hihi*
Hätte nochmal ne kurze Frage zur LinkedList, die mir noch unklar ist:
Mit
füge ich ja den Eintrag simple() mit dem Wert 23 ein.
Ich möchte nun diesen Wert, 23, in 24 abändern. Dazu habe anfangs die Funktion:
verwendet, doch das ganze wird leider nicht abgeändert.
Ich hab das jetzt so gemacht, das ich einfach den aktuellen Eintrag anspringen, mir die Daten von diesem merke, ihn dann lösche und an der gleichen Position mit den gespeicherten Werten einen Eintrag erstelle. Ist aber bestimmt net so gedacht. Wie wende ich denn DeleteElement() an?
Bin jetzt ein jahr bei Purebasic und seit Anfang 1998 entwickle ich mit Profan. Ich hab damit kein problem, das ich mich als Noobie bezeichne lasse, warum auch. Programmieren ist ein Hobby und das es Phasen gab, wo ich teils mehrere Monate nichts gemacht habe, bin ich leider wohl nie weiter gekommen
Es gibt wichtigeres als zu wissen, was ne LinkedList ist oder wie man Arrays und Handle nutzt. Für mich ist Programmieren entsprannung 
das das ganze wirklich deutlich schneller sein soll, ist mir nicht klar. Ich hab das ganze jetzt umgestellt und rechnerisch lässt sich eine deutliche Beschleunigung auch feststellen, doch bei der Anwendung merke ich nur gering einen Geschwindigkeitsverbesserung.
Erstmal heisst das Programm Nacasi. Zweitens habe ich nie behauptet, das ich das ganze komplett selbst geschrieben habe. Einige Funktionen wurden von Misch Brandt entwickelt. Ich habe diese Funktionen angepasst, erweitert und auf die Wünsche der Benutzer entsprechend angepasst. Misch Brandt hat mir dabei immer geholfen und mir zur Seite gestanden[OffTopic] Ich wundere mich immer wieder wie du Selbst dieses Nascari geschrieben haben sollst......[/Offtopic]
Ich nutze viele der PB-Funktionen, nur leider weiss ich bei den meisten Sachen nicht wie Sie eigentlich heissen. Bei der Linked List Sache sprach ich immer von Strukturen und als ich das gestern mal runter geschrieben habe, habe ich gemerkt das ich selbst sogar mehrere solcher LinkedListen verwende
Du sieht, RINGS, mach braucht keine Ahnung haben vom Programmieren, man muss nur wissen was mal will und ein Forum, bei dem man immer wieder nachfragen kann *hihi*
Hätte nochmal ne kurze Frage zur LinkedList, die mir noch unklar ist:
Mit
Code: Alles auswählen
AddElement(simple())
simple() = 23
Ich möchte nun diesen Wert, 23, in 24 abändern. Dazu habe anfangs die Funktion:
Code: Alles auswählen
*Old_Element=24
SelectElement(LinkedList(), Position)
ChangeCurrentElement(LinkedList(), *Old_Element) Ich hab das jetzt so gemacht, das ich einfach den aktuellen Eintrag anspringen, mir die Daten von diesem merke, ihn dann lösche und an der gleichen Position mit den gespeicherten Werten einen Eintrag erstelle. Ist aber bestimmt net so gedacht. Wie wende ich denn DeleteElement() an?
Old_Bill hat damit nix zu tun. Der fördert das Ding "nur", wie auch Tobias Runde.Nacasi heißt das gute Stück, und er hatte Hilfe von einem aus nem anderen Forum(old_bill wenn ich mich richtig erinnere).
Ich dachte auch er hätte ein wenig mehr Erfahrung mit fast nem Jahr(glaub ich) PBErfahrung.
Bin jetzt ein jahr bei Purebasic und seit Anfang 1998 entwickle ich mit Profan. Ich hab damit kein problem, das ich mich als Noobie bezeichne lasse, warum auch. Programmieren ist ein Hobby und das es Phasen gab, wo ich teils mehrere Monate nichts gemacht habe, bin ich leider wohl nie weiter gekommen