Seite 2 von 3

Verfasst: 11.02.2009 20:16
von Andesdaf
oh, sehs gerade.
Naja, kann man ja ändern, falls einem türkisch nicht liegt :wink:

Verfasst: 11.02.2009 20:19
von HemSA
Denke ich doch auch :)

Verfasst: 11.02.2009 20:25
von otvzo
Michael, DANKE, das ist was zum lesen!
Damit werde ich mich mal auseinandersetzten. Sieht auf den ersteb Blick genau aus wie das was ich machen will, nur mit anderen Feldinhalten natürlich.
Ich habe in meinem Programm Kunden (Firman), Artikel (Beleuchtungsmaterial), Personal (Beleuchter, Fahrer) und erstelle daraus per Selektion Angebote, Rechnungen und Auswertungen.
Da ich schon immer ein Sicherheitfreak war (Daten immer in AScii damit man sie noch mit anderen Mitteln auslesen, retten kann) mache ich das mit relativen Files aber auf ascii-basis. Alle Systemparameter in Flat-Files (sequential ascii).

Ich Danke. Melde mich zum Ergebnis und stelle fest "Hier werde ich geholfen"
:)

Verfasst: 11.02.2009 21:06
von AND51
Habe hier auch was für dich.
Hat nur überschaubare 156 Zeilen, aber habe ich gerade extra für dich als PB-Anfänger geschrieben.

4 Felder: Vorname, Nachname, Alter und PB-Version einer Person. :)

Alle Angaben werden als String gespeichert, weil es ja nicht nötig ist, damit zu rechnen, also braucht man die Zahlenangaben nicht erst noch unnötig konvertieren.

Auch auf Textdateibasis. Du kannst dir die erzeugte Datei ruhig mal ansehen und manipulieren. Das verwendete Trennzeichen in der Datei ist ein Tabulator. Alles weitere nötige siehst du in den Kommentaren. Was ich nicht kommentiert habe, wird dir deutlich, wenn du dir den entsprechenden Befehl in der Hilfe nachschlägst (draufklicken und F1 drücken).

Code: Alles auswählen

EnableExplicit

Enumeration 
	#fenster
	#liste
	#vorname
	#nachname
	#alter
	#pb_version
	#eintragen
	#eintrag_loeschen
	#alles_loeschen
	#laden
	#speichern
	#counter
EndEnumeration

