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