Seite 3 von 3

Verfasst: 13.02.2009 16:38
von AND51
@ 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.

Verfasst: 13.02.2009 18:55
von Andesdaf
> Nun werde ich die nächsten Tage mal was entwerfen, dann melde ich mich wieder.
Na dann viel Spaß mit PB!

Verfasst: 13.02.2009 19:19
von Kaeru Gaman
@ 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.

Verfasst: 13.02.2009 20:10
von Thorsten1867
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

Verfasst: 13.02.2009 20:32
von ts-soft
@Thorsten1867
:allright:

Verfasst: 13.02.2009 20:39
von Andesdaf
ts-soft hat geschrieben:@Thorsten1867
:allright:
von mir auch :allright:

Verfasst: 13.02.2009 21:34
von AND51
@ 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 :mrgreen: ), 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.

Verfasst: 14.02.2009 03:38
von mk-soft
Thanks :allright:

kleiner fehler bei "Anzahl"

Code: Alles auswählen

SetXMLAttribute(*MainNode, "Anzahl", Str(Anzahl)) ; Anzahl der Datensätze ändern
Gross/klein schreibung ist wohl bei XML wichtig.