Texteingabe speichern und in Textfeld ausgeben

Anfängerfragen zum Programmieren mit PureBasic.
PureNoob
Beiträge: 33
Registriert: 25.09.2007 15:30

Texteingabe speichern und in Textfeld ausgeben

Beitrag von PureNoob »

Hallo Leute,

vorab... ich bin blutiger Anfänger was PureBasic anbelangt. Ich habe damals mal in der Schule Basic programmiert, aber das liegt über 13 Jahre zurück.

Ich möchte ein kleines Programm schreiben, dass nach Eingabe eines Verzeichnisses z.B. "C:\Progamme\Testprogramm" in ein StringGadget diese Eingabe nach dem Drücken des "Speichern" Buttons (ButtonGadget) in einem TextFeld darunter ausgibt (TextGadget). Diese Eingabe soll aber bei jedem Start des Programms im TextGadget vorhanden sein. Die Eingabe kann aber durch einen Neueintrag in den StringGadget und drücken des Buttons überschrieben werden.

Ich habe auf meiner Oberfläche das hier vorbereitet:

Code: Alles auswählen

; PureBasic Visual Designer v3.95 build 1485 (PB4Code)


;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #String_0
  #Button_0
  #Text_0
  #Button_1
  #Button_2
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 216, 0, 600, 406, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      StringGadget(#String_0, 60, 10, 220, 20, "")
      ButtonGadget(#Button_0, 290, 10, 120, 20, "Verzeichnis speichern")
      TextGadget(#Text_0, 60, 40, 220, 20, "")
      ButtonGadget(#Button_1, 60, 60, 120, 20, "Start mit Löschung")
      ButtonGadget(#Button_2, 190, 60, 120, 20, "Start ohne Löschung")
      
    EndIf
  EndIf
EndProcedure

In dem Verzeichnis befinden sich Savegame Dateien, die vor dem Start gelöscht werden können wofür sich 2 Buttons unter dem TextGadget befinden. Nach dem Drücken der ersten Taste sollen die Dateien in dem Verzeichnis das in TextGadget gespeichert ist, gelöscht werden, dann soll das Programm gestartet werden. Der andere Button startet das Programm ohne Löschung.

Wie muss ich das jetzt einbauen, damit mir beim erstellen der EXE Datei auch die Oberfläche angezeigt wird?

Ich bin für jeden Rat sehr dankbar.

MfG

PureNoob
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Texteingabe speichern und in Textfeld ausgeben

Beitrag von Kiffi »

Hallo PureNoob,

willkommen im Board!
PureNoob hat geschrieben:Wie muss ich das jetzt einbauen, damit mir beim erstellen der EXE Datei auch die Oberfläche angezeigt wird?
Du musst zum einen die Prozedur Open_Window_0() aufrufen und danach
eine Event-Schleife durchlaufen, in der dann die Fenster-Ereignisse
verarbeitet werden können.

Code: Alles auswählen

Open_Window_0() 

Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow
also insgesamt sähe dein Code dann so aus:

Code: Alles auswählen

; PureBasic Visual Designer v3.95 build 1485 (PB4Code)


;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #String_0
  #Button_0
  #Text_0
  #Button_1
  #Button_2
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 216, 0, 600, 406, "New window ( 0 )", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      StringGadget(#String_0, 60, 10, 220, 20, "")
      ButtonGadget(#Button_0, 290, 10, 120, 20, "Verzeichnis speichern")
      TextGadget(#Text_0, 60, 40, 220, 20, "")
      ButtonGadget(#Button_1, 60, 60, 120, 20, "Start mit Löschung")
      ButtonGadget(#Button_2, 190, 60, 120, 20, "Start ohne Löschung")
      
    EndIf
  EndIf
EndProcedure

Open_Window_0() 

Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow
Grüße .... Kiffi
a²+b²=mc²
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

ich bin mir noch nicht ganz sicher, ob ich genau verstanden habe, was du meinst.

Aber falls es um Dateizugriff geht (lesen/schreiben) bieten sich einmal die "Preference" - Dateien an (einfach in die Hilfe "preference*" eingeben) oder normaler Dateizugriff an (unter "Readfile*") zu finden.

Falls das Problem ein anderes ist, dann sag bescheid ^^
PureNoob
Beiträge: 33
Registriert: 25.09.2007 15:30

Beitrag von PureNoob »

Hallo Leute,

also das mit Kiffi´s Vorschlag funktioniert schon mal... Super!

Aber wie kriege ich die eingabe von StringGadget ins TextGadget? Das soll ja nach dem Drücken des buttons erfolgen.

Und diese Eingabe soll bei jedem Neustart des PRogramms wieder im Textgadget stehen, wobei der StringGadget beim Neustart geleert wird.

Ähm... hilfää??

Ich bin ratlos.

PureNoob
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

PureNoob hat geschrieben:Aber wie kriege ich die eingabe von StringGadget ins TextGadget? Das soll ja nach dem Drücken des buttons erfolgen.
hierfür musst Du obige Event-Schleife durch die unten stehende ersetzen.

Code: Alles auswählen

Repeat
  
  WWE = WaitWindowEvent()
  
  Select WWE
    
    Case #PB_Event_Gadget  ; Es ist ein Gadget-Ereignis aufgetreten
    
      Select EventGadget() ; Welches Gadget hat das Ereignis ausgelöst?
        
        Case #Button_0 ; Button 0 wurde gedrückt
          SetGadgetText(#Text_0, GetGadgetText(#String_0))
          
        Case #Button_1 ; Button 1 wurde gedrückt
        Case #Button_2 ; Button 2 wurde gedrückt
        
      EndSelect
      
  EndSelect
  
Until WWE = #PB_Event_CloseWindow ; Fenster wurde geschlossen
Bzgl. Speichern und Laden schaust Du Dir bitte die von gnasen
empfohlenen Preference-Befehle in der PB-Hilfe an.

Grüße ... Kiffi
a²+b²=mc²
PureNoob
Beiträge: 33
Registriert: 25.09.2007 15:30

Prefe... was?!?

Beitrag von PureNoob »

Hi Leute,

also ich habe mal die Forensuche genutzt und da unheimlich viel zum Thema Preference gefunden. Ich weiss... Lesen & Lernen. Nur leider konnte ich keinen Codeschnipsel finden, den ich auf das von mir beschriebene Problem zurechschustern könnte.

Ich habe eben auch das Problem, dass es bei mir über die 5 Klasse Basic-Grundkurs nicht sehr weit hin ist mit dem zusammensetzen der Befehle und so. Ich bezeichne mich daher eher als "Schnipsel-Bastler" und sehe was am Ende passiert... oder leider meistens halt :cry: nicht passiert :cry: .

Ich denke mal wenn ihr mir den ein oder anderen schubs in die richtige Richtung gebt anhand von Schnipseln dann dürfte ich das sicher hinkriegen.

Ich bin echt ratlos. :(
PureNoob
Beiträge: 33
Registriert: 25.09.2007 15:30

Was ist da falsch?

Beitrag von PureNoob »

Hallo Leute,

ich habe jetzt für mein Programm folgendes ausprobiert:

Code: Alles auswählen

; PureBasic Visual Designer v3.95 build 1485 (PB4Code)


;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #String_0
  #Button_0
  #Text_0
  #Button_1
  #Button_2
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 216, 0, 600, 406, "New window ( 0 )", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      StringGadget(#String_0, 60, 10, 220, 20, "")
      ButtonGadget(#Button_0, 290, 10, 120, 20, "Verzeichnis speichern")
      TextGadget(#Text_0, 60, 40, 220, 20, "")
      ButtonGadget(#Button_1, 60, 60, 120, 20, "Start mit Löschung")
      ButtonGadget(#Button_2, 190, 60, 120, 20, "Start ohne Löschung")
     
    EndIf
  EndIf
EndProcedure

Open_Window_0()

Repeat
 
  WWE = WaitWindowEvent()
 
  Select WWE
   
    Case #PB_Event_Gadget  ; Es ist ein Gadget-Ereignis aufgetreten
   
      Select EventGadget() ; Welches Gadget hat das Ereignis ausgelöst?
       
        Case #Button_0 ; Button 0 wurde gedrückt
          SetGadgetText(#Text_0, GetGadgetText(#String_0))
         
        Case #Button_1 ; Button 1 wurde gedrückt
        Ergebnis = DeleteFile("GetGadgetText(#String_0)+ savegame.sav")
        
        Case #Button_2 ; Button 2 wurde gedrückt
       
      EndSelect
     
  EndSelect
 
Until WWE = #PB_Event_CloseWindow ; Fenster wurde geschlossen

Zwar sagt mir das Programm dass es was getan hat, nur leider ist die Datei immer noch nicht weg. Woran liegt das?

Gruss PureNoob
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Prefe... was?!?

Beitrag von Kiffi »

Das Lesen von Programmeinstellungen geschieht am besten zu
Programmstart, das Speichern meist am Programmende.

Mit diesen Vorgaben schreiben wir nun zwei Prozeduren ParameterLaden(),
welche nach Open_Window_0() aufgerufen wird und ParameterSpeichern(),
welche am Ende der Event-Schleife aufgerufen wird.

Code: Alles auswählen

;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #String_0
  #Button_0
  #Text_0
  #Button_1
  #Button_2
EndEnumeration

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 216, 0, 600, 406, "New window ( 0 )", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      StringGadget(#String_0, 60, 10, 220, 20, "")
      ButtonGadget(#Button_0, 290, 10, 120, 20, "Verzeichnis speichern")
      TextGadget(#Text_0, 60, 40, 220, 20, "")
      ButtonGadget(#Button_1, 60, 60, 120, 20, "Start mit Löschung")
      ButtonGadget(#Button_2, 190, 60, 120, 20, "Start ohne Löschung")
      
    EndIf
  EndIf
EndProcedure

Procedure ParameterLaden()
  
  Protected GelesenerWert.s
  
  OpenPreferences("Parameter.ini")
  
  GelesenerWert = ReadPreferenceString("verzeichnis", "")
  
  SetGadgetText(#Text_0, GelesenerWert)
  
  ClosePreferences()
  
EndProcedure

Procedure ParameterSpeichern()
  
  Protected ZuSchreibenderWert.s
  
  If CreatePreferences("Parameter.ini")
    
    ZuSchreibenderWert = GetGadgetText(#Text_0)
    
    WritePreferenceString("verzeichnis", ZuSchreibenderWert)
    
    ClosePreferences()
    
  EndIf
  
EndProcedure

Open_Window_0()

ParameterLaden()

Repeat
  
  WWE = WaitWindowEvent()
  
  Select WWE
    
    Case #PB_Event_Gadget  ; Es ist ein Gadget-Ereignis aufgetreten
      
      Select EventGadget() ; Welches Gadget hat das Ereignis ausgelöst?
        
        Case #Button_0 ; Button 0 wurde gedrückt
          SetGadgetText(#Text_0, GetGadgetText(#String_0))
          
        Case #Button_1 ; Button 1 wurde gedrückt
          Ergebnis = DeleteFile(GetGadgetText(#Text_0) + "savegame.sav")
          
        Case #Button_2 ; Button 2 wurde gedrückt
          
      EndSelect
      
  EndSelect
  
Until WWE = #PB_Event_CloseWindow ; Fenster wurde geschlossen

ParameterSpeichern()
PureNoob hat geschrieben:Zwar sagt mir das Programm dass es was getan hat, nur leider ist die Datei immer noch nicht weg. Woran liegt das?

Code: Alles auswählen

Ergebnis = DeleteFile("GetGadgetText(#String_0)+ savegame.sav") 
Du hast GetGadgetText() mit in die Anführungszeichen genommen. PB
versucht dann eine Datei namens "GetGadgetText(#String_0)+
savegame.sav" zu löschen. Diese gibt es mit Sicherheit nicht auf Deiner
Platte ;-). Oben steht die korrigierte Version.

Des weiteren darfst Du mit GetGadgetText nicht den Text auslesen, der in
#String_0 steht, sondern den, der in #Text_0 steht (dorthin wird auch der
mit Preference gespeicherte Verzeichnisname bei Programmstart
geschrieben).

Es gibt noch ein paar neue Sachen in obigen Code. Bitte lies in der PB-Hilfe
deren Bedeutung nach, damit Du weißt, was in Deinem Programm
passiert.

Grüße ... Kiffi
a²+b²=mc²
PureNoob
Beiträge: 33
Registriert: 25.09.2007 15:30

Mehrere Sachen speichern

Beitrag von PureNoob »

Hi Kiffi,

Du sag mal ich hab ja jetzt den Code damit das Programm die Eingabe aus dem Textfeld in der Preference.ini abspeichert. Geht das auch mit mehreren Feldern? Zum Beispiel wenn ich zwei Felder hätte? Wie muss ich da den Code abändern?

Gruss PureNoob
PureNoob
Beiträge: 33
Registriert: 25.09.2007 15:30

Mehrere INI´s

Beitrag von PureNoob »

Ich hab das Problem gelöst indem ich einfach 2 verschiedene ini´s erstellt habe, die separat ausgelesen werden. So geht es ja dann...

Danke für die Hilfe... oder kann man das auch alles in eine INI schreiben? ;-) Geht das auch?

Gruss PureNoob
Antworten