Seite 1 von 2

Dateiinhalt in Liste anzeigen ... {gelöst}

Verfasst: 22.11.2007 21:24
von lassma-asma
Hi Leute ,

ich hab ma wieder ein Problem ...
ich hab hier nen Ordner mit verschiedenen von mir erzeugten Dateien mit je einem String text drin ....
ich will die jetzt alle aufrufen , also öffnen und in jeder spalte den text der jeweiligen datei anzeigen lassen ...

die spalten werden zwar erzeugt , es steht bei mir aber nix drin irgendwie ...

was mache ich falsch ?

Code: Alles auswählen

OpenWindow(0,0,0,800,800,#PB_Window_ScreenCentered,"test")
CreateGadgetList(WindowID())
ButtonGadget(2,10,700,780,50,"EXIT")
ListIconGadget(1,10,10,780,600,"Was",150,#PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
AddGadgetColumn(1,150,"An Wen?",150)



Counter.l = 0 
If ExamineDirectory(200, "X:\Datenbank\", "*.vl") 
  Repeat 
    Type.l = NextDirectoryEntry() 
    If Type = 1 
      Counter + 1 
      OpenFile(100+counter,DirectoryEntryName())
      name$ = ReadString()
     AddGadgetItem(1,counter,name$)
      SetGadgetItemText(1,counter,ReadString(),1)
      CloseFile(100+counter)
    EndIf 
  Until Type = 0 
EndIf 

Repeat

eventid = WaitWindowEvent()
If eventid = #PB_Event_Gadget
Select EventGadgetID()

Case 2
    
    exit = 1
    
EndSelect
EndIf
Until exit = 1
End
brauche Hilfe

Mfg lassma-asma

Verfasst: 22.11.2007 21:27
von STARGÅTE
DirectoryEntryName()

gibt nur den Dateinamen zurück nicht den kompletten Path, must du also so machen :

"X:\Datenbank\"+DirectoryEntryName()

Verfasst: 22.11.2007 21:29
von lassma-asma
super ...
Viiiiiiiiiielen dank STARGATE ...

wär ich nich draufgekommen ...
nochmals danke ..

mfg

Verfasst: 22.11.2007 21:44
von AND51
Warum machst du es dir so umständlich mit deiner 'counter'-Geschichte?
So geht es viel besser und elegenater:

Code: Alles auswählen

If ExamineDirectory(#PB_Any, "X:\Datenbank\", "*.vl")
   Repeat
      Type=NextDirectoryEntry()
      If Type = 1
         file=ReadFile(#PB_Any, "X:\Datenbank\DirectoryEntryName())
         If file
            name$=ReadString()
            AddGadgetItem(1, -1, name$+Chr(10)+ReadString())
            CloseFile(file)
         EndIf
      EndIf
   Until Type = 0
EndIf
  • Wenn du #PB_Any für ExamineDirectory() und ReadFile() benutzt, brauchst du dir keine eigenen IDs dafür ausdenken, vor allem macht es keinen Sinn, wenn du IDs wie '100+counter' benutzt, wenn du die Datei sowieso gleich wieder schließt.
  • Wenn du wirklich nur aus Dateien liest, benutze ReadFile() anstatt OpenFile(). Denn OpenFile() verlangt zusätzlich Schreibrechte auf diese Datei, die aber nicht immer zur Verfügung stehen (z. B. bei Netzwerken). Dann wird vielleicht der Zugriff verhindert, weil du zusätzlich Schreibrechte verlangst, obwohl du die Datei ganz leicht mit ReadFile() hättest auslesen können. Genauso, wenn du nur schreibst, dafür nimm lieber CreateFile()!
  • Außerdem solltest du testen, ob die Datei auch wirklich geöffnet werden konnte! Das Lesen aus/Schreiben in Dateien, die nicht erfolgreich geöffnet werden konnten, kann mit (schweren) Programmsbstürzen enden!!
  • Chr(10) spart die eine Zeile Code, damit kannst du den Text auf verschiedene Spalten beim ListIconGadget() aufteilen.
  • -1 bei dem Befehl AddGadgetItem() fügt die Zeile automatisch am Ende der Liste hinzu, kein Counter nötig! Wie du siehst konnte ich so den Counter ganz streichen.
Schade, dass du nicht schon PB 4.xx benutzt, sonst könntest du deinen Code noch etwas weiter verbessern. Ich weiß dass du Anfänger bist, aber diese Tipps wollte ich dir ans Herz legen. :allright:

Verfasst: 22.11.2007 23:21
von NicTheQuick
AND51 hat noch ein paar Fehler drin. Hier der berichtigte Code:

Code: Alles auswählen

Define dir.l
dir = ExamineDirectory(#PB_Any, "X:\Datenbank\", "*.vl")
If dir
  While NextDirectoryEntry(dir)
    If DirectoryEntryType(dir) = #PB_DirectoryEntry_File
      File = ReadFile(#PB_Any, "X:\Datenbank\" + DirectoryEntryName(dir))
      If File
        name$ = ReadString(File)
        AddGadgetItem(1, -1, name$ + Chr(10) + ReadString(File))
        CloseFile(File)
      EndIf
    EndIf
  Wend
EndIf
Aber ich verstehe nicht, warum hier zweimal 'ReadString()' aufgerufen
wird. Ich dachte von der Beschreibung her, dass nur eine Zeile ausgelesen
werden soll. Allerdings macht es dann mit den Spalten wenig Sinn, weil
man dann ja nur eine bräuchte.
So wie es jetzt ist werden zwei Zeilen ausgelesen, die in zwei Spalten
geschreiben werden. Und pro Datei wird eine Zeile ausgelesen.

Verfasst: 23.11.2007 14:55
von AND51
NichTheTooQuick hat nicht aufgepasst: Er hat den Code für PB 4.00+ erstellt, während meiner noch für deine 3.94er Version ist. (Der Threadersteller benutzt 3.94, siehe Signatur)
Außerdem hat NicTheQuick vergessen, wenn er schon für 4.00+ schreibt, FinishDirectory() zu benutzen. :wink:

> Aber ich verstehe nicht, warum hier zweimal 'ReadString()' aufgerufen wird
Die einzige Erklärung ist, dass in einer Datei 2 Zeilen Text stehen, die in dem gadget nebeneinander in Spalten angeordnet werden sollen.

Code: Alles auswählen

Pummela Anderson
129 kg

Dick und Doof
156 kg
Es kann durchaus Sinn machen, diese Angaben in verschiedene Spalten zu stecken, allein schon wegen der Übersichtlichkeit.

> So wie es jetzt ist werden zwei Zeilen ausgelesen, die in zwei Spalten geschreiben werden. Und pro Datei wird eine Zeile ausgelesen.
Du widersprichst dir, oder ich verstehe diese Aussage nicht. Es werden po Datei 2 Zeilen ausgelesen, aber warum schreibst du am Ende, dass nur 1 ausgelsen würde?
Sollten die Dateien aussehen wie in meinem Beispiel (2 Angaben, einer in jeder Zeile), dann können diese auch in 2 Spalten in einem ListIconGadget() geschrieben werden. So kann man z. B. nach der jeweiligen ANgabe sortieren lassen (Etwa mit der PureLVSORT-Lib).

Verfasst: 23.11.2007 16:30
von NicTheQuick
Ja, 'FinishDirectory()' hatte ich vergessen. Aber das wird dann ja sowieso am
Ende des Programm von PureBasic automatisch gemacht, so wie es in V3.94
noch üblich ist.

Und wegen meinem Widerspruchssatz:
Ich weiß auch nicht mehr, was ich da geschrieben habe. Auf jeden Fall kann
der letzte Satz weg. Der macht da echt keinen Sinn. <)

Und berichtige doch zumindest mal das fehlende 'EndIf' in deinem Code
oben.

Verfasst: 23.11.2007 16:53
von AND51
> Ja, 'FinishDirectory()' hatte ich vergessen. Aber das wird dann ja sowieso am Ende des Programm von PureBasic automatisch gemacht, so wie es in V3.94 noch üblich ist
Richtig, aber wenn man mit #PB_Any zig Verzeichnisse scannt, bleibt dieser Daten,üll im Speicher... Das könnte man aber verhindern, indem man 1 Konstante benutzt, und diese verwendet, denn neue Objekte (Sprites, Files, Dirs, ...) ersetzen automatisch alte Objekte, wenn beide die gleiche ID haben.

> Und wegen meinem Widerspruchssatz
Ah ok. :)

> Und berichtige doch zumindest mal das fehlende 'EndIf' in deinem Code
oben
Autsch! Naja, habe den Code sowieso OTF im PB Board geschrieben, vielleicht zählt das ja als Ausrede. :roll:

Done.

Verfasst: 24.11.2007 11:09
von lassma-asma
ok ... hab mir eure Vorschläge zu Herzen genommen ...


Nochma danke !

... achso ... mein programm ist auch fertig ...
LINK: http://www.purebasic.fr/german/viewtopic.php?t=14956

MfG

Verfasst: 24.11.2007 14:28
von HeX0R
lassma-asma hat geschrieben: LINK:http://www.purebasic.fr/german/viewtopic.php?t=14956
Sodele, jetzt noch ein Leerzeichen zwischen LINK: und http:// einpappen und der Link ist sogar klickbar.