Einträge aus einem ListIconGadget löschen und speichern...?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
satzzeichen
Beiträge: 34
Registriert: 22.05.2005 13:59
Wohnort: Rötha bei Leipzig
Kontaktdaten:

Einträge aus einem ListIconGadget löschen und speichern...?

Beitrag von satzzeichen »

Hi Leute,

ich arbeite im moment an einer Art "Adressbuch". Man kann Einträge reinmachen/rausmachen/ändern und das ganze wird in einer .dat Datei gespeichert. Nur habe ich das Problem, dass wenn ich einen Eintrag lösche dann wird das ganze nicht korrekt abgespeichert :(

Hier der Code. . .

Code: Alles auswählen


Procedure EintragEntfernen()

  If GetGadgetState(0) > -1
    RemoveGadgetItem(0, GetGadgetState(0))
    DelFiles.l + 1
    
  Else
    MessageRequester("Bitte Eintrag auswählen!","Um einen Eintrag zu entfernen müssen sie ihn zuerst anwählen.")
    
  EndIf
  
EndProcedure

Procedure ProgramBeenden()

;-Notizzettel speichern
  OpenFile(0, "notiz.dat")
  notiz$ = GetGadgetText(9) 
  WriteString(notiz$) 
  CloseFile(0)

;-Adressliste speichern  
  
   If CountGadgetItems(0) > -1
  
    CreateFile(2, "Eigene Adressliste.dat")
    OpenFile(3,"Eigene Adressliste.dat")
    
    ListEnd = CountGadgetItems(0)
    
    For DoIt = 0 To ListEnd
    
    SpeichernText1$ = GetGadgetItemText(0, DoIt, 0)
    SpeichernText2$ = GetGadgetItemText(0, DoIt, 1)
    SpeichernText3$ = GetGadgetItemText(0, DoIt, 2)
    SpeichernText4$ = GetGadgetItemText(0, DoIt, 3)
    SpeichernText5$ = GetGadgetItemText(0, DoIt, 4)
    SpeichernText6$ = GetGadgetItemText(0, DoIt, 5)
    
    ;For Loop = 0 To 5
    ;  SpeichernText$(Loop) = GetGadgetItemText(0,DoIt,Loop)
    ;Next
    
    If SpeichernText1$ = "" And SpeichernText2$ = "" And SpeichernText3$ = "" And SpeichernText4$ = "" And SpeichernText5$ = "" And SpeichernText6$ = ""
      MessageRequester("","MÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖP")
    Else
      WriteStringN(SpeichernText1$+Chr(10)+SpeichernText2$+Chr(10)+SpeichernText3$+Chr(10)+SpeichernText4$+Chr(10)+SpeichernText5$+Chr(10)+SpeichernText6$)
    EndIf

    Next
    
    CloseFile(3)
    
  EndIf
  
  End
  
EndProcedure 

Hoffentlich könnt ihr mir helfen! Fals ihr mehr Infos/Code braucht einfach mal posten :allright:

Bei MessageRequester("","MÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖP") müsste man die gelöschten Einträge ja rausfiltern können irgendwie aber so richtig klappt das alles nicht :freak:

DANKE, Satzzeichen :D
Der erhabene Geist schafft am meisten, wenn er am wenigsten Arbeitet. Leonardo da Vinci

Ich hätte nie gedacht, dass es soviele Fette gibt. Da kann man ja noch was lernen. G. Schröder
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Einträge aus einem ListIconGadget löschen und speichern.

Beitrag von Kiffi »

Code: Alles auswählen

CreateFile(2, "Eigene Adressliste.dat")
OpenFile(3,"Eigene Adressliste.dat") 
für's erste solltest Du das korrigieren.
Das OpenFile() benötigst Du nicht nach einem CreateFile().

Da gibt's einiges an Deinem Code zu optimieren. Dazu schreibe ich später
was.

Grüße ... Kiffi

// Edit

so, hier eine etwas optimierte Version der Speicherroutine. Falls noch
etwas unklar sein sollte, dann schreib ruhig.

Code: Alles auswählen

;-Adressliste speichern  

  FF = CreateFile(#PB_Any, "Eigene Adressliste.dat")
  
  If FF
  
    For ZeilenZaehler = 0 To CountGadgetItems(0)

      For SpaltenZaehler = 0 To 5
        SpeichernText$ + GetGadgetItemText(0, ZeilenZaehler, SpaltenZaehler) + Chr(10)
      Next
      
      ; Das letzte überflüssige Chr(10) entfernen
      SpeichernText$ = Left(SpeichernText$, Len(SpeichernText$) - 1)
      
      WriteStringN(SpeichernText$)

      SpeichernText$ = ""
      
    Next
    
    CloseFile(FF)
    
  EndIf 
a²+b²=mc²
Benutzeravatar
satzzeichen
Beiträge: 34
Registriert: 22.05.2005 13:59
Wohnort: Rötha bei Leipzig
Kontaktdaten:

Beitrag von satzzeichen »

für's erste solltest Du das korrigieren.
Das OpenFile() benötigst Du nicht nach einem CreateFile().
Bekomme ich Fehler 0 Plan warum.
Da gibt's einiges an Deinem Code zu optimieren. Dazu schreibe ich später
was.
Das passiert wenn sich ein BlitzBasicer in PB versucht ^^
Grüße ... Kiffi
Grüsse zurück :)
Jetzt zu deinem verbesserten Code...
-------------------------------------------------------------------------------------

Code: Alles auswählen

      ; Das letzte überflüssige Chr(10) entfernen
      SpeichernText$ = Left(SpeichernText$, Len(SpeichernText$) - 1) 
Hab ich da irgendwie noch nie ein letztes überflüssiges Chr(10) gehsehen? (Beispielzeile so wie sie sein sollte in der Adressliste.dat = Gregor Giebenrath|keine|456/12345|3472384732|Möllerstr. 12|Leipzig)

| = Chr(10)

Das war jetzt erstmal was mir so einfällt ich haus gleich nochmal ins PB und probier bisl damit rum.
Zuletzt geändert von satzzeichen am 11.10.2005 18:29, insgesamt 1-mal geändert.
Der erhabene Geist schafft am meisten, wenn er am wenigsten Arbeitet. Leonardo da Vinci

Ich hätte nie gedacht, dass es soviele Fette gibt. Da kann man ja noch was lernen. G. Schröder
Benutzeravatar
satzzeichen
Beiträge: 34
Registriert: 22.05.2005 13:59
Wohnort: Rötha bei Leipzig
Kontaktdaten:

Beitrag von satzzeichen »

Habs grad gecheckt, dein Code klappt zwar hat aber an dem Urproblem nix geändert!!!!!!!
Der erhabene Geist schafft am meisten, wenn er am wenigsten Arbeitet. Leonardo da Vinci

Ich hätte nie gedacht, dass es soviele Fette gibt. Da kann man ja noch was lernen. G. Schröder
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Bekomme ich Fehler 0 Plan warum.

dann solltest Du herausfinden, warum das nicht klappt. Mit OpenFile() auf
ein noch nicht geschlossenes CreateFile() zuzugreifen ist jedenfalls nicht
richtig.

> Hab ich da irgendwie noch nie ein letztes überflüssiges Chr(10) gehsehen?

nicht in Deinem Code sondern in meinem.

Da ich SpeichernText$ in einer Schleife befülle, ist nach dem letzten
Schritt der Schleife ein Chr(10) zuviel vorhanden.

> Habs grad gecheckt, dein Code klappt zwar hat aber an dem Urproblem nix
> geändert!!!!!!!

ein Ausrufezeichen genügt.

Also, folgendes Szenario:

Du hast beispielsweise 10 Einträge in Deinem ListIconGadget und beendest
das Programm. Danach öffnest Du die Datei "Eigene Adressliste.dat" und
siehst: Da sind 10 Zeilen drin. Korrekt?

Danach startest Du Dein Programm noch einmal und löscht einen der 10
Einträge. Programm beenden, "Eigene Adressliste.dat" öffnen. Sind nun
immer noch 10 Zeilen vorhanden?

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Mr.X
Beiträge: 66
Registriert: 10.08.2005 22:46
Wohnort: im schönen OWL

Beitrag von Mr.X »

Hi zusammen,

ich möchte zu diesem Thema einmal folgende Gedanken spinnen (vielleicht hat auch jemand kurzfristig Zeit das am Programm zu testen):

- erzeugen eines Textfiles mit CREATE
- 10 Zeilen Text schreiben.
- File schließen.
--> OK

- Das vorhandene Textfile mit OPEN öffnen und
- die 10 Zeilen Text (in ein Gadget ein-) lesen.
- File schließen
--> OK

- (im Gadget) eine Textzeile löschen
- Textfile mit OPEN öffnen, da schon existiert.
- 9 Zeilen Text schreiben und
- Textfile schließen.
--> Die ersten 9 Zeilen werden überschrieben, die 10. bleibt aus der alten Version erhalten.
--> Lösung: Hier das Textfile mit CREATE neu erzeugen

Create (1, "File1.DAT")
Open(2, "File1.DAT")

Das erzeugt zwar keinen Fehler, aber ein Schreiben in die Datei benutzt das File 2 (OPEN)

Probieren:
Create(1, "File1.DAT")
Open(2, "File1.DAT")
;- hier Daten schreiben --
Close(2)
Close(1)

Jetzt solte "File1.DAT" leer sein.

CU
Mr.X
Benutzeravatar
Mr.X
Beiträge: 66
Registriert: 10.08.2005 22:46
Wohnort: im schönen OWL

Beitrag von Mr.X »

Hi zusammen,
ich habe zu meine theoretischen Ausführungen noch kurz ein Testprogramm geschrieben.

Code: Alles auswählen

OpenConsole()

PrintN(": open file")
;CreateFile(2, "_test.txt")
;OpenFile(1, "_test.txt")
CreateFile(1, "_test.txt")

Print(": write text ")
For i=8 To 12
    Print(".")    
    WriteStringN("Zeile"+Str(i)+" - "+Chr(10)+"Text Text Zeile "+Str(i))
Next
PrintN("")

PrintN(": close file")
CloseFile(1)
;CloseFile(2)

PrintN("")
PrintN("press any key to quit")
Repeat : Until Inkey()

CloseConsole()
1. Runde: openfile (1, "_test.txt") ... closefile(1)
1. Durchlauf: Schleife von 1 ... 10 --> OK
2. Durchlauf: Schleife von 3 .... 8, oder so --> die ersten Zeilen werden überschrieben mit 3 ... 8, die restlichen bleiben.

2. Runde: createfile(1, "_test.txt") ... closefile(1)
1. Durchlauf: Schleife von 1 ... 10 --> OK
2. Durchlauf: Schleife von 3 .... 8, oder so --> OK, die Datei enthält nur die Zeilen 3 ... 8.

3. Runde: createfile(2, "_test.txt") : openfile(1, "_test.txt") : ... : closefile(1) : closefile(2)
--> die Textdatei ist leer - logisch.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
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 »

Benutz einfach zum Lesen immer [c]ReadFile()[/c] und zum Schreiben immer [c]CreateFile()[/c], dann sollte das funktionieren.

Lies dir mal die Hilfe zu den Befehlen nochmals gründlicher durch.
Benutzeravatar
satzzeichen
Beiträge: 34
Registriert: 22.05.2005 13:59
Wohnort: Rötha bei Leipzig
Kontaktdaten:

Beitrag von satzzeichen »

Genau wie Mr.X sich das gedacht hat hab ichs auch gemacht, wollte ja eigentlich nur createfile nehmen aber dann gibts ja Fehler. Konnte noch immer nicht herausfinden warum :(

Mein Code erstellt ja die Datei neu und öffnet sie dann gleichzeitig? Scheinbar liegt das Problem eher an diesem CreateFile/OpenFile :( wieso könnte da ein Fehler kommen?! Und wieso kommt einer, wenn ichs ganz weglasse. . . :/

Hoffe ihr könnt mir noch ein wenig helfen achja. . .

Ich habe zuerst 10 Zeilen, dann lösche ich eine schliese das Program und öffne es erneut ich habe 10 Zeilen wieder ABER die, die ich gelöscht hab hat den Inhalt der vorherigen angenommen! Beispiel:

Zeile1
Zeile2
Zeile3;wird gelöscht
Zeile4

->

Zeile1
Zeile2
Zeile4
Zeile4

MfG Satzzeichen
Der erhabene Geist schafft am meisten, wenn er am wenigsten Arbeitet. Leonardo da Vinci

Ich hätte nie gedacht, dass es soviele Fette gibt. Da kann man ja noch was lernen. G. Schröder
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Genau wie Mr.X sich das gedacht hat hab ichs auch gemacht, wollte ja
> eigentlich nur createfile nehmen aber dann gibts ja Fehler. Konnte noch
> immer nicht herausfinden warum :(

anhand Deiner Fehlerbeschreibung bezweifel ich, dass Du meinen Code
ausprobiert hast, bzw. den Tipp von NicTheQuick gelesen hast.

Grüße ... Kiffi
a²+b²=mc²
Antworten