Didattica C: Compilare codice con gtk

Nel precedente post ho postato un semplice codice per imparare a creare interfacce gtk basilari con codice C. Ora vediamo come compilare quanto scritto.

Dopo aver salvato il codice in un file di estensione .c, rechiamoci nel terminale, spostiamoci (mediante il comando cd) nella cartella in cui risiede il file e copiamo il seguente codice:

gcc -Wall -g codice.c -o eseguibile `pkg-config --cflags --libs gtk+-2.0`

Premiamo invio e se tutto va a buon fine il terminale non dovrebbe restituire nulla.
Ricordate di cambiare codice.c con il nome del vostro file e eseguibile con un nome che volete dare all’eseguibile.

Ora è possibile lanciare l’eseguibile con:

./eseguibile

oppure recandoci nella cartella dove esso risiede ed effettuando un doppio click sul file che riporta lo stesso nome.

E’ importante tenere presente che i parametri pkg-config –cflags –libs gtk+-2.0 devono essere racchiusi tra apici inversi. Questo carattere si ottiene dalla combinazione su tastiera AltGr + ‘

Didattica C: Primi passi con le gtk

Arriva un momento nella vita di un uomo in cui si abbandona l’essenziale per abbracciare il sofisticato ed il frivolo. Questo è anche ciò che accade nella vita di un programmatore: arriva il giorno in cui si abbandona la riga di comando per iniziare ad usare le finestre tanto amate dall’utente comune!

Bene! Dopo questo preambolo in stile zen possiamo iniziare il cammino per studiare come dare vita al nostro codice C grazie alle gtk.

E’ doveroso, prima di cominciare, spiegare cosa sono le gtk.

GTK+ (acronimo di GIMP ToolKit) è il nome di un insieme di strumenti grafici, basati sulla libreria libgtk, che permette di programmare e creare interfacce grafiche con lo steso stile di quelle che normalmente vediamo in ambiente Gnome. Qualora vorreste iniziare a programmare con tali librerie bisogna prima soddisfare le dipendenze installando libgtk2.0-dev presente nei repository di tutte le distro.

Ora possiamo iniziare a vedere un semplicissimo codice che genera una finestra standard 200×200 pixel.


#include

int main (int argc, char *argv[])
{
GtkWidget *window;

gtk_init(&argc, &argv);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_show(window);

gtk_main();

return 0;
}

Iniziamo con l’analizzare riga per riga il codice appena scritto.

Per prima cosa bisogna importare mediante #include il file contenente le funzioni e le strutture su cui si basano le gtk+; il file gtk/gtk.h, infatti, deve essere presente in ogni software che basa la propria interfaccia su questa libreria.

Mediante la dichiarazione di gtkWidget si ottiene un elemento di tipo finestra (window appunto) che potrà essere successivamente manipolato attraverso i suoi metodi.

Con gtk_init(&argc, &argv) si inizializzano tutti i parametri mediante alcuni argomenti da riga di comando che sono noti a tutti i programmi gtk. E’ possibile, infatti, passare da terminale alcuni parametri che si potrebbero definire standard e che sono uguali per qualsiasi software che sfrutti queste librerie. Essi sono: –display, –debug-level, –no-xshm, –sync, –show-events e –no-show-event.
Il nostro programma al suo avvio andrà alla ricerca di questi parametri e qualora ne incontri qualcuno, lo legge, lo usa, lo elimina dall’array argv[] e decrementa argc. In questo modo alla fine di questo processo sarà possibile analizzare gli argomenti eventualmente passati dall’utente come si faceva prima di usare le gtk.

La riga window = gtk_window_new(GTK_WINDOW_TOPLEVEL) crea la finestra sfruttando una inizializzazione simile a quella presente in linguaggi come il C++.

Gtk_widget_show(window) si limita a mostrare la finestra appena creata.

Dopo le inizializzazioni dei nostri elementi, si incontra la chiamata a gtk_main(). Tale funzione non fa altro che dirci che il codice a finito di creare l’interfaccia e che è in attesa che in X accada qualche evento da gestire (ad esempio la pressione di un tasto della tastiera o un doppio click del mouse).

Infine si pone un return 0 come si era abbituati per restiuire l’intero dichiarato all’inizio del nostro main se l’applicazione si chiude senza problemi.

Questo è solo un semplice esempio. Per quanto stupido possa essere esso contiene le basi per capire il funzionamento iniziale di queste librerie. Si vdrà più avanti qualche esempio più “corposo”.

Alla prossima 🙂

