Seite 1 von 1

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

Verfasst: 11.10.2005 17:30
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

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

Verfasst: 11.10.2005 17:42
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 

Verfasst: 11.10.2005 18:26
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.

Verfasst: 11.10.2005 18:29
von satzzeichen
Habs grad gecheckt, dein Code klappt zwar hat aber an dem Urproblem nix geändert!!!!!!!

Verfasst: 11.10.2005 19:46
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

Verfasst: 12.10.2005 10:13
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

Verfasst: 12.10.2005 10:59
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.

Verfasst: 12.10.2005 13:47
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.

Verfasst: 12.10.2005 18:47
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

Verfasst: 12.10.2005 19:23
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