Seite 1 von 2

Dateinamen einer Listbox schneller einlesen

Verfasst: 15.09.2004 14:39
von CNESM
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.

Verfasst: 15.09.2004 14:54
von NicTheQuick
Versuch mal statt der ListBox 1 eine LinkedList zu benutzen.
Eine versteckte ListBox als Zwischenspeicher für eine dynamische Anzahl Strings zu missbrauchen sollte bestraft werden. :twisted:

Verfasst: 16.09.2004 08:23
von CNESM
Hi,

ist denn eine Linked List auch schneller? Hab jetzt die Routine nochmal überarbeitet und es läuft echt schnell, aber werde doch wohl auf Linked List umsteigen. Hoffe, ich verstehe das überhaupt ;)

Verfasst: 16.09.2004 10:12
von NicTheQuick
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.

Verfasst: 16.09.2004 16:13
von CNESM
Hi,
Wenn 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.
Das soll einer schnalle, der null Ahnung vom Programmieren hat :D

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_EventCloseWindow
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 :)

Verfasst: 16.09.2004 18:53
von Rings
CNESM hat geschrieben:...Das soll einer schnalle, der null Ahnung vom Programmieren hat :D
.....
Ist die Nutzung der Linked List nun so auch richtig oder hab ich das nur wieder falsch verstanden?
[OffTopic] Ich wundere mich immer wieder wie du Selbst dieses Nascari geschrieben haben sollst......[/Offtopic]

Verfasst: 16.09.2004 19:05
von DarkDragon
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. :roll:

Verfasst: 16.09.2004 19:09
von NicTheQuick
Klappt doch schon wunderbar. :allright:

Verfasst: 17.09.2004 11:02
von CNESM
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.
[OffTopic] Ich wundere mich immer wieder wie du Selbst dieses Nascari geschrieben haben sollst......[/Offtopic]
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 :) 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

Code: Alles auswählen

  
AddElement(simple())
simple() = 23 
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:

Code: Alles auswählen

  
*Old_Element=24
SelectElement(LinkedList(), Position) 
ChangeCurrentElement(LinkedList(),  *Old_Element) 
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?
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.
Old_Bill hat damit nix zu tun. Der fördert das Ding "nur", wie auch Tobias Runde.

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 :freak:

Verfasst: 17.09.2004 16:43
von Lars
Schau dir die Linked Lists mal in der Hilfe genau an und schau dir auch die
PB-Beispielcodes dazu an, du hast da ein ganz großes Verständnissproblem :)