Didattica Gambas – Creare database al primo avvio

Quando si crea un software che lavora in stretta connessione con un database, molto spesso quest’ultimo lo si crea precedentemente e poi lo si copia nella cartella di destinazione una volta installato il nostro programma. Questa tecnica è molto pratica ma costringe l’utente finale a dover eseguire delle operazioni in più che potrebbero essere evitate. Allora come fare?

E’ possibile ricorrere alla sub _new di Gambas che permette di gestire tutti quelli eventi che si presentano prima di avviare il form.

Posto qui il codice e lo studieremo passo passo.


   '-- nome database
sName AS String = "tabella"
'-- percorso database
sPercorso AS String = User.Home &/ ".database"
'-- nuova classe connessione database
$hConn AS NEW Connection
'-- query di creazione database
sql AS String
'-- risultato della connessione
hres AS Result

PUBLIC SUB _new()

'-- se la cartella non esiste la crea
IF NOT Exist(sPercorso) THEN MKDIR sPercorso

'-- se il database non esiste lo crea

'-- Imposta i parametri di connessione
WITH $hConn
.Type = "sqlite3"
.Host = sPercorso
.Login = ""
.Password = ""
END WITH

'-- testa esistenza database
$hConn.Open

'-- se non esiste crea il nuovo database
IF NOT $hConn.Databases.Exist(sName) THEN
$hConn.Databases.Add(sName)
$hConn.Close
$hConn.Name = sName
$hConn.Open()
'-- da uno scheletro alla tabella
sql = "CREATE TABLE 'tabella'
         ( 'id' INTEGER PRIMARY KEY,
'nome1' VARCHAR(255) DEFAULT NULL,
'nome2' VARCHAR(255) DEFAULT NULL,
'nome3' VARCHAR(255) DEFAULT NULL,
'nome4' VARCHAR(250) DEFAULT NULL,
'nome5' VARCHAR(4) DEFAULT NULL,
'nome6' VARCHAR(10) DEFAULT NULL,
'nome7' VARCHAR(4) DEFAULT NULL);"
hres = $hConn.EXEC(sql)
$hConn.Commit
END IF

'-- chiude la connessione
$hConn.Close

END


Iniziamo col vedere semplicemente che sono state dichiarate delle variabili a a livello globale che ci permetteranno una facilitazione a livello di codice.

Analizziamo la sub _new. Esso prima di tutto testa l’esistenza della cartella nascosta .database presente nella Home dell’utente. Se tale cartella esiste il programma si avvia normalemente altrimenti la crea. Se essa manca, si intuisce facilmente che vuol dire che è il primo avvio di tale programma o che essa è stata cancellata e perciò deve essere ricreata.

Una volta terminata la parte inerente la cartella si passa all’analisi della presenza del database. Per tale controllo si parte con l’impostazione dei vari parametri. Dalla voce .Type si può vedere che in questo caso si sta usando un database di tipo sqlite e pertanto dobbiamo fare riferimento alla sintassi sql esatta. Una volta terminate le impostazioni si apre la connessione col databse mediante $hConn.Open().
Qui il codice analizza l’esistenza della tabella; qualora essa non sia presenta ne crea una nuova, chiude la connessione, reimposta il nome e apre la connessione per poterla creare e popolare.

Ora tutto ciò che bisogna fare e studiare la sintassi della stringa sql che verrà poi passata come parametro e letta come una query. Mediante CREATE TABLE crea la tabella all’interno del database di nome ‘tabella’ nella quale verranno create le apposite voci nome1, nome2, nome3, ….etc.

Per praticità preferisco sempre lavorare con voci di tipo striga che poi converto in fase di lettura. Per far ciò basta specificare la lunghezza della stringa voluta passandola come parametro alla voce VARCHAR(lunghezza). Si nota che per molte voci tale lunghezza è 255; alcune voci invece riportano una lunghezza diversa, questo è dovuto al fatto che sapendo preventivamente quanto sarebbe stata lunga tale stringa ho reputato opportuno dimensionarla con il valore esatto per una migliore gestione dello spazio disponibile.

Finita la creazione della query la si passa come parametro e si chiude la connessione con il database. Fatto ciò è tutto pronto e il programma può partire avendo a disposizione tutti gli elementi utili.

Con poche righe di codice è possibile evitare al nostro utente un lavoro in più e si può dare al nostro software un aspetto più “professionale”.


ATTENZIONE: La query sql è stata scritta su più righe per motivi grafici. Quella stringa va scritta tutta insieme o divisa mediante gli opportuni separatori di stringa.