Procedure speichern()
	; Als Trennzeichen wird Chr(9) statt wie im Gadget Chr(10) benutzt,
	; so kann man ganz leicht einen Eintrag pro Zeile abspeichern und
	; wir brauchen kein spezielles Dateiformat wie INI oder XML
	Protected n, i, datei$
	datei$=SaveFileRequester("Wohin speichern?", "", "Text-Datei (*.txt)|*.txt", 0)
	If datei$
		datei$+".txt" ; Dateiendung manuell hinzufügen, der Requester macht das nicht automatisch
		If FileSize(datei$) <> -1 And MessageRequester("Frage", "Die Datei existiert bereits. Überschreiben?", #PB_MessageRequester_YesNo) = #PB_MessageRequester_No
				MessageRequester("Information", "Dem Wunsch entsprechend wird die Datei nicht überschrieben. Abbruch.")
		Else
			If CreateFile(0, datei$)
				Protected erzeugte_zeile$
				For n=0 To CountGadgetItems(#liste)-1 ; Index der Einträge nullbasiert!
					erzeugte_zeile$=""
					For i=0 To 3 ; nullbasiert; gehe jede Spalte jeden Eintrags durch und führe sie zu einer Zeile zusammen
						erzeugte_zeile$+GetGadgetItemText(#liste, n, i)+Chr(9)
					Next
					WriteStringN(0, erzeugte_zeile$) ; hierdurch entsteht am Dateiende eine Leerzeile, was beim Lesen zu einem Leereintrag führt. Beim Einlesen darauf achten! Vergleiche mit WriteString()
				Next
				CloseFile(0)
				MessageRequester("Erfolg", "Die Daten wurden erfolgreich gespeichert.")
			Else
				MessageRequester("Fehler", "Die Datei konnte nicht angelegt werden.")
			EndIf
		EndIf
	Else
		MessageRequester("Information", "Das Speichern der Datei wurde abgebrochen.")
	EndIf
EndProcedure
Procedure laden()
	; Da wir als Trennzeichen Chr(9) benutzen, das Gadget aber als Trennzeichen
	; Chr(10) erwartet, wenden wir ReplaceString() auf jede gelesene Zeile an
	Protected datei$, zeile$
	datei$=OpenFileRequester("Einen Datensatz öffnen", "", "Text-Datei (*.txt)|*.txt|Alle Dateien (*.*)|*.*", 0)
	If datei$
		If ReadFile(0, datei$)
			ClearGadgetItems(#liste) ; vor dem Laden die Liste leeren
			While Not Eof(0) ; solange Dateiende NICHT erreicht...
				zeile$=ReadString(0) ; ...lese eine Zeile
				If zeile$ ; die Leerzeile, die beim Speichern passiert, hierdurch abfangen
					zeile$=ReplaceString(zeile$, Chr(9), Chr(10))
					AddGadgetItem(#liste, -1, zeile$)
				EndIf
			Wend
			CloseFile(0)
			MessageRequester("Erfolg", "Der Datensatz wurde eingelesen.")
		Else
			MessageRequester("Fehler", "Die Datei konnte nicht gelesen werden.")
		EndIf
	Else
		MessageRequester("Information", "Das Laden einer Datei wurde abgebrochen.")
	EndIf
EndProcedure
Procedure counter()
	Protected anzahl=CountGadgetItems(#liste)
	SetGadgetText(#counter, "Anzahl der Einträge: "+Str(anzahl))
EndProcedure


OpenWindow(#fenster, 0, 0, 640, 500, "Beispielhafte Dateiverwaltung", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
	ListIconGadget(#liste, 5, 5, 630, 350, "Vorname", 200, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines)
		AddGadgetColumn(#liste, 1, "Nachname", 200)
		AddGadgetColumn(#liste, 2, "Alter", 50)
		AddGadgetColumn(#liste, 3, "PB Version", 140)
		AddGadgetItem(#liste, -1, "Max"+Chr(10)+"Mustermann"+Chr(10)+"42"+Chr(10)+"3.94")
	Frame3DGadget(#PB_Any, 5, 355, 630, 140, "Ein-/Ausgabe")
	TextGadget(#PB_Any, 10, 370, 100, 14, "Vorname")
	TextGadget(#PB_Any, 205, 370, 100, 14, "Nachname")
	TextGadget(#PB_Any, 400, 370, 40, 14, "Alter")
	TextGadget(#PB_Any, 445, 370, 100, 14, "PB Version")
	StringGadget(#vorname, 10, 385, 185, 20, "")
	StringGadget(#nachname, 205, 385, 185, 20, "")
	SpinGadget(#alter, 395, 385, 45, 20, 0, 150, #PB_Spin_Numeric)
		SetGadgetState(#alter, 20)
	ComboBoxGadget(#pb_version, 445, 385, 135, 20, #PB_ComboBox_Editable)
		AddGadgetItem(#pb_version, -1, "3.30")
		AddGadgetItem(#pb_version, -1, "3.94")
		AddGadgetItem(#pb_version, -1, "4.00")
		AddGadgetItem(#pb_version, -1, "4.10")
		AddGadgetItem(#pb_version, -1, "4.20")
		AddGadgetItem(#pb_version, -1, "4.30")
		SetGadgetState(#pb_version, 0)
	TextGadget(#counter, 10, 410, 250, 14, "Anzahl der Einträge: 1")
	ButtonGadget(#eintragen, 395, 410, 185, 20, "Eintragen")
	ButtonGadget(#eintrag_loeschen, 395, 435, 185, 20, "Eintrag löschen")
	ButtonGadget(#alles_loeschen, 395, 460, 185, 20, "Liste löschen")
	ButtonGadget(#laden, 200, 435, 185, 20, "<--| Laden")
	ButtonGadget(#speichern, 200, 460, 185, 20, "-->| Speichern")

Define position

Repeat
	Select WaitWindowEvent()
		Case #PB_Event_CloseWindow
			End
		Case #PB_Event_Gadget
			Select EventGadget()
				Case #liste
					position=GetGadgetState(#liste)
					If  position <> -1
						SetGadgetText(#vorname, GetGadgetItemText(#liste, position, 0))
						SetGadgetText(#nachname, GetGadgetItemText(#liste, position, 1))
						SetGadgetText(#alter, GetGadgetItemText(#liste, position, 2))
						SetGadgetText(#pb_version, GetGadgetItemText(#liste, position, 3))
					EndIf
				Case #eintragen
					position=GetGadgetState(#liste)
					If  position = -1
						AddGadgetItem(#liste, position, GetGadgetText(#vorname)+Chr(10)+GetGadgetText(#nachname)+Chr(10)+GetGadgetText(#alter)+Chr(10)+GetGadgetText(#pb_version))
					Else
						SetGadgetItemText(#liste, position, GetGadgetText(#vorname), 0)
						SetGadgetItemText(#liste, position, GetGadgetText(#nachname), 1)
						SetGadgetItemText(#liste, position, GetGadgetText(#alter), 2)
						SetGadgetItemText(#liste, position, GetGadgetText(#pb_version), 3)
					EndIf
					SetGadgetText(#vorname, "")
					SetGadgetText(#nachname, "")
					SetGadgetState(#alter, 20)
					SetGadgetState(#pb_version, 0)
					counter()
				Case #eintrag_loeschen
					position=GetGadgetState(#liste)
					If position <> -1
						RemoveGadgetItem(#liste, position)
					EndIf
					counter()
				Case #alles_loeschen
					ClearGadgetItems(#liste)
					counter()
				Case #laden
					laden()
					counter()
				Case #speichern
					speichern()
					counter()
			EndSelect
	EndSelect
ForEver

Verfasst: 12.02.2009 20:16
von Andesdaf
sieht schön aus.
Immerhin besser als mein Codekrüppel... :mrgreen:

Verfasst: 12.02.2009 22:23
von AND51
Danke.
Vor allem habe ich die Prozedur speichern(), laden() und counter() ausgegliedert und als extra Procedure geschrieben, damit man es einfacher hat, das Programm zu verstehen.
Das Eventhandling, also das Auswerten von WaitWindowEvent() und EventGadget() bevorzuge ich mit Select/Case zu erledigen, aber das kann jeder selbst gestalten.

Verfasst: 13.02.2009 11:57
von Andesdaf
> Das Eventhandling, also das Auswerten von WaitWindowEvent() und EventGadget() bevorzuge ich mit Select/Case zu erledigen, aber das kann jeder selbst gestalten.
Mach ich auch, finde ich besser als diese ewigen If Abfragen.

Verfasst: 13.02.2009 15:17
von otvzo
Leute, Ihr seid SUPER.
Ich habe mir das angesehen und habe gute Anregungen bekommen.
Es ging ja hauptsächlich darum, das Prinzip beim codieren in PB zu erkennen.
Habe früher viel in auf Großrechner mit PL 1 und FOCUS gearbeitet neben meiner GW-Basic Programmierung.
Nun werde ich die nächsten Tage mal was entwerfen, dann melde ich mich wieder.
Habe jetzt auch die Vollversion gekauft :allright:
Güße an alle "Helfer"
Niels

P.S. Habe das Türkisch zum besseren Verständnis eingedeutscht :wink:

Verfasst: 13.02.2009 15:28
von Kaeru Gaman
Andesdaf hat geschrieben:> Das Eventhandling, also das Auswerten von WaitWindowEvent() und EventGadget() bevorzuge ich mit Select/Case zu erledigen, aber das kann jeder selbst gestalten.
Mach ich auch, finde ich besser als diese ewigen If Abfragen.
wo wir schon dabei sind...

Code: Alles auswählen

   Select WaitWindowEvent()
...
         Select EventGadget() 
finde ich nicht gut, ich bevorzuge

Code: Alles auswählen

EventID = WaitWindowEvent()
EvGadget = EventGadget()

   Select EventID
...   
         Select EvGadget 
das ermöglicht, die werte auch unabhängig vom Case-Branch auszuwerten.
das kann immerhin mal vorkommen.

vor allem verhindert es, dass man (Anfänger) versehentlich mehrfach das WindowEvent abfängt.
solche Beispiele:

Code: Alles auswählen

Repeat
  Select WaitWindowEvent()
    ...
  EndSelect
Until WindowEvent() = #PB_Event_CloseWindow
habe ich schon viel zu oft gesehen.
so muss es korrekt aussehen:

Code: Alles auswählen

Repeat
  EventID = WaitWindowEvent()
  Select EventID
    ...
  EndSelect
Until EventID = #PB_Event_CloseWindow

Verfasst: 13.02.2009 16:02
von Thorsten1867
Wenn die Daten als Klartext gespeichert werden sollen, wäre die Verwendung von XML vielleicht eine gute Idee.
Man kann damit sicher auch einfacher auf die gespeicherten Daten zugreifen.