Suche Beispiel für Adressverwaltung

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

> Nun werde ich die nächsten Tage mal was entwerfen, dann melde ich mich wieder.
Na dann viel Spaß mit PB!
Win11 x64 | PB 6.20
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag 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
Zuletzt geändert von Thorsten1867 am 14.02.2009 13:29, insgesamt 4-mal geändert.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
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

Beitrag von ts-soft »

@Thorsten1867
:allright:
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.
Bild
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

ts-soft hat geschrieben:@Thorsten1867
:allright:
von mir auch :allright:
Win11 x64 | PB 6.20
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten