SQLite Editor

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Bamsagla
Beiträge: 33
Registriert: 03.12.2004 14:49
Wohnort: Laufen

SQLite Editor

Beitrag von Bamsagla »

Hallo an alle,
habe ja schon ab und an mal etwas Hilfe hier bekommen und dachte mir, warum versuchst du dich nicht mal an einem Tool für andere.
Vielleicht ist ja der angehängte Quellcode für PureBasic 4.20 (Final) für die SQLite-Datenbank für den einen oder anderen ganz hilfreich oder bietet gewisse Denkanstösse...?
Hoffe er funktioniert wie vorgesehen, bietet aber derzeit nur die Möglichkeit, die Datenbanktabellen anzuzeigen, zu löschen und die Inhalte der Datenbanktabellen darzustellen.

Code: Alles auswählen

; SQLite-Editor
; Harry Wessner 2008 - bamsagla

#Fenster = 0
#Fenster_Edit = 1
#Database = 0
Ende.b = 0
NewList Sternspeicher.s()
; LinkedList für den Fall, dass mehrere Spalten PrimaryKeys enthalten

Enumeration
  #Gadget_Frm_Db
  #Gadget_Frm_Tb
  #Gadget_Frm_Ct
  #Gadget_But_Db_Nw
  #Gadget_But_Db_Op
  #Gadget_But_Db_Cl
  #Gadget_But_Tb_Nw
  #Gadget_But_Tb_Op
  #Gadget_But_Tb_Dl
  #Gadget_But_Tb_Ed
  #Gadget_But_Ct_Nw
  #Gadget_But_Ct_Dl
  #Gadget_But_Ct_Ed
  #Gadget_Txt_In
  #Gadget_Txt_Cr
  #Gadget_Lic_Db
  #Gadget_Lic_Tb
  #Gadget_Edit_Lic
  #Gadget_Edit_Txt_Tb
  #Gadget_Edit_Txt_Nm
  #Gadget_Edit_Txt_Tp
  #Gadget_Edit_Str_Tb
  #Gadget_Edit_Str_Nm
  #Gadget_Edit_But_Nw
  #Gadget_Edit_But_Dl
  #Gadget_Edit_But_Ed
  #Gadget_Edit_But_Md
  #Gadget_Edit_But_Sv
  #Gadget_Edit_But_Ab
  #Gadget_Edit_Frm_Ed
  #Gadget_Edit_Cmb_Tp
  #Gadget_Edit_Chk_Un
  #Gadget_Edit_Chk_Nn
EndEnumeration

