Steuerung ListIconGadget

Anfängerfragen zum Programmieren mit PureBasic.
ALF1965
Beiträge: 8
Registriert: 17.09.2010 16:51
Computerausstattung: Laptop
Wohnort: Lengerich Westf.

Steuerung ListIconGadget

Beitrag von ALF1965 »

Moin Leute. Dann melde ich mich als blutiger Anfänger das erste Mal hier im Forum. Ich habe mir da was zusammengebastelt, von dem ich mal Eure Meinung als erfahrene PureBasic Anwender wissen möchte.

Ich habe mir zum Einstieg eine kleine Aufgabe gestellt: Programmierung eines Kassenbuchs mit Anbindung an die SQLite-Datenbank. Vergesst die Datenbank mal, so weit bin ich noch nicht... Begonnen habe ich mit der Fensterprogrammierung mit Eingabe, Änderung, Löschen von Einträgen. Was man in einer Tabelle halt so macht. Folgende Dinge sind eingebaut, die auch funktionieren:
- Automatisches Einfügen des Datensatzes bei Drücken der Enter-Taste (alternativ gibts dafür noch den Button, Ziel ist aber eine überwiegende Bedienung über die Tastatur)
- Löschen der Eingabefelder mit Ausnahme derer, die ich als Vorgabe für den nächsten Eintrag haben möchte

Ich kapiere natürlich, was ich da so gemacht habe aber (und das sind meine Fragen):
1. Ist das sinnvoll, wie ich die ganze Geschichte strukturiert habe?
2. Ist die Art der Umsetzung ok oder bin ich von hinten durch die Brust ins Auge gegangen?

Wehe hier lacht einer, ich fange grade erst an ;-)

Hier mal der Code:

Code: Alles auswählen

