// Sadece Kendi Fikirlerim!

$ PureBasic ve SQLite ile Pratik Bir To-Do (Yapılacaklar) Uygulaması

PureBasic'in en güçlü yanlarından biri, harici bağımlılıklara ihtiyaç duymadan hızlı ve küçük masaüstü uygulamaları oluşturabilmesidir. Bu gücü, sunucusuz bir veritabanı motoru olan SQLite ile birleştirdiğimizde, verilerini tek bir dosyada saklayan, pratik ve tamamen yerel uygulamalar yapabiliriz. Bu makalede, bu ikiliyi kullanarak basit bir "Yapılacaklar Listesi" (To-Do) uygulaması yapacağız.

Neden SQLite?

SQLite, sunucu kurulumu gerektirmeyen, veritabanını tek bir dosyada tutan, C tabanlı bir kütüphanedir. PureBasic, SQLite komutlarını dahili olarak destekler. Bu, veritabanı işlemleri için harici bir DLL veya kütüphane eklemenize gerek olmadığı anlamına gelir. Bu kombinasyon, taşınabilir ve kurulum gerektirmeyen uygulamalar için mükemmeldir.

Uygulama Mimarisi

Uygulamamız şu temel bileşenlerden oluşacak:

PureBasic ve SQLite Kodu

Aşağıdaki tam kod, uygulamamızın tüm mantığını içermektedir. Kod, veritabanını açar, gerekli tabloyu oluşturur, arayüzü çizer ve olay döngüsünü yönetir.

;- Sabitler ve Global Değişkenler
Enumeration
  #Window_Main
  #List_Tasks
  #Input_Task
  #Button_Add
  #Button_Delete
EndEnumeration

Global db

;- Prosedürler (Fonksiyonlar)
Procedure LoadTasks()
  ClearGadgetItems(#List_Tasks)
  If DatabaseQuery(db, "SELECT id, task FROM tasks ORDER BY id")
    While NextDatabaseRow(db)
      ; ListView'e görevin metnini ekle, ID'sini de veri olarak ata
      AddGadgetItem(#List_tasks, -1, GetDatabaseString(db, 1))
      SetGadgetItemData(#List_tasks, CountGadgetItems(#List_tasks) - 1, GetDatabaseLong(db, 0))
    Wend
    FinishDatabaseQuery(db)
  EndIf
EndProcedure


;- Ana Program Akışı
UseSQLiteDatabase() ; SQLite desteğini aktif et

dbFile.s = "tasks.db" ; Veritabanı dosyasının adı

If OpenDatabase(0, dbFile, "", "")
  db = 0 ; Veritabanı bağlantı numarasını değişkene ata
  
  ; 'tasks' tablosu yoksa oluştur
  DatabaseUpdate(db, "CREATE TABLE IF NOT EXISTS tasks (id INTEGER PRIMARY KEY, task TEXT)")
  
Else
  MessageRequester("Hata", "Veritabanı açılamadı: " + dbFile)
  End
EndIf

; Ana Pencere ve Arayüz Elemanları
OpenWindow(#Window_Main, 0, 0, 500, 400, "PureBasic To-Do Listesi", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

ListViewGadget(#List_Tasks, 10, 10, 480, 300)
StringGadget(#Input_Task, 10, 320, 370, 25, "")
ButtonGadget(#Button_Add, 390, 320, 100, 25, "Ekle")
ButtonGadget(#Button_Delete, 10, 355, 100, 25, "Seçileni Sil")

LoadTasks() ; Program başlarken görevleri veritabanından yükle

;- Olay Döngüsü
Repeat
  event = WaitWindowEvent()
  
  If event = #PB_Event_Gadget
    Select EventGadget()
      Case #Button_Add
        taskText.s = GetGadgetText(#Input_Task)
        If taskText <> ""
          ; SQL Injection'a karşı parametre kullanımı
          DatabaseUpdate(db, "INSERT INTO tasks (task) VALUES (?)")
          SetDatabaseString(db, 0, taskText)
          
          SetGadgetText(#Input_Task, "") ; Girdi alanını temizle
          LoadTasks() ; Listeyi yenile
        EndIf
        
      Case #Button_Delete
        selected = GetGadgetState(#List_Tasks)
        If selected > -1
          taskID = GetGadgetItemData(#List_Tasks, selected)
          
          DatabaseUpdate(db, "DELETE FROM tasks WHERE id = ?")
          SetDatabaseLong(db, 0, taskID)
          
          LoadTasks() ; Listeyi yenile
        EndIf
    EndSelect
  EndIf
  
Until event = #PB_Event_CloseWindow

CloseDatabase(db) ; Program kapanırken veritabanı bağlantısını kapat