Procedure Allebuttons()
  DisableGadget(#Gadget_But_Tb_Op, 1)
  DisableGadget(#Gadget_But_Tb_Dl, 1)
  DisableGadget(#Gadget_But_Tb_Ed, 1)
  DisableGadget(#Gadget_But_Ct_Nw, 1)
  DisableGadget(#Gadget_But_Ct_Dl, 1)
  DisableGadget(#Gadget_But_Ct_Ed, 1)
EndProcedure

Procedure Aktualisieren(Tabellenname$)
  If CountGadgetItems(#Gadget_Lic_Tb) > 0: ClearGadgetItemList(#Gadget_Lic_Tb): EndIf
  If DatabaseQuery(#Database, "SELECT * FROM " + Tabellenname$ + ";")
    Spalten = DatabaseColumns(#Database)
    While NextDatabaseRow(#Database)
      Datensatz$ = ""
      For Allespalten = 0 To Spalten - 1
        Datensatz$ + GetDatabaseString(#Database, Allespalten) + Chr(10)
      Next
      AddGadgetItem(#Gadget_Lic_Tb, -1, Datensatz$)
    Wend
  EndIf
  SetGadgetState(#Gadget_Lic_Tb, -1)
  DisableGadget(#Gadget_But_Ct_Nw, 1)
  DisableGadget(#Gadget_But_Ct_Dl, 1)
  DisableGadget(#Gadget_But_Ct_Ed, 1)
EndProcedure

Procedure Tabellenladen(Dateiname$)
  If Not Dateiname$ = ""
    SetWindowTitle(#Fenster, "SQLite-Editor (" + Dateiname$ + ")")
  EndIf
  If CountGadgetItems(#Gadget_Lic_Db) > 0: ClearGadgetItemList(#Gadget_Lic_Db): EndIf
  If CountGadgetItems(#Gadget_Lic_Tb) > 0: ClearGadgetItemList(#Gadget_Lic_Tb): EndIf
  Spaltenzahl = SendMessage_(GetWindow_(GadgetID(#Gadget_Lic_Tb), #GW_CHILD), #HDM_GETITEMCOUNT, 0, 0)
  For Entferner = 0 To Spaltenzahl - 1
    RemoveGadgetColumn(#Gadget_Lic_Tb, 0)
  Next
  AddGadgetColumn(#Gadget_Lic_Tb, 0, "Tabelleninhalte", 680)
  If DatabaseQuery(#Database, "SELECT name FROM sqlite_master WHERE type='table';")
    While NextDatabaseRow(#Database)
      AddGadgetItem(#Gadget_Lic_Db, -1, GetDatabaseString(#Database, 0))
    Wend
  EndIf
  Allebuttons()
  SetGadgetText(#Gadget_Txt_Cr, "SQL: ")
  DisableGadget(#Gadget_But_Db_Cl, 0)
EndProcedure

If UseSQLiteDatabase()
  If OpenWindow(#Fenster, 0, 0, 750, 550, "SQLite-Editor", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_Invisible)
    If CreateGadgetList(WindowID(#Fenster))
      Frame3DGadget(#Gadget_Frm_Db, 10, 10, 730, 60, "Datenbankaktionen")
      ButtonGadget(#Gadget_But_Db_Nw, 20, 30, 150, 30, "Neue Datenbank erstellen")
      ButtonGadget(#Gadget_But_Db_Op, 180, 30, 115, 30, "Datenbank öffnen")
      ButtonGadget(#Gadget_But_Db_Cl, 305, 30, 125, 30, "Datenbank schließen")
      TextGadget(#Gadget_Txt_In, 440, 30, 290, 30, "Beachten Sie bitte: Jede Änderung in diesem Programm wird sofort in der Datenbank vorgenommen!", 1)
      SetGadgetColor(#Gadget_Txt_In, #PB_Gadget_FrontColor, RGB(200, 0, 0))
      Frame3DGadget(#Gadget_Frm_Tb, 10, 80, 730, 180, "Tabellen in der Datenbank")
      ListIconGadget(#Gadget_Lic_Db, 20, 100, 410, 150, "Datenbanktabellen", 380, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
      ButtonGadget(#Gadget_But_Tb_Nw, 440, 100, 290, 30, "Neue Tabelle erstellen")
      ButtonGadget(#Gadget_But_Tb_Op, 440, 140, 290, 30, "Markierte Tabelle öffnen")
      ButtonGadget(#Gadget_But_Tb_Dl, 440, 180, 290, 30, "Markierte Tabelle löschen")
      ButtonGadget(#Gadget_But_Tb_Ed, 440, 220, 290, 30, "Markierte Tabelle bearbeiten")
      Frame3DGadget(#Gadget_Frm_Ct, 10, 270, 730, 270, "Inhalte der geöffneten Tabelle")
      StringGadget(#Gadget_Txt_Cr, 20, 290, 710, 20, "SQL: ", #PB_String_ReadOnly)
      ListIconGadget(#Gadget_Lic_Tb, 20, 310, 710, 180, "Tabelleninhalte", 680, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
      ButtonGadget(#Gadget_But_Ct_Nw, 20, 500, 230, 30, "Neuen Datensatz erstellen")
      ButtonGadget(#Gadget_But_Ct_Dl, 260, 500, 230, 30, "Markierten Datensatz löschen")
      ButtonGadget(#Gadget_But_Ct_Ed, 500, 500, 230, 30, "Markierten Datensatz bearbeiten")
      DisableGadget(#Gadget_But_Db_Cl, 1)
      DisableGadget(#Gadget_But_Tb_Nw, 1)
      DisableGadget(#Gadget_But_Tb_Op, 1)
      DisableGadget(#Gadget_But_Tb_Dl, 1)
      DisableGadget(#Gadget_But_Tb_Ed, 1)
      DisableGadget(#Gadget_But_Ct_Nw, 1)
      DisableGadget(#Gadget_But_Ct_Dl, 1)
      DisableGadget(#Gadget_But_Ct_Ed, 1)
    EndIf
    If OpenWindow(#Fenster_Edit, 0, 0, 550, 355, "Tabellenverwaltung", #PB_Window_WindowCentered | #PB_Window_Invisible, #Fenster)
      If CreateGadgetList(WindowID(#Fenster_Edit))
        TextGadget(#Gadget_Edit_Txt_Tb, 10, 10, 260, 20, "Bitte geben Sie einen Namen für die Tabelle ein:", 512)
        StringGadget(#Gadget_Edit_Str_Tb, 270, 10, 270, 20, "")
        ListIconGadget(#Gadget_Edit_Lic, 10, 40, 350, 270, "PK", 30, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection | #PB_ListIcon_CheckBoxes)
        AddGadgetColumn(#Gadget_Edit_Lic, 1, "Spaltenname", 110)
        AddGadgetColumn(#Gadget_Edit_Lic, 2, "Typ", 70)
        AddGadgetColumn(#Gadget_Edit_Lic, 3, "Optionen", 100)
        ButtonGadget(#Gadget_Edit_But_Nw, 370, 40, 170, 25, "Neuen Eintrag")
        ButtonGadget(#Gadget_Edit_But_Dl, 370, 75, 170, 25, "Eintrag löschen")
        ButtonGadget(#Gadget_Edit_But_Ed, 370, 110, 170, 25, "Eintrag bearbeiten")
        Frame3DGadget(#Gadget_Edit_Frm_Ed, 370, 145, 170, 165, "Spalte bearbeiten")
        TextGadget(#Gadget_Edit_Txt_Nm, 380, 165, 50, 20, "Name:", 512)
        StringGadget(#Gadget_Edit_Str_Nm, 430, 165, 100, 20, "")
        TextGadget(#Gadget_Edit_Txt_Tp, 380, 195, 50, 20, "Typ:", 512)
        ComboBoxGadget(#Gadget_Edit_Cmb_Tp, 430, 195, 100, 20, #PB_ComboBox_Editable)
        AddGadgetItem(#Gadget_Edit_Cmb_Tp, -1, "INTEGER")
        AddGadgetItem(#Gadget_Edit_Cmb_Tp, -1, "TEXT")
        AddGadgetItem(#Gadget_Edit_Cmb_Tp, -1, "VARCHAR(x)")
        AddGadgetItem(#Gadget_Edit_Cmb_Tp, -1, "NUMERIC")
        AddGadgetItem(#Gadget_Edit_Cmb_Tp, -1, "REAL")
        AddGadgetItem(#Gadget_Edit_Cmb_Tp, -1, "BLOB")
        CheckBoxGadget(#Gadget_Edit_Chk_Un, 380, 225, 150, 20, "Option: UNIQUE")
        CheckBoxGadget(#Gadget_Edit_Chk_Nn, 380, 245, 150, 20, "Option: NOT NULL")
        ButtonGadget(#Gadget_Edit_But_Md, 380, 275, 150, 25, "Spalte eintragen")
        ButtonGadget(#Gadget_Edit_But_Sv, 10, 320, 250, 25, "Tabelle speichern")
        ButtonGadget(#Gadget_Edit_But_Ab, 270, 320, 270, 25, "Änderungen verwerfen")
        DisableGadget(#Gadget_Edit_But_Nw, 1)
        DisableGadget(#Gadget_Edit_But_Dl, 1)
        DisableGadget(#Gadget_Edit_But_Ed, 1)
      EndIf
    EndIf
    HideWindow(#Fenster, 0)
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          Ende = 1
        Case #PB_Event_Gadget
          Aktionstyp = EventType()
          Select EventGadget()
            Case #Gadget_But_Db_Nw
              Speicherdatei$ = SaveFileRequester("Datenbank erstellen", "", "SQLite Datenbank (*.sqlite - *.sql)|*.sqlite;*.sql|Beliebige Erweiterung (*.*)|*.*", 0)
              If Not Trim(Speicherdatei$) = ""
                If GetExtensionPart(Speicherdatei$) = "": Speicherdatei$ + ".sqlite": EndIf
                Killfrage = #PB_MessageRequester_Yes
                If FileSize(Speicherdatei$) >= 0
                  Killfrage = MessageRequester("Datei überschreiben?", "Die gewählte Datei existiert bereits!" + Chr(10) + "Möchten Sie die bestehende Datenbank wirklich überschreiben?", #PB_MessageRequester_YesNo | #MB_ICONQUESTION)
                EndIf
                If Killfrage = #PB_MessageRequester_Yes
                  If CreateFile(#Database, Speicherdatei$)
                    CloseFile(#Database)
                    If IsDatabase(#Database): CloseDatabase(#Database): EndIf
                    If OpenDatabase(#Database, Speicherdatei$, "", "")
                      Tabellenladen(Speicherdatei$)
                    Else
                      MessageRequester("Datenbankfehler","Die Datenbank konnte nicht geöffnet werden." + Chr(10) + "Möglicherweise wurde die Datenbank entfernt oder der Quellpfad ist nicht mehr vorhanden.", #MB_ICONERROR)
                    EndIf
                  Else
                    MessageRequester("Dateifehler","Die Datenbank konnte am gewünschten Pfad nicht erstellt werden." + Chr(10) + "Bitte stellen Sie sicher, dass der Pfad vorhanden ist und Sie entsprechende Rechte besitzen.",#MB_ICONERROR)
                  EndIf
                Else
                  MessageRequester("Datenerstellung abgebrochen","Die Datenbank wurde nicht erstellt." + Chr(10) + "Der Vorgang wurde durch den Benutzer abgebrochen.", #MB_ICONINFORMATION)
                EndIf
              EndIf
            Case #Gadget_But_Db_Op
              Offendatei$ = OpenFileRequester("Datenbank auswählen", "", "SQLite Datenbanken (*.sqlite - *.sql)|*.sqlite;*.sql|Alle Dateien (*.*)|*.*", 0)
              If Not Trim(Offendatei$) = ""
                If IsDatabase(#Database)
                  CloseDatabase(#Database)
                EndIf
                If OpenDatabase(#Database, Offendatei$, "", "")
                  Tabellenladen(Offendatei$)
                  Allebuttons()
                  DisableGadget(#Gadget_But_Tb_Nw, 0)
                Else
                  MessageRequester("Datenbankfehler","Die Datenbank konnte nicht geöffnet werden." + Chr(10) + "Möglicherweise wurde die Datenbank entfernt oder der Quellpfad ist nicht mehr vorhanden.", #MB_ICONERROR)
                EndIf
              EndIf
            Case #Gadget_But_Db_Cl
              If IsDatabase(#Database)
                CloseDatabase(#Database)
                SetWindowTitle(#Fenster, "SQLite-Editor")
                If CountGadgetItems(#Gadget_Lic_Db) > 0: ClearGadgetItemList(#Gadget_Lic_Db): EndIf
                If CountGadgetItems(#Gadget_Lic_Tb) > 0: ClearGadgetItemList(#Gadget_Lic_Tb): EndIf
                Spaltenzahl = SendMessage_(GetWindow_(GadgetID(#Gadget_Lic_Tb), #GW_CHILD), #HDM_GETITEMCOUNT, 0, 0)
                For Entferner = 0 To Spaltenzahl - 1
                  RemoveGadgetColumn(#Gadget_Lic_Tb, 0)
                Next
                AddGadgetColumn(#Gadget_Lic_Tb, 0, "Tabelleninhalte", 680)
                DisableGadget(#Gadget_But_Db_Cl, 1)
                Allebuttons()
                DisableGadget(#Gadget_But_Tb_Nw, 1)
              EndIf
            Case #Gadget_Lic_Db
              If Aktionstyp = #PB_EventType_Change
                If GetGadgetState(#Gadget_Lic_Db) = -1
                  DisableGadget(#Gadget_But_Tb_Op, 1)
                  DisableGadget(#Gadget_But_Tb_Dl, 1)
                  DisableGadget(#Gadget_But_Tb_Ed, 1)
                Else
                  DisableGadget(#Gadget_But_Tb_Op, 0)
                  DisableGadget(#Gadget_But_Tb_Dl, 0)
                  ;DisableGadget(#Gadget_But_Tb_Ed, 0)
                EndIf
              EndIf
            Case #Gadget_But_Tb_Nw
              If CountGadgetItems(#Gadget_Edit_Lic) > 0: ClearGadgetItemList(#Gadget_Edit_Lic): EndIf
              SetGadgetText(#Gadget_Edit_Str_Tb, "")
              SetGadgetText(#Gadget_Edit_Str_Nm, "")
              SetGadgetText(#Gadget_Edit_Cmb_Tp, "")
              SetGadgetState(#Gadget_Edit_Chk_Un, 0)
              SetGadgetState(#Gadget_Edit_Chk_Nn, 0)
              DisableWindow(#Fenster,1)
              Xpos = WindowX(#Fenster) + 100
              Ypos = WindowY(#Fenster) + 110
              ResizeWindow(#Fenster_Edit, Xpos, Ypos, #PB_Ignore, #PB_Ignore)
              HideWindow(#Fenster_Edit,0)
              SetActiveWindow(#Fenster_Edit)
            Case #Gadget_But_Tb_Op
              If Not GetGadgetState(#Gadget_Lic_Db) = -1
                Tabellenname$ = GetGadgetItemText(#Gadget_Lic_Db,GetGadgetState(#Gadget_Lic_Db),0)
                If CountGadgetItems(#Gadget_Lic_Tb) > 0: ClearGadgetItemList(#Gadget_Lic_Tb): EndIf
                Spaltenzahl = SendMessage_(GetWindow_(GadgetID(#Gadget_Lic_Tb), #GW_CHILD), #HDM_GETITEMCOUNT, 0, 0)
                For Entferner = 0 To Spaltenzahl - 1
                  RemoveGadgetColumn(#Gadget_Lic_Tb, 0)
                Next
                If CountList(Sternspeicher()) > 0: ClearList(Sternspeicher()): EndIf
                If DatabaseQuery(#Database, "PRAGMA table_info('" + Tabellenname$ + "');")
                  While NextDatabaseRow(#Database)
                    If GetDatabaseLong(#Database, 5) = 1
                      AddElement(Sternspeicher()): Sternspeicher() = GetDatabaseString(#Database, 1)
                    EndIf
                  Wend
                EndIf
                If DatabaseQuery(#Database, "SELECT * FROM " + Tabellenname$ + ";")
                  Spalten = DatabaseColumns(#Database)
                  For Allespalten = 0 To Spalten - 1
                    Spaltenname$ = DatabaseColumnName(#Database, Allespalten)
                    Select DatabaseColumnType(#Database, Allespalten)
                      Case #PB_Database_Long: Spaltentyp$ = " [1]"
                      Case #PB_Database_Double: Spaltentyp$ = " [12]"
                      Case #PB_Database_Quad: Spaltentyp$ = " [123]"
                      Case #PB_Database_String: Spaltentyp$ = " [A]"
                      Case #PB_Database_Float: Spaltentyp$ = " [1.2]"
                      Default: Spaltentyp$ = " [???]"
                    EndSelect
                    ForEach Sternspeicher()
                      If Sternspeicher() = Spaltenname$
                        Spaltentyp$ + " [!]"
                        SetGadgetData(#Gadget_Lic_Tb, Allespalten)
                      EndIf
                    Next
                    AddGadgetColumn(#Gadget_Lic_Tb, Allespalten, Spaltenname$ + Spaltentyp$, 100)
                  Next
                  While NextDatabaseRow(#Database)
                    Datensatz$ = ""
                    For Allespalten = 0 To Spalten - 1
                      Datensatz$ + GetDatabaseString(#Database, Allespalten) + Chr(10)
                    Next
                    AddGadgetItem(#Gadget_Lic_Tb, -1, Datensatz$)
                  Wend
                EndIf
                If DatabaseQuery(#Database, "SELECT sql FROM sqlite_master WHERE type='table' AND name='" + Tabellenname$ + "';")
                  NextDatabaseRow(#Database)
                  SetGadgetText(#Gadget_Txt_Cr, "SQL: " + GetDatabaseString(#Database, 0))
                EndIf
              EndIf
            Case #Gadget_But_Tb_Dl
              If Not GetGadgetState(#Gadget_Lic_Db) = -1
                Tabellenname$ = GetGadgetItemText(#Gadget_Lic_Db,GetGadgetState(#Gadget_Lic_Db),0)
                Entscheidung = MessageRequester("Tabelle löschen?", "Alle Daten in der Tabelle " + Tabellenname$ + " gehen unwiederbringlich verloren!" + Chr(10) + "Möchten Sie die Tabelle wirklich aus der Datenbank löschen?", #PB_MessageRequester_YesNo | #MB_ICONQUESTION)
                If Entscheidung = #PB_MessageRequester_Yes
                  If DatabaseUpdate(#Database, "DROP TABLE " + Tabellenname$ + ";")
                    Tabellenladen("")
                    SetGadgetState(#Gadget_Lic_Db, -1)
                    SetGadgetText(#Gadget_Txt_Cr, "SQL: ")
                    DisableGadget(#Gadget_But_Tb_Op, 1)
                    DisableGadget(#Gadget_But_Tb_Dl, 1)
                    DisableGadget(#Gadget_But_Tb_Ed, 1)
                    DisableGadget(#Gadget_But_Ct_Nw, 1)
                    DisableGadget(#Gadget_But_Ct_Dl, 1)
                    DisableGadget(#Gadget_But_Ct_Ed, 1)
                  Else
                    MessageRequester("Datenbankfehler", "Die Tabelle konnte nicht gelöscht werden." + Chr(10) + DatabaseError(), #MB_ICONERROR)
                  EndIf
                EndIf
              EndIf
            Case #Gadget_But_Tb_Ed
              ; Noch nicht vorhanden
            Case #Gadget_Lic_Tb
              If Aktionstyp = #PB_EventType_Change
                If GetGadgetState(#Gadget_Lic_Tb) = -1
                  DisableGadget(#Gadget_But_Ct_Nw, 1)
                  DisableGadget(#Gadget_But_Ct_Dl, 1)
                  DisableGadget(#Gadget_But_Ct_Ed, 1)
                Else
                  ;DisableGadget(#Gadget_But_Ct_Nw, 0)
                  DisableGadget(#Gadget_But_Ct_Dl, 0)
                  ;DisableGadget(#Gadget_But_Ct_Ed, 0)
                EndIf
              EndIf
            Case #Gadget_But_Ct_Nw
              ; Noch nicht vorhanden
            Case #Gadget_But_Ct_Dl
              If Not GetGadgetState(#Gadget_Lic_Tb) = -1
                Primarykey = GetGadgetData(#Gadget_Lic_Tb)
                Indexwert$ = GetGadgetItemText(#Gadget_Lic_Tb, GetGadgetState(#Gadget_Lic_Tb), Primarykey)
                Indexname$ = GetGadgetItemText(#Gadget_Lic_Tb, -1, Primarykey)
                Indexname$ = Left(Indexname$, FindString(Indexname$, " [", 1) - 1)
                Entscheidung = MessageRequester("Wert löschen?", "Der markierte Eintrag geht unwiederbringlich verloren!" + Chr(10) + "Möchten Sie den Wert wirklich aus der Tabelle löschen?", #PB_MessageRequester_YesNo | #MB_ICONQUESTION)
                If Entscheidung = #PB_MessageRequester_Yes
                  If DatabaseUpdate(#Database, "DELETE FROM " + Tabellenname$ + " WHERE " + Indexname$ + "=" + Indexwert$ + ";")
                    Aktualisieren(Tabellenname$)
                  Else
                    ; Falls der Index textbasiert sein sollte...
                    If DatabaseUpdate(#Database, "DELETE FROM " + Tabellenname$ + " WHERE " + Indexname$ + "='" + Indexwert$ + "';")
                      Aktualisieren(Tabellenname$)
                    Else
                      MessageRequester("Datenbankfehler", "Der Eintrag konnte nicht gelöscht werden." + Chr(10) + DatabaseError(), #MB_ICONERROR)
                    EndIf
                  EndIf
                EndIf
              EndIf
            Case #Gadget_But_Ct_Ed
              ; Noch nicht vorhanden
            Case #Gadget_Edit_But_Md
              Spaltenname$ = GetGadgetText(#Gadget_Edit_Str_Nm)
              Spaltentyp$ = GetGadgetText(#Gadget_Edit_Cmb_Tp)
              Spaltenoption$ = ""
              If GetGadgetState(#Gadget_Edit_Chk_Un) = 1: Spaltenoption$ + "UNIQUE ": EndIf
              If GetGadgetState(#Gadget_Edit_Chk_Nn) = 1: Spaltenoption$ + "NOT NULL ": EndIf
              If Not (Spaltenname$ = "" And Spaltentyp$ = "")
                If Spaltentyp$ = "VARCHAR(x)"
                  MessageRequester("Datentyp überprüfen", "Bitte geben Sie beim Datentyp VARCHAR() immer auch die Länge des Inhalts mit an." + Chr(10) + "Somit beispielsweise VARCHAR(20) für eine Zeichenbegrenzung von 20 Zeichen.", #MB_ICONERROR)
                Else
                  AddGadgetItem(#Gadget_Edit_Lic, -1, "" + Chr(10) + Spaltenname$ + Chr(10) + Spaltentyp$ + Chr(10) + Spaltenoption$)
                  SetGadgetText(#Gadget_Edit_Str_Nm, "")
                  SetGadgetText(#Gadget_Edit_Cmb_Tp, "")
                  SetGadgetState(#Gadget_Edit_Chk_Un, 0)
                  SetGadgetState(#Gadget_Edit_Chk_Nn, 0)
                EndIf
              Else
                MessageRequester("Eingaben überprüfen", "Bitte geben Sie mindestens einen Namen für die Spalte und einen Datentyp ein." + Chr(10) + "Beim Datentyp sind auch andere Eingaben als nur die Listeneinträge erlaubt.", #MB_ICONERROR)
              EndIf
            Case #Gadget_Edit_But_Sv
              If CountGadgetItems(#Gadget_Edit_Lic) > 0
                Neuername$ = GetGadgetText(#Gadget_Edit_Str_Tb)
                If Not Neuername$ = ""
                  Primaryzahl = 0: Spaltenbefehl$ = ""
                  For Allespalten = 0 To CountGadgetItems(#Gadget_Edit_Lic) - 1
                    Zusatz$ = ""
                    If GetGadgetItemState(#Gadget_Edit_Lic, Allespalten) & #PB_ListIcon_Checked
                      Primaryzahl + 1: Zusatz$ = "PRIMARY KEY"
                    EndIf
                    Spaltenbefehl$ + GetGadgetItemText(#Gadget_Edit_Lic, Allespalten, 1) + " " + GetGadgetItemText(#Gadget_Edit_Lic, Allespalten, 2) + " " + Zusatz$ + " " + Trim(GetGadgetItemText(#Gadget_Edit_Lic, Allespalten, 3)) + ", "
                  Next
                  If Right(Spaltenbefehl$, 2) = ", ": Spaltenbefehl$ = Left(Spaltenbefehl$, Len(Spaltenbefehl$) - 2): EndIf
                  Spaltenbefehl$ = Trim(Spaltenbefehl$)
                  Primaryantwort = #PB_MessageRequester_Yes
                  If Primaryzahl = 0
                    Primaryantwort = MessageRequester("Kein Primärschlüssel", "Zur besseren Verwaltung der Tabelle wird eine Spalte mit Primärschlüssel empfohlen. Diese Spalte sollte auch den Datentyp INTEGER und die Optionen NOT NULL und UNIQUE beinhalten." + Chr(10) + "Möchten Sie die Tabelle wirklich ohne Primärschlüssel erstellen?", #PB_MessageRequester_YesNo | #MB_ICONQUESTION)
                  EndIf
                  If Primaryantwort = #PB_MessageRequester_Yes
                    If DatabaseUpdate(#Database, "CREATE TABLE " + Neuername$ + " (" + Spaltenbefehl$ + ");")
                      DisableWindow(#Fenster,0)
                      HideWindow(#Fenster_Edit,1)
                      SetActiveWindow(#Fenster)
                      Tabellenladen("")
                    Else
                      MessageRequester("Datenbankfehler", "Beim Ausführen des SQL-Kommandos ist ein Fehler aufgetreten." + Chr(10) + DatabaseError(), #MB_ICONERROR)
                    EndIf
                  EndIf
                Else
                  MessageRequester("Kein Tabellenname", "Bitte geben Sie einen Namen für die Tabelle ein." + Chr(10) + "Dieser Name ist für weitere SELECT-Anweisungen unbedingt erforderlich.", #MB_ICONERROR)
                EndIf
              Else
                MessageRequester("Keine Spalten vorhanden", "Bitte geben Sie mindestens eine Spalte für die Tabelle ein." + Chr(10) + "Möchten Sie die Erfassung abbrechen, verwenden Sie bitte den Änderungen verwerfen Button, möchten Sie die Tabelle löschen, verwenden Sie bitte den Punkt Tabelle löschen im Hauptmenü.", #MB_ICONERROR)
              EndIf
            Case #Gadget_Edit_But_Ab
              DisableWindow(#Fenster,0)
              HideWindow(#Fenster_Edit,1)
              SetActiveWindow(#Fenster)
           EndSelect
        Case 0
          Delay(1)
      EndSelect
    Until Ende = 1
    If IsDatabase(#Database)
      CloseDatabase(#Database)
    EndIf
  Else
    MessageRequester("Programmfehler","Das Anwendungsfenster konnte nicht erstellt werden." + Chr(10) + "Das Programm wird beendet.",#MB_ICONERROR)
  EndIf
Else
  MessageRequester("SQLite-Fehler","Beim Initialisieren der SQLite-Umgebung ist ein Fehler aufgetreten." + Chr(10) + "Das Programm wird beendet.",#MB_ICONERROR)
EndIf

End
Wie gesagt, hoffe es kann wer brauchen und vielleicht spiele ich mich damit auch nochmal und erweitere das Teil um weitere Funktionen.
Rückfragen, Verbesserungsvorschläge und Kritik sind gern gesehen.

Tschausen, Harry.
Zuletzt geändert von Bamsagla am 05.06.2008 18:05, insgesamt 3-mal geändert.
Service Packs sind dazu da, die Fehler zu verbessern, die vorher nicht richtig funktioniert haben!
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 »

> Rückfragen, Verbesserungsvorschläge und Kritik sind gern gesehen.
Warum WindowEvent() und Delay(1). Tausche einfach gegen
WaitWindowEvent() und entferne das Delay(1), ist dann Windowsconformer
und verbraucht keine CPU Zeit unnötig.

Für die Gadgets Enumeration beginnend ab 0 nutzen, so wird viel Speicher
verschwendet und durch Konstanten wirds lesbarer.

Ansonsten sieht die Oberfläche schon mal sauber aus. :allright: Funktionell
werde habe ichs noch nicht testen können, mangels Datenbanken (muß
erstmal suchen :mrgreen: )

Mach weiter so, dann bekommts nen Platz in meinen IDE-Tools :wink:

Gruß
Thomas
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
Benutzeravatar
Bamsagla
Beiträge: 33
Registriert: 03.12.2004 14:49
Wohnort: Laufen

Verbesserungswürdi

Beitrag von Bamsagla »

Hi ts-soft,
hast recht, waitwindowevent() ist hier natürlich besser.
Über die enumeration bin ich noch nie drübergefallen. Macht es also tatsächlich einen Unterschied, ob ich z.B. in Zehnerschritten fortlaufend selbst Nummern für Gadgets vergebe oder dies automatisiert fortlaufend von PB machen lass?
Die Möglichkeit, Nummern für Gadgets über #PB_Any vergeben zu lassen, hab ich bei meinem ersten skinbaren Programm verworfen, da ich nicht imstande war, soweit zu denken, wie ich die Gadgets anstelle der festen Nummern mit Variablen ansprechen soll... (war das jetzt zu unverständlich)?
Auf jeden Fall danke für dein Feedback. Werde das Programm noch ausbauen, damit zumindest noch Tabellen erstellt und verändert werden können. Ob ich direkt noch eine Fassung mit Werteänderung mach, weiss ich noch nicht.
Harry.
Service Packs sind dazu da, die Fehler zu verbessern, die vorher nicht richtig funktioniert haben!
Bild
Rokur
Beiträge: 167
Registriert: 29.12.2005 09:58
Computerausstattung: Intel Core2 Quad (4x2,4 GHz), 4096 MB RAM, GForce 8800GTX 786 MB
Windows XP 32 Bit, PureBasic 4.40 (x86)

Re: Verbesserungswürdi

Beitrag von Rokur »

Bamsagla hat geschrieben:...
Die Möglichkeit, Nummern für Gadgets über #PB_Any vergeben zu lassen, hab ich bei meinem ersten skinbaren Programm verworfen, da ich nicht imstande war, soweit zu denken, wie ich die Gadgets anstelle der festen Nummern mit Variablen ansprechen soll... (war das jetzt zu unverständlich)?
Probiers mal mit Arrays oder LinkedLists :wink:

Aber Enumerations sind normalerweise schon empfehlenswert, dann kannst du alles über Konstanten ansprechen (ist übersichtlicher), und kennst trotzdem den Wertebereich.
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

Re: Verbesserungswürdi

Beitrag von ts-soft »

Bamsagla hat geschrieben:Macht es also tatsächlich einen Unterschied, ob ich z.B. in Zehnerschritten fortlaufend selbst Nummern für Gadgets vergebe oder dies automatisiert fortlaufend von PB machen lass?
Die interne Gadgetlist reserviert bei deiner Version Speicher für 311
Gadgets (0 - 310 wenn ich keinen übersehen habe), macht nicht viel aus,
ist aber unnötig.
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
Benutzeravatar
Bamsagla
Beiträge: 33
Registriert: 03.12.2004 14:49
Wohnort: Laufen

Skinbare Gadgets

Beitrag von Bamsagla »

@Rokur & @ts-soft
Das mit der Enumeration und dem Speicherbedarf leuchtet ein. Wusste bisher nicht, dass auch die nicht verwendeten Bereiche zwischen den Nummern verwendet werden (z.B. 111,112,113 usw.)
Mit den Skinbaren Gadgets habe ich eine XML-Datei entwickelt, die vom Programm eingelesen wird und PureBasic erstellt daraus die GUI. Allerdings hab ich noch nicht rausgefunden, wie ich die Brücke zwischen automatischer Nummerierung und Ereignisverfolgung in Verbindung mit meine Skinliste schlagen kann.
Kleines Beispiel meiner XML-Gadgetliste:

Code: Alles auswählen

  <?xml version="1.0" encoding="UTF-8" ?> 
- <skinset prog="Ferienprogramm" ver="2008.1" desc="Standardskin" w="800" h="600" lang="de">
- <!--  Generelle Einstellungen für den Programmaufbau folgen 
  --> 
  <font id="110" name="Verdana" size="11" flag1="#PB_Font_HighQuality" flag2="#PB_Font_Bold" /> 
  <font id="120" name="Verdana" size="10" flag1="#PB_Font_HighQuality" flag2="#PB_Font_Bold" /> 
  <font id="130" name="Verdana" size="9" flag1="#PB_Font_HighQuality" /> 
- <!--  Eigentlicher Programmaufbau mit Gadgets folgen 
  --> 
- <container desc="Hauptmenü" id="1100" x="0" y="0" w="800" h="600" flag1="#PB_Container_BorderLess" color="16777215">
  <gadget id="1110" type="Text" x="10" y="10" w="780" h="20" flag1="512" font="110" color="16768180">Hauptmenü</gadget> 
  <gadget id="1120" type="Text" x="10" y="40" w="780" h="20" flag1="512" font="120" color="11862015">Ferienprogramm auswählen</gadget> 
- <gadget id="1130" type="Listicon" x="10" y="70" w="780" h="385" flag1="#PB_ListIcon_FullRowSelect" flag2="#PB_ListIcon_AlwaysShowSelection" flag3="#PB_ListIcon_GridLines" font="130" color="16777215">
  <column sort="0" w="150">Ferienprogramm</column> 
  <column sort="1" w="200">Beschreibung</column> 
  <column sort="2" w="100">erstellt am</column> 
  <column sort="3" w="100">geändert am</column> 
  <column sort="4" w="100">Veranstaltungen</column> 
  <column sort="5" w="100">Teilnehmer</column> 
  </gadget>
  <gadget id="1140" type="Button" x="10" y="465" w="250" h="25" font="130" flag1="#PB_Button_Default">Neues Programm erstellen</gadget> 
  <gadget id="1150" type="Button" x="280" y="465" w="250" h="25" font="130">Programm bearbeiten</gadget> 
  <gadget id="1160" type="Button" x="540" y="465" w="250" h="25" font="130">Programm löschen</gadget> 
  <gadget id="1190" type="Text" x="10" y="500" w="780" h="20" flag1="512" font="120" color="11862015">Navigation</gadget> 
  <gadget id="1210" type="Button" x="10" y="530" w="260" h="25" font="130">Veranstaltungen bearbeiten</gadget> 
  <gadget id="1220" type="Button" x="280" y="530" w="250" h="25" font="130">Teilnehmer bearbeiten</gadget> 
  <gadget id="1240" type="Button" x="540" y="530" w="250" h="25" font="130">Auswertung dieses Programms</gadget> 
  <gadget id="1280" type="Button" x="10" y="565" w="260" h="25" font="130">Programm beenden</gadget> 
  </container>
  </skinset>
Hier werden ebenfalls die GadgetIDs bereits im Skinset zugeordnet und können von der Ereignisverfolgung mit der richtigen ID angesprochen werden.
Wenn ich dies mit Enumeration lösen wollen würde, müsste ich praktisch für jedes meiner etwa 300 Gadgets eine Konstante definieren, die mittels Enumeration dann befüllt wird?
So long, Harry.
Service Packs sind dazu da, die Fehler zu verbessern, die vorher nicht richtig funktioniert haben!
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 »

Die nummerierung sollte für jede liste (fenster, gadgets, fonts usw.) jeweils
bei 0 beginnen und dann fortlaufend ohne lücken.
Die Konstanten dienen nur dem leichterem erkennen, was was ist, weil für
nummern ist unser Hirn nicht so empfänglich :mrgreen:
Die Enumeration ist nur eine Arbeitserleichterung (und auch syntaxtisch
schöner), die einem das #btn_OK = 10 spart, da man ja die eigentlichen
Werte nicht benötigt.
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
Rokur
Beiträge: 167
Registriert: 29.12.2005 09:58
Computerausstattung: Intel Core2 Quad (4x2,4 GHz), 4096 MB RAM, GForce 8800GTX 786 MB
Windows XP 32 Bit, PureBasic 4.40 (x86)

Beitrag von Rokur »

Anstatt der Enumeration kannst du auch einen eigenen Zähler verwenden, der bei null beginnt. Oder du schreibst die PB-ID und deine eigene ID jeweils paarweise in ein Array oder eine LinkedList, das kannst du dann als "Wörterbuch" benutzen um in der Eventsteuerung trotzdem mit deinen IDs arbeiten zu können.
Benutzeravatar
Bamsagla
Beiträge: 33
Registriert: 03.12.2004 14:49
Wohnort: Laufen

Neuer Code

Beitrag von Bamsagla »

@ts-soft & @Rokur
Guten Morgen,
danke schon mal für eure Beteiligung und die guten Vorschläge.
@Rokur: Das mit der Indexierung mittels einer LinkedList kann ich gut nachvollziehen. Ist ein guter Denkanstoss. Werde mich damit noch gesondert befassen.
Jetzt aber zurück zum eigentlichen Thema: Ein Update des Codes findet ihr oben in meinem ersten Post, um die Board-Datenbank zu schonen.
Neuerungen:
- Gadgets über Konstanten und Enumeration :wink:
- Primärschlüssel wird (werden) aus Tabellen beim Anzeigen ausgelesen und mittels [!] dargestellt
- Einträge können aus Tabellen entfernt werden
More to come:
- Eigentlich ist das Teil schon ein witziges Projekt und ich würde gerne noch die Bearbeitungsfunktionen weiterprogrammieren, aber das dauert jetzt vielleicht etwas. Also bitte um Geduld!
Ansonsten meldet euch einfach weiterhin mit Verbesserungsvorschlägen und -wünschen.
Harry.
Service Packs sind dazu da, die Fehler zu verbessern, die vorher nicht richtig funktioniert haben!
Bild
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Neuer Code

Beitrag von Kiffi »

@Bamsagla:

Das Ermitteln des Feldtyps (und deren Anzeige im Spaltenkopf) ist
eigentlich nicht nötig (zumal " [1]", " [12]", " [123]", etc. nicht wirklich
aussagekräftig sind). Ich z.B. definiere den Feldtyp beim Anlegen einer
Tabelle überhaupt nicht (einer der großen Vorteile von SQLite). Aus diesem
Grund steht bei mir sowieso immer [???]. Besser wäre es meiner Meinung
nach, das Create-Statement anzuzeigen, welches man aus der Master-Tabelle
auslesen kann.

Grüße ... Kiffi
a²+b²=mc²
Antworten