Suche Beispiel für Adressverwaltung
@ Kaeru
Ja das stimmt. So verarbeite ich persönlich manchmal die Events, ich war auch erst am zögern, ob ichs mit Variablen mache, dachte dann aber, das bräuchte ich in diesem Fall nicht.
Ja das stimmt. So verarbeite ich persönlich manchmal die Events, ich war auch erst am zögern, ob ichs mit Variablen mache, dachte dann aber, das bräuchte ich in diesem Fall nicht.
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
@ AND
ja, vielleicht ist das bei deinem Stil weniger auffällig, weil du bevorzugt mit einer ForEver-Schleife arbeitest.
Ich persönlich mag ForEver überhaupt nicht, wie du weißt.
Allerdings teste ich auch oft das Close innerhalb des Selects, und setze dann ein EXIT-Flag,
das ist flexibler, weil man dann beliebig viele Exit-Bedingungen einstellen kann.
Die Variable für die Events ist mir persönlich einfach angenehmer,
weil ich dann später jeder Zeit den identischen Wert nochmal verarbeiten kann.
so halte ich das auch bei Mausbuttons und Koordinatenchecks und allem möglichen anderen,
das bißchen Speicher fällt nicht ins Gewicht und man ist von vorn herein flexibel.
ja, vielleicht ist das bei deinem Stil weniger auffällig, weil du bevorzugt mit einer ForEver-Schleife arbeitest.
Ich persönlich mag ForEver überhaupt nicht, wie du weißt.
Allerdings teste ich auch oft das Close innerhalb des Selects, und setze dann ein EXIT-Flag,
das ist flexibler, weil man dann beliebig viele Exit-Bedingungen einstellen kann.
Die Variable für die Events ist mir persönlich einfach angenehmer,
weil ich dann später jeder Zeit den identischen Wert nochmal verarbeiten kann.
so halte ich das auch bei Mausbuttons und Koordinatenchecks und allem möglichen anderen,
das bißchen Speicher fällt nicht ins Gewicht und man ist von vorn herein flexibel.
- Thorsten1867
- Beiträge: 1360
- Registriert: 04.02.2005 15:40
- Computerausstattung: [Windows 10 x64] [PB V5.7x]
- Wohnort: Kaufbeuren
- Kontaktdaten:
Hier ein kleines Beispiel einer Adressverwaltung mittels XML.
Code: Alles auswählen
;/ ===== Adressen verwalten =====
;/ by Thorsten Hoeppner
;/ ( PureBasic 4.30 )
Global Anzahl.l
;- ***** Konstanten *****
#XML = 1
Enumeration 1 ; Konstanten Fenster
#Window_Address
#Window_EditAddress
EndEnumeration
#WindowIndex=#PB_Compiler_EnumerationValue
Enumeration 1 ; Konstanten Gadgets
; --- Window_Addressen ---
#Gadget_Address_Liste
#Gadget_Address_NEW
#Gadget_Address_ABBR
#Gadget_Address_EDIT
; --- Window_EditAddress ---
#Gadget_EditAddress_T_Name
#Gadget_EditAddress_E_Name
#Gadget_EditAddress_T_Strasse
#Gadget_EditAddress_E_Strasse
#Gadget_EditAddress_T_Ort
#Gadget_EditAddress_E_Ort
#Gadget_EditAddress_F_Adresse
#Gadget_EditAddress_OK
EndEnumeration
#GadgetIndex=#PB_Compiler_EnumerationValue
;- ***** Fenster-Definitionen *****
Procedure.l Window_EditAddress() ; Fenster Neu/Ändern
If OpenWindow(#Window_EditAddress,304,179,250,195," Adresse bearbeiten",#PB_Window_SystemMenu|#PB_Window_WindowCentered|#PB_Window_Invisible)
TextGadget(#Gadget_EditAddress_T_Name,25,25,60,15,"Name:")
StringGadget(#Gadget_EditAddress_E_Name,25,40,200,20,"")
TextGadget(#Gadget_EditAddress_T_Strasse,25,65,60,15,"Straße:")
StringGadget(#Gadget_EditAddress_E_Strasse,25,80,200,20,"")
TextGadget(#Gadget_EditAddress_T_Ort,25,105,60,15,"Ort:")
StringGadget(#Gadget_EditAddress_E_Ort,25,120,200,20,"")
Frame3DGadget(#Gadget_EditAddress_F_Adresse,10,5,230,150,"")
ButtonGadget(#Gadget_EditAddress_OK,85,165,80,20,"Übernehmen")
HideWindow(#Window_EditAddress,0)
ProcedureReturn WindowID(#Window_EditAddress)
EndIf
EndProcedure
Procedure.l Window_Address() ; Hauptfenster (Liste)
If OpenWindow(#Window_Address,247,165,415,300," Adressen",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_Invisible)
ListIconGadget(#Gadget_Address_Liste,10,10,395,250,"Name",140,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
AddGadgetColumn(#Gadget_Address_Liste,1,"Straße",140)
AddGadgetColumn(#Gadget_Address_Liste,2,"Ort",110)
ButtonGadget(#Gadget_Address_NEW,10,270,40,20,"Neu")
ButtonGadget(#Gadget_Address_ABBR,345,270,60,20,"Schließen")
ButtonGadget(#Gadget_Address_EDIT,60,270,50,20,"Ändern")
HideWindow(#Window_Address,0)
ProcedureReturn WindowID(#Window_Address)
EndIf
EndProcedure
;- ***** Prozeduren *****
Procedure GetNodeAdrID(id.l) ; Adresse mittels ID auswählen
*Node = XMLNodeFromPath(MainXMLNode(#XML), "Adresse") ; 1. Adresse
While *Node
If Val(GetXMLAttribute(*Node, "id")) = id
ProcedureReturn *Node
EndIf
*Node = NextXMLNode(*Node)
Wend
EndProcedure
Procedure ListeAdressen() ; Adressen (XML) -> Hauptfenster (Liste)
ClearGadgetItems(#Gadget_Address_Liste) ; Liste leeren
row = 0 ; 1. Zeile in Liste
*Adresse = XMLNodeFromPath(MainXMLNode(#XML), "Adresse") ; 1. Adresse
While *Adresse
id.l = Val(GetXMLAttribute(*Adresse, "id")) ; Datensatz-ID auslesen
item$ = GetXMLNodeText(XMLNodeFromPath(*Adresse, "Name")) + #LF$
item$ + GetXMLNodeText(XMLNodeFromPath(*Adresse, "Strasse")) + #LF$
item$ + GetXMLNodeText(XMLNodeFromPath(*Adresse, "Ort"))
AddGadgetItem(#Gadget_Address_Liste, row, item$) ; neue Zeile in Liste schreiben
SetGadgetItemData(#Gadget_Address_Liste, row, id) ; Datensatz-ID aktueller Zeile zuordnen
row + 1 ; Zeilen + 1
*Adresse = NextXMLNode(*Adresse) ; nächste Adresse
Wend
ProcedureReturn row ; Anzahl der Datensätze/Zeilen zurückgeben
EndProcedure
Procedure EditFenster(id.l) ; Adresse neu/bearbeiten
If Window_EditAddress()
If id ; Adresse laden
*Adresse = GetNodeAdrID(id) ; Zeiger auf Adresse ermitteln
If *Adresse
SetGadgetText(#Gadget_EditAddress_E_Name, GetXMLNodeText(XMLNodeFromPath(*Adresse, "Name")))
SetGadgetText(#Gadget_EditAddress_E_Strasse, GetXMLNodeText(XMLNodeFromPath(*Adresse, "Strasse")))
SetGadgetText(#Gadget_EditAddress_E_Ort, GetXMLNodeText(XMLNodeFromPath(*Adresse, "Ort")))
Else
MessageRequester(" Adresse neu/bearbeiten", "Fehler beim Einlesen der Adresse.", #MB_OK|#MB_ICONERROR)
quitEditAddress = #True
EndIf
EndIf
quitEditAddress = #False
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow ;{ Fenster schließen
If EventWindow() = #Window_EditAddress
quitEditAddress = #True
EndIf ;}
Case #PB_Event_Gadget
Select EventGadget()
Case #Gadget_EditAddress_OK ; Übernehmen und Fenster schließen
If id ;{ Datensatz ändern
If *Adresse ; Speichern in XML
SetXMLNodeText(XMLNodeFromPath(*Adresse, "Name"), GetGadgetText(#Gadget_EditAddress_E_Name))
SetXMLNodeText(XMLNodeFromPath(*Adresse, "Strasse"), GetGadgetText(#Gadget_EditAddress_E_Strasse))
SetXMLNodeText(XMLNodeFromPath(*Adresse, "Ort"), GetGadgetText(#Gadget_EditAddress_E_Ort))
EndIf ;}
Else ;{ neuer Datzensatz
*MainNode = MainXMLNode(#XML)
*Adresse = CreateXMLNode(*MainNode, -1) ; neuen Node für Adresse erzeugen
If *Adresse
Anzahl + 1 ; Anzahl um 1 erhöhen
SetXMLNodeName(*Adresse, "Adresse") ; NodeName setzen
SetXMLAttribute(*Adresse, "id", Str(Anzahl)) ; ID setzen (= aktuelle Anzahl)
*Node = CreateXMLNode(*Adresse, -1) ; neuen Node für Name erzeugen
SetXMLNodeName(*Node, "Name") ; NodeName setzen
SetXMLNodeText(*Node, GetGadgetText(#Gadget_EditAddress_E_Name)) ; Wert setzen
*Node = CreateXMLNode(*Adresse, -1) ; neuen Node für Straße erzeugen
SetXMLNodeName(*Node, "Strasse") ; NodeName setzen
SetXMLNodeText(*Node, GetGadgetText(#Gadget_EditAddress_E_Strasse)) ; Wert setzen
*Node = CreateXMLNode(*Adresse, -1) ; neuen Node für Ort erzeugen
SetXMLNodeName(*Node, "Ort") ; NodeName setzen
SetXMLNodeText(*Node, GetGadgetText(#Gadget_EditAddress_E_Ort)) ; Wert setzen
SetXMLAttribute(*MainNode, "Anzahl", Str(Anzahl)) ; Anzahl der Datensätze ändern
EndIf ;}
EndIf
SaveXML(#XML, "Adressen.xml") ; Änderungen in XML-Datei speichern
quitEditAddress = #True
EndSelect
EndSelect
Until quitEditAddress
CloseWindow(#Window_EditAddress)
EndIf
EndProcedure
;- Hauptfenster
If Window_Address()
If FileSize("Adressen.xml") <= 0 ;{ Datei existiert noch nicht
If CreateXML(#XML)
*MainNode = CreateXMLNode(RootXMLNode(#XML))
If *MainNode
SetXMLNodeName(*MainNode, "Adressen")
SetXMLAttribute(*MainNode, "Anzahl", "0")
EndIf
SaveXML(#XML, "Adressen.xml")
FreeXML(#XML)
EndIf
EndIf ;}
quitAddress = #False
If LoadXML(#XML, "Adressen.xml") ; Adressdatenbank laden
Anzahl = ListeAdressen() ; Adressen in Liste einlesen
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow ;{ Programm schließen
If EventWindow() = #Window_Address
quitAddress = #True
EndIf ;}
Case #PB_Event_Gadget
Select EventGadget()
Case #Gadget_Address_NEW ;{ Neue Adresse
EditFenster(#False) ; neuer Datensatz
Anzahl = ListeAdressen() ; Adressen neu in Liste einlesen
;}
Case #Gadget_Address_EDIT ;{ Adresse ändern
selected = GetGadgetState(#Gadget_Address_Liste) ; ausgewählte Zeile
If selected <> -1
id.l = GetGadgetItemData(#Gadget_Address_Liste, selected) ; Datensatz-ID
EditFenster(id) ; Datensatz bearbeiten
Anzahl = ListeAdressen() ; Adressen neu in Liste einlesen
EndIf ;}
Case #Gadget_Address_ABBR ;{ Programm schließen
quitAddress = #True ;}
EndSelect
EndSelect
Until quitAddress
FreeXML(#XML) ; Speicher mit XML freigeben
Else
MessageRequester(" Adressen", "Die Adressdatei konnte nicht geladen werden!", #MB_OK|#MB_ICONERROR)
EndIf
CloseWindow(#Window_Address)
EndIf
End
Zuletzt geändert von Thorsten1867 am 14.02.2009 13:29, insgesamt 4-mal geändert.
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
@Thorsten1867


PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

@ Kaeru:
Ja, ich benutze zwar oft, aber eben auch nicht immer ForEver; hatte natürlich auch schon Situationen, wo es ganz praktisch ist, doch lieber ein Until Event = #PB_Event_CloseWindow hinzuschreiben.
Ich denke, als Anfänger sollte man auch eher zu deiner Methode greifen, die Ereignisse zu Beginn der Schleife in eine Variable zu speichern. Je nachdem, wie fortgeschritten man ist (oder für wie fortgeschritten man sich hält
), kann man es nach persönlichem Ermessen abändern. Es ist für Anfänger meiner Meinung nach einfach übersichtlicher und man erfasst die Logik schneller, wenn man ein bisschen "Overhead" betreibt und erst mal alles in Variablen packt, um diese dann hier und da und dort auszulesen und zu verarbeiten.
Ja, ich benutze zwar oft, aber eben auch nicht immer ForEver; hatte natürlich auch schon Situationen, wo es ganz praktisch ist, doch lieber ein Until Event = #PB_Event_CloseWindow hinzuschreiben.
Ich denke, als Anfänger sollte man auch eher zu deiner Methode greifen, die Ereignisse zu Beginn der Schleife in eine Variable zu speichern. Je nachdem, wie fortgeschritten man ist (oder für wie fortgeschritten man sich hält

PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
Thanks
kleiner fehler bei "Anzahl"
Gross/klein schreibung ist wohl bei XML wichtig.

kleiner fehler bei "Anzahl"
Code: Alles auswählen
SetXMLAttribute(*MainNode, "Anzahl", Str(Anzahl)) ; Anzahl der Datensätze ändern
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive