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

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
lassma-asma
Beiträge: 107
Registriert: 10.07.2007 09:14
Wohnort: Saarland

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

Beitrag 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
Zuletzt geändert von lassma-asma am 24.11.2007 11:10, insgesamt 1-mal geändert.
Gruß lassma-asma

MultiPONG
HANGMAN


PB 3.94 und PureBasic 4.51 !!!
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

DirectoryEntryName()

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

"X:\Datenbank\"+DirectoryEntryName()
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
lassma-asma
Beiträge: 107
Registriert: 10.07.2007 09:14
Wohnort: Saarland

Beitrag von lassma-asma »

super ...
Viiiiiiiiiielen dank STARGATE ...

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

mfg
Gruß lassma-asma

MultiPONG
HANGMAN


PB 3.94 und PureBasic 4.51 !!!
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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:
Zuletzt geändert von AND51 am 23.11.2007 16:50, insgesamt 1-mal geändert.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
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

Beitrag 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.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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).
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
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

Beitrag 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.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
lassma-asma
Beiträge: 107
Registriert: 10.07.2007 09:14
Wohnort: Saarland

Beitrag 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
Zuletzt geändert von lassma-asma am 24.11.2007 15:22, insgesamt 1-mal geändert.
Gruß lassma-asma

MultiPONG
HANGMAN


PB 3.94 und PureBasic 4.51 !!!
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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.
Antworten