Seite 1 von 2

SQLite Editor

Verfasst: 04.06.2008 14:17
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.

Verfasst: 04.06.2008 14:41
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

Verbesserungswürdi

Verfasst: 04.06.2008 14:48
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.

Re: Verbesserungswürdi

Verfasst: 04.06.2008 14:56
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.

Re: Verbesserungswürdi

Verfasst: 04.06.2008 15:04
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.

Skinbare Gadgets

Verfasst: 04.06.2008 15:11
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.

Verfasst: 04.06.2008 15:23
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.

Verfasst: 05.06.2008 08:06
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.

Neuer Code

Verfasst: 05.06.2008 10:01
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.

Re: Neuer Code

Verfasst: 05.06.2008 10:14
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