;{- Enumerations / DataSections
;{ Windows
Enumeration
  #Window_0
EndEnumeration
;}
;{ Toolbars
Enumeration
  #Toolbar_Window_0
EndEnumeration
;}
;{ Menu bars
Enumeration
  #Menu_Window_0
EndEnumeration
;}
;{ Menu/Toolbar items
Enumeration
  #Menu_Window_0_Neu
  #Menu_Window_0_Ffnen
  #Menu_Window_0_Speichern
  #Menu_Window_0_Schlieen
  #Menu_Window_0_Beenden
  #Menu_Window_0_Kopieren
  #Menu_Window_0_Einfugen
  #Toolbar_Window_0_New
  #Toolbar_Window_0_Open
  #Toolbar_Window_0_Save
EndEnumeration
;}
;{ Status bars
Enumeration
  #StatusBar_Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
  #Panel_0
  #ComboBox_5
  #Button_1
  #Button_2
  #Button_3
  #ListIcon_4
  #ComboBox_6
  #String_7
  #String_8
  #String_9
  #String_10
  #String_11
  #String_12
  #String_13
  #Button_14
  #Button_15
  #Button_16
EndEnumeration
;}
Define.l Event, EventWindow, EventGadget, EventType, EventMenu
;}
Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 457, 207, 886, 561, "Datenbank Testfenster", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    If CreateMenu(#Menu_Window_0, WindowID(#Window_0))
      MenuTitle("Datei")
      MenuItem(#Menu_Window_0_Neu, "Neu")
      MenuItem(#Menu_Window_0_Ffnen, "Öffnen")
      MenuItem(#Menu_Window_0_Speichern, "Speichern")
      MenuItem(#Menu_Window_0_Schlieen, "Schließen")
      MenuBar()
      MenuItem(#Menu_Window_0_Beenden, "Beenden")
      MenuTitle("Bearbeiten")
      MenuItem(#Menu_Window_0_Kopieren, "Kopieren")
      MenuItem(#Menu_Window_0_Einfugen, "Einfügen")
      MenuTitle("Extras")
    EndIf
    If CreateToolBar(#Toolbar_Window_0, WindowID(#Window_0))
      ToolBarStandardButton(#Toolbar_Window_0_New, #PB_ToolBarIcon_New)
      ToolBarStandardButton(#Toolbar_Window_0_Open, #PB_ToolBarIcon_Open)
      ToolBarStandardButton(#Toolbar_Window_0_Save, #PB_ToolBarIcon_Save)
    EndIf
    If CreateStatusBar(#StatusBar_Window_0, WindowID(#Window_0))
    EndIf
    ButtonGadget(#Button_1, 5, 35, 120, 40, "Datenbank anlegen")
    ButtonGadget(#Button_2, 140, 35, 120, 40, "Datenbank lesen")
    ButtonGadget(#Button_3, 275, 35, 120, 40, "Datenbank schreiben")
    PanelGadget(#Panel_0, 5, 85, 870, 415)
      ; Datensätze
      AddGadgetItem(#Panel_0, -1, "Datensätze")
      
      ListIconGadget(#ListIcon_4, 5, 10, 850, 280, "Mandant", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
      AddGadgetColumn(#ListIcon_4, 1, "Jahr   ", 100)
      AddGadgetColumn(#ListIcon_4, 2, "Monat", 100)
      AddGadgetColumn(#ListIcon_4, 3, "Einnahme", 100)
      AddGadgetColumn(#ListIcon_4, 4, "Ausgabe", 100)
      AddGadgetColumn(#ListIcon_4, 5, "Kassenbestand", 100)
      AddGadgetColumn(#ListIcon_4, 6, "U-Schlüssel", 100)
      AddGadgetColumn(#ListIcon_4, 7, "Skonto", 100)
      AddGadgetColumn(#ListIcon_4, 8, "Belegdatum", 100)
      AddGadgetColumn(#ListIcon_4, 9, "Belegtext", 100)
      SendMessage_(GadgetID(#ListIcon_4), #LVM_SETCOLUMNWIDTH, 0, #LVSCW_AUTOSIZE_USEHEADER)
      SendMessage_(GadgetID(#ListIcon_4), #LVM_SETCOLUMNWIDTH, 1, #LVSCW_AUTOSIZE_USEHEADER)
      SendMessage_(GadgetID(#ListIcon_4), #LVM_SETCOLUMNWIDTH, 2, #LVSCW_AUTOSIZE_USEHEADER)
      SendMessage_(GadgetID(#ListIcon_4), #LVM_SETCOLUMNWIDTH, 3, #LVSCW_AUTOSIZE_USEHEADER)
      SendMessage_(GadgetID(#ListIcon_4), #LVM_SETCOLUMNWIDTH, 4, #LVSCW_AUTOSIZE_USEHEADER)
      SendMessage_(GadgetID(#ListIcon_4), #LVM_SETCOLUMNWIDTH, 5, #LVSCW_AUTOSIZE_USEHEADER)
      SendMessage_(GadgetID(#ListIcon_4), #LVM_SETCOLUMNWIDTH, 6, #LVSCW_AUTOSIZE_USEHEADER)
      SendMessage_(GadgetID(#ListIcon_4), #LVM_SETCOLUMNWIDTH, 7, #LVSCW_AUTOSIZE_USEHEADER)
      SendMessage_(GadgetID(#ListIcon_4), #LVM_SETCOLUMNWIDTH, 8, #LVSCW_AUTOSIZE_USEHEADER)
      SendMessage_(GadgetID(#ListIcon_4), #LVM_SETCOLUMNWIDTH, 9, #LVSCW_AUTOSIZE_USEHEADER)
      ComboBoxGadget(#ComboBox_5, 10, 295, 50, 20, #PB_ComboBox_Editable)
        ; Combo Box mit Mandantennummer vorbelegen
        SetGadgetText(#ComboBox_5,"001")
        AddGadgetItem(#ComboBox_5,0,"001")
        AddGadgetItem(#ComboBox_5,-1,"002")
      StringGadget(#String_7, 62, 295, 42, 20, "2010")
      StringGadget(#String_8, 107, 295, 40, 20, "10")
      StringGadget(#String_9, 150, 295, 55, 20, "")
      StringGadget(#String_10, 213, 295, 50, 20, "")
      ComboBoxGadget(#ComboBox_6, 335, 295, 65, 20, #PB_ComboBox_Editable)
        ; ComboBoxGadget mit Steuerschlüsseln vorbelegen
        AddGadgetItem(#ComboBox_6,0,"19 %")
        AddGadgetItem(#ComboBox_6,-1,"7 %")
        SetGadgetText(#ComboBox_6,"19 %")
      StringGadget(#String_11, 405, 295, 40, 20, "")
      StringGadget(#String_12, 450, 295, 65, 20, "")
      StringGadget(#String_13, 519, 295, 280, 20, "")
      ButtonGadget(#Button_14, 800, 295, 50, 20, "Update")
      ButtonGadget(#Button_15, 800, 315, 50, 20, "Change")
      ButtonGadget(#Button_16, 800, 335, 50, 20, "Delete")
    CloseGadgetList()
  EndIf
EndProcedure

OpenWindow_Window_0()
AddKeyboardShortcut(#Window_0,#PB_Shortcut_Return,13)

;{- Event loop
Repeat
  Event = WaitWindowEvent()
  ;Debug EventType
  Select Event
    ; ///////////////////
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #Panel_0
      ElseIf EventGadget = #Button_1
        Gosub Datenbank_anlegen
      ElseIf EventGadget = #Button_2
      ElseIf EventGadget = #Button_3
      ElseIf EventGadget = #ListIcon_4
      ElseIf EventGadget = #ComboBox_6
      ElseIf EventGadget = #ComboBox_5
      ElseIf EventGadget = #String_7
      ElseIf EventGadget = #String_8
      ElseIf EventGadget = #String_9
      ElseIf EventGadget = #String_10
      ElseIf EventGadget = #String_11
      ElseIf EventGadget = #String_12
      ElseIf EventGadget = #String_13
        ;Debug EventType
        ;If EventType = 14001
          ;Gosub ListIcon_Update
        ;EndIf
      ElseIf EventGadget = #Button_14
        Gosub ListIcon_Update
      ElseIf EventGadget = #Button_15
        Gosub ListIcon_Change
      ElseIf EventGadget = #Button_16
        Gosub ListIcon_Delete
      EndIf
    ; /////////////////
    Case #PB_Event_Menu
      EventMenu = EventMenu()
      If EventMenu = #Menu_Window_0_Neu
      ElseIf EventMenu = #Menu_Window_0_Ffnen
      ElseIf EventMenu = #Menu_Window_0_Speichern
      ElseIf EventMenu = #Menu_Window_0_Schlieen
      ElseIf EventMenu = #Menu_Window_0_Beenden
      ElseIf EventMenu = #Menu_Window_0_Kopieren
      ElseIf EventMenu = #Menu_Window_0_Einfugen
      ElseIf EventMenu = #Toolbar_Window_0_New
      ElseIf EventMenu = #Toolbar_Window_0_Open
      ElseIf EventMenu = #Toolbar_Window_0_Save
      ElseIf EventMenu = 13
        Gosub ListIcon_Update
      EndIf
    ; ////////////////////////
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
ForEver
;
;}
;///////////////////////
;///////////////////////
End
;///////////////////////
;///////////////////////
;{ Button_1 (Datenbank anlegen)
;////////////////////
Datenbank_anlegen:
Debug "Button 1 legt eine Datenbank an"
UseSQLiteDatabase()

  Filename$ = OpenFileRequester("Wähle einen Dateinamen", "PureBasic.sqlite", "*.sqlite|*.sqlite", 0)

  If CreateFile(0, Filename$)
    Debug "Datenbank-Datei erstellt"
    CloseFile(0)
  EndIf
  
  If OpenDatabase(0, Filename$, "", "")
    Debug "Verbunden mit PureBasic.sqlite"
    If DatabaseUpdate(0, "CREATE TABLE info (test VARCHAR(255));")
      Debug "Tabelle erstellt"
    EndIf
  EndIf

Return
;////////////////////
;}
;{ Button_14 (ListIcon Update)
;////////////////////
ListIcon_Update:
Debug "Button 14 legt einen neuen Eintrag in der Tabelle an"
Mandant.s = GetGadgetText(#ComboBox_5)
Jahr.s = GetGadgetText(#String_7)
Monat.s = GetGadgetText(#String_8)
Einnahme.s = GetGadgetText(#String_9)
Ausgabe.s = GetGadgetText(#String_10)
Steuer.s = GetGadgetText(#ComboBox_6)
Skonto.s = GetGadgetText(#String_11)
Belegdatum.s = GetGadgetText(#String_12)
Belegtext.s = GetGadgetText(#String_13)
AddGadgetItem(#ListIcon_4,-1,Mandant + Chr(10) + Jahr + Chr(10) + Monat + Chr(10) + Einnahme + Chr(10) + Ausgabe + Chr(10) + Chr(10) + Steuer + Chr(10) + Skonto + Chr(10) + Belegdatum + Chr(10) + Belegtext)
SetGadgetText(#string_9,"")
SetGadgetText(#string_10,"")
SetGadgetText(#string_11,"")
SetGadgetText(#string_13,"")
SetActiveGadget(#string_9)
Return
;////////////////////
;}
;{ Button_15 (ListIcon Eintrag ändern)
;////////////////////////
ListIcon_Change:
Debug "ListIcon Change gedrückt"
Mandant.s = GetGadgetText(#ComboBox_5)
Jahr.s = GetGadgetText(#String_7)
Monat.s = GetGadgetText(#String_8)
Einnahme.s = GetGadgetText(#String_9)
Ausgabe.s = GetGadgetText(#String_10)
Steuer.s = GetGadgetText(#ComboBox_6)
Skonto.s = GetGadgetText(#String_11)
Belegdatum.s = GetGadgetText(#String_12)
Belegtext.s = GetGadgetText(#String_13)
Position = GetGadgetState(#ListIcon_4)
Debug Position
If Position > -1
  SetGadgetItemText(#ListIcon_4,Position,Mandant,0)
  SetGadgetItemText(#ListIcon_4,Position,Jahr,1)
  SetGadgetItemText(#ListIcon_4,Position,Monat,2)
  SetGadgetItemText(#ListIcon_4,Position,Einnahme,3)
  SetGadgetItemText(#ListIcon_4,Position,Ausgabe,4)
  SetGadgetItemText(#ListIcon_4,Position,Steuer,6)
  SetGadgetItemText(#ListIcon_4,Position,Skonto,7)
  SetGadgetItemText(#ListIcon_4,Position,Belegdatum,8)
  SetGadgetItemText(#ListIcon_4,Position,Belegtext,9)
  SetGadgetText(#string_9,"")
  SetGadgetText(#string_10,"")
  SetGadgetText(#string_11,"")
  SetGadgetText(#string_13,"")
  SetActiveGadget(#string_9)
EndIf
Return
;////////////////////////
;}
;{ Button_16 (ListIcon Eintrag löschen)
;////////////////////////
ListIcon_Delete:
Debug "ListIcon Delete gedrückt"
Position = GetGadgetState(#ListIcon_4)
Debug Position
RemoveGadgetItem(#ListIcon_4,Position)
Return
;////////////////////////
;}
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Steuerung ListIconGadget

Beitrag von Kiffi »

Hallo ALF1965,

das Positive vorweg: Die Fensteroberfläche ist erfreulich übersichtlich gehalten.
Behalt diesen Stil bei. Deine Anwender werden es Dir danken :-)

Zum Code selber:

* Ich sehe da Sprungmarken und Returns. Du willst doch wohl nicht GOTO in
Deinem Programm verwenden? (MitDemFingerFuchtel). Mach es von Anfang
an richtig und verwende Prozeduren. Falls Dir das nichts sagen sollte, können
wir Dir das mit Sicherheit schnell und unkompliziert erklären.

* solche Sachen...

Code: Alles auswählen

      SendMessage_(GadgetID(#ListIcon_4), #LVM_SETCOLUMNWIDTH, 0, #LVSCW_AUTOSIZE_USEHEADER)
      SendMessage_(GadgetID(#ListIcon_4), #LVM_SETCOLUMNWIDTH, 1, #LVSCW_AUTOSIZE_USEHEADER)
      SendMessage_(GadgetID(#ListIcon_4), #LVM_SETCOLUMNWIDTH, 2, #LVSCW_AUTOSIZE_USEHEADER)
      SendMessage_(GadgetID(#ListIcon_4), #LVM_SETCOLUMNWIDTH, 3, #LVSCW_AUTOSIZE_USEHEADER)
      SendMessage_(GadgetID(#ListIcon_4), #LVM_SETCOLUMNWIDTH, 4, #LVSCW_AUTOSIZE_USEHEADER)
      SendMessage_(GadgetID(#ListIcon_4), #LVM_SETCOLUMNWIDTH, 5, #LVSCW_AUTOSIZE_USEHEADER)
      SendMessage_(GadgetID(#ListIcon_4), #LVM_SETCOLUMNWIDTH, 6, #LVSCW_AUTOSIZE_USEHEADER)
      SendMessage_(GadgetID(#ListIcon_4), #LVM_SETCOLUMNWIDTH, 7, #LVSCW_AUTOSIZE_USEHEADER)
      SendMessage_(GadgetID(#ListIcon_4), #LVM_SETCOLUMNWIDTH, 8, #LVSCW_AUTOSIZE_USEHEADER)
      SendMessage_(GadgetID(#ListIcon_4), #LVM_SETCOLUMNWIDTH, 9, #LVSCW_AUTOSIZE_USEHEADER)
... kann man prima in einer Schleife abfrühstücken:

Code: Alles auswählen

    For ColCounter =0 To 9
      SendMessage_(GadgetID(#ListIcon_4), #LVM_SETCOLUMNWIDTH, ColCounter, #LVSCW_AUTOSIZE_USEHEADER)
    Next
* gewöhne Dir an, aussagekräftige Bezeichner für Variablen und Konstanten zu verwenden.
Ich wette, dass Du nach einem halben Jahr nicht mehr weißt, wofür #Button_15 gut ist.
#btn_Change wird Dir dann mehr sagen.

* Verwende EnableExplicit!

Das war's auf den ersten Blick. Die Kollegen werden sicherlich den Rest kommentieren :-)

Grüße ... Kiffi
a²+b²=mc²
ALF1965
Beiträge: 8
Registriert: 17.09.2010 16:51
Computerausstattung: Laptop
Wohnort: Lengerich Westf.

Re: Steuerung ListIconGadget

Beitrag von ALF1965 »

Hey Kiffi, danke!

Ich hatte schon so ein Bauchgefühl, dass das mit den Sprungmarken eine Sünde ist ;-) Du hast mir sehr geholfen. Ich werde noch mit dem Testprogramm "weiterlernen", danach alles in die Tonne treten und noch mal von vorne anfangen. Die Sendmessagegeschichte ist von Pureform generiert worden (ok, erlaubtes Hilfsmittel...hähä). Mit der Schleife hast Du aber natürlich recht. Es geht auch eleganter.

LG Alf (der, der nur prozedual denken kann)
Antworten