Daten speichern und Abfragen

Für allgemeine Fragen zur Programmierung mit PureBasic.
sobi
Beiträge: 170
Registriert: 05.02.2005 23:41
Wohnort: passau
Kontaktdaten:

Daten speichern und Abfragen

Beitrag von sobi »

Hallo,

aus einem StringGadget würde ich gerne die Daten speichern. Allerdings tut er das noch nicht so, wie ich das will! :(
Folgendes habe ich zusammengebaut:

Code: Alles auswählen

If OpenWindow(0,140,140,400,300,#PB_Window_SystemMenu,"Daten speichern")
  If CreateGadgetList(WindowID())
    ButtonGadget(2,140,20,100,20,"Speichern")
    hallo.b = StringGadget(4, 100, 60, 60, 20, "Halllo ")
  EndIf
EndIf   
  
  
Procedure Speichern()
 If OpenFile(1,"Daten.txt")
     WriteStringN(Str(hallo.b))
    CloseFile(1)
 EndIf
EndProcedure

Repeat
  EventID.l = WaitWindowEvent()
    If EventID = #PB_Event_Gadget
      ;Schalter SPEICHERN
      If EventGadgetID()=2
        Speichern()
      EndIf
    EndIf
Until EventID = #PB_EventCloseWindow   
End
Was muss ich denn falsch gemacht?

Liebe Grüße,


Simon
Sorgen sind wie Blumen, wenn man sie nicht gießt, gehen sie ein.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

hallo.b ist das handle vom Fenster(Gadget).

Code: Alles auswählen

If OpenWindow(0,140,140,400,300,#PB_Window_SystemMenu,"Daten speichern")
  If CreateGadgetList(WindowID())
    ButtonGadget(2,140,20,100,20,"Speichern")
    StringGadget(4, 100, 60, 60, 20, "Halllo ")
  EndIf
EndIf   
 
 
Procedure Speichern()
 If OpenFile(1,"Daten.txt")
     WriteStringN(GetGadgetText(4))
    CloseFile(1)
 EndIf
EndProcedure

Repeat
  EventID.l = WaitWindowEvent()
    If EventID = #PB_Event_Gadget
      ;Schalter SPEICHERN
      If EventGadgetID()=2
        Speichern()
      EndIf
    EndIf
Until EventID = #PB_EventCloseWindow   
End
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
sobi
Beiträge: 170
Registriert: 05.02.2005 23:41
Wohnort: passau
Kontaktdaten:

Beitrag von sobi »

Hi Daniel,

meine Güte, jetzt wo du es mir sagst... *grins* ich mache Vortschritte (auch wenn man das noch mehr als "krabbeln" bezeichnen kann! :D)

Jetzt nur mal nachgefragt, ob ich das richtig sehe:

Code: Alles auswählen

    If EventID = #PB_Event_Gadget 
      ;Schalter SPEICHERN 
      If EventGadgetID()=2 
        Speichern() 
      EndIf 
    EndIf 
nach der Prozedur "Speichern" kann ich doch eigentlich eine zweite Aufrufen, die dann anzeigt, dass die Daten gespeichert wurden - richtig?
Sorgen sind wie Blumen, wenn man sie nicht gießt, gehen sie ein.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Ja, du kannst eine zweite danach Aufrufen, die sagt, dass alles gespeichert wurde. Dann würde ich aber die erste Prozedur mit einem Rückgabewert preparieren.

Also so ungefähr:

Code: Alles auswählen

Procedure Speichern()
 If OpenFile(1,"Daten.txt")
    If WriteStringN(GetGadgetText(4))
      Result = 1
    EndIf
    CloseFile(1)
 EndIf
  ProcedureReturn Result ;Wenn etwas in die Datei reingeschrieben wurde, dann wird ja Result auf 1 gesetzt
EndProcedure 

Procedure Ausgabe()
  MessageRequester("Info", "Die Datei wurde erfolgreich beschrieben.")
EndProcedure

...
...

      If EventGadgetID()=2
        If Speichern()
          Ausgabe()
        EndIf
      EndIf 
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
sobi
Beiträge: 170
Registriert: 05.02.2005 23:41
Wohnort: passau
Kontaktdaten:

Beitrag von sobi »

DarkDragon hat geschrieben:

Code: Alles auswählen

    If EventGadgetID()=2
        If Speichern()
          Ausgabe()
        EndIf
      EndIf 

Das habe ich gleich ausprobiert, allerdings funktioniert das bei mir nur ohne die If Speichern() - Schleife. Ist das auch in Ordnung? (Er speichert mit und ohne Schleife, aber ein Bestätigung erhalte ich nur ohne Schleife)
Sorgen sind wie Blumen, wenn man sie nicht gießt, gehen sie ein.
sobi
Beiträge: 170
Registriert: 05.02.2005 23:41
Wohnort: passau
Kontaktdaten:

Beitrag von sobi »

tata...
So funktioniert es (Result ist bei mir aber 0 - ist das schlimm?)

Code: Alles auswählen

Repeat 
  EventID.l = WaitWindowEvent() 
    If EventID = #PB_Event_Gadget 
      ;Schalter SPEICHERN 
       If EventGadgetID()=2 
         Speichern() 
        If Result = 0
          Ausgabe() 
        EndIf 
      EndIf 
    EndIf 
Until EventID = #PB_EventCloseWindow    
Sorgen sind wie Blumen, wenn man sie nicht gießt, gehen sie ein.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
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 »

Nein, nein, nein. So geht das nicht. Die Variable [c]Result.l[/c] ist nur in deiner Procedure gültig, d.h. sie ist sowieso immer Null, wenn du sie im Hauptprogramm nicht entsprechend änderst.

Hier mal ein funktionierender Code mit ein paar Kommentaren:

Code: Alles auswählen

Procedure Speichern()
  If OpenFile(1, "o:\Daten.txt")
    WriteStringN(GetGadgetText(4))
    CloseFile(1)
    ; Die Daten wurden geschrieben, also gib #True (wahr = 1) zurück
    ProcedureReturn #True
  Else
    ; Die Datei konnte nicht geöffnet oder erstellt werden. Gib #False (falsch = 0) zurück
    ProcedureReturn #False
  EndIf
EndProcedure

If OpenWindow(0, 140, 140, 400, 300, #PB_Window_SystemMenu, "Daten speichern")
  If CreateGadgetList(WindowID())
    ButtonGadget(2, 140, 20, 100, 20, "Speichern")
    StringGadget(4, 100, 60,  60, 20, "Halllo ")
    
    Repeat
      EventID.l = WaitWindowEvent()
      If EventID = #PB_Event_Gadget
        ;Schalter SPEICHERN
        If EventGadgetID() = 2
          If Speichern() ; = #True nicht nötwendig, da Ausdruck nur ungleich Null sein muss.
            
            ; Wenn die Speichern-Funktion #True zurückgibt hat alles geklappt, also gib die Meldung aus.
            MessageRequester("Daten speichern", "Die Daten wurden erfolgreich gespeichert.")
          Else
            
            ; Wenn die Speichern-Funktion #False zurückgibt gab es einen Fehlern, also gib ihn aus.
            MessageRequester("Daten speichern", "Es trat ein Fehler beim Speichern der Daten auf.")
          EndIf
          
        EndIf
      EndIf
    Until EventID = #PB_EventCloseWindow
  EndIf
EndIf
sobi
Beiträge: 170
Registriert: 05.02.2005 23:41
Wohnort: passau
Kontaktdaten:

Beitrag von sobi »

NicTheQuick hat geschrieben:Nein, nein, nein. So geht das nicht. Die Variable [c]Result.l[/c] ist nur in deiner Procedure gültig, d.h. sie ist sowieso immer Null, wenn du sie im Hauptprogramm nicht entsprechend änderst.

Hier mal ein funktionierender Code mit ein paar Kommentaren:
*gg* das war ein sehr entschiedenes Nein! Das habe ich verstanden! - Allerdings macht das Script noch nicht das, was es soll. Es speichert nicht und ich weiß nicht warum! :(
Ich bekomme ständig die Fehlermeldung, dass es eben "schief gelaufen ist"! - Wo muss ich das ändern?

LG


Simon
Sorgen sind wie Blumen, wenn man sie nicht gießt, gehen sie ein.
sobi
Beiträge: 170
Registriert: 05.02.2005 23:41
Wohnort: passau
Kontaktdaten:

Beitrag von sobi »

sobi hat geschrieben:Es speichert nicht und ich weiß nicht warum! :(
:oops: ähm... :roll: habe den Fehler gefunden!

Vielen Dank, jetzt läuft es prima! Die zweite Zeile habe ich übersehen

Code: Alles auswählen

If OpenFile(1, "o:\Daten.txt") 
Dankeschön Nic,
Sorgen sind wie Blumen, wenn man sie nicht gießt, gehen sie ein.
Antworten