En ĉi tiu dua parto ni konstruos la logikon de la aplikaĵo (por vidi kaj analizi la kodon pli bone rigardi ĝin komplete, ke mi metos ĝin sub la afiŝon), sed antaŭe ni bezonos instali la sqlite3-bibliotekojn, kiujn ni faros por povi konservi la demandojn kaj iliajn respektivajn respondojn:
sudo apt-get install libsqlite3-dev
Post kiam la bibliotekoj estos instalitaj, ni nur bezonos "uzi Sqlite;" povi uzi sqlite en vala.
Ni bezonos krei Tabelon, kiu enhavas:
Demando
Respondo 1
Respondo 2
Respondo 3
Respondo 4
ĝusta
ekzemplo:
Demando = ĉu el Linukso estas bona blogo?
Respondo1 = tiu blogo ne ekzistas
Respondo2 = ne
Respondo3 = jes
Respondo4 = saluton
ĉar ni ĉiuj scios, ke la ĝusta respondo estas 2 (la bona estas 3)
ĝusta = 3
Por krei la tablon kaj trakti ĝin ni bezonos scii sql (vi povas serĉi ĝin en via plej ŝatata serĉilo), deklaro por krei la tablon:
CREATE TABLE preguntas (pregunta TEXT, respuesta1 TEXT, respuesta2 TEXT, respuesta3 TEXT, respuesta4 TEXT, correcto INT);
Enmetu demandojn ...:
INSERT INTO questions (question, answer1, answer2, answer3, answer4, correct) VALOROJ ('ĝi estas bona blogo el Linukso', 'ĝi ne estas blogo', 'ne', 'jes', 'saluton', 3);
Bone nun ricevu demandon (aranĝitan hazarde):
SELECT pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto FROM preguntas ORDER BY RANDOM()
Malfermante la datumbazon:
int ec = Sqlite.Database.open ("test.db", out db);
if (ec != Sqlite.OK) {
stderr.printf ("Can't open database: %d: %s\n", db.errcode (), db.errmsg ());
}
Se ni ne havas ĝin jam kreita (la unuan fojon ni lanĉas la kodon) ĝi kreos sin mem.
Kreu la tabelon kaj enmetu demandojn:
privata malplena bd () {ĉeno errmsg; // Malfermu la datumbazon / Kreu la datumbazon int ec = Sqlite.Database.open ("test.db", ekstere db); if (ec! = Sqlite.OK) {stderr.printf ("Ne povas malfermi datumbazon:% d:% s \ n", db.errcode (), db.errmsg ()); } if (! FileUtils.test ("test.db", FileTest.IS_REGULAR)) {string query = "" "KREI TABELOJN demandojn (demando TEKSTO, respondo1 TEKSTO, respondo2 TEKSTO, respond3 TEKSTO, respond4 TEKSTO, korekti INT); INSERT INTO-demandoj (demando, respondo1, respondo2, respondo3, respondo4, ĝusta) VALOROJ ('ĝi estas bona blogo de Linukso', 'ĝi ne estas iu ajn blogo', 'ne', 'jes', 'saluton', 3); demandoj (demando, respondo1, respondo2, respondo3, respondo4, ĝusta) VALOROJ ('5 + 5', '25', '10', '3', '5', 2); "" "; ec = db.exec (demando, nula, ekstera errmsg); if (ec! = Sqlite.OK) {stderr.printf ("Eraro:% s \ n", errmsg); }}}
Kontrolu, ke ne ekzistas eraro:
if (ec! = Sqlite.OK) {stderr.printf ("Eraro:% s \ n", errmsg); reveno -1; }
Ni kreos 6 ĉenojn, kiuj helpos nin fari la taskon de demandoj kaj respondoj.
privata ĉeno p; privata ĉeno r1; privata ĉeno r2; privata ĉeno r3; privata ĉeno r4; privata ĉeno c;
Metante demandon (kiun ni ricevas de test.db) kun SELECT:
private void bd_select_questions () {string query = "SELEKTI demandon, respondon1, respondon2, respondon3, respondon4, korekti DE demandoj ORDONO KAZANDA ()"; int rc = db.prepare_v2 (demando, -1, eksteren stmt, nula); int cols = stmt.column_count (); rc = stmt.step (); int col; if (rc == Sqlite.ROW) {for (col = 0; col <cols; col ++) {string txt = stmt.column_text (col); if (col == 0) {p = txt; } else if (col == 1) {r1 = txt; } else if (col == 2) {r2 = txt; } else if (col == 3) {r3 = txt; } else if (col == 4) {r4 = txt; } else {c = txt; } // print ("% s =% s \ n", stmt.column_name (col), txt); }}}
Metu la demandon al la grafikaj elementoj:
private void next_pregunta () {
this.pregunta.set_label(this.p);
this.resposta1.set_label(this.r1);
this.resposta2.set_label(this.r2);
this.resposta3.set_label(this.r3);
this.resposta4.set_label(this.r4);
}
Imposto:
private void puntua () {
this.punts = this.punts + 50;
this.puntos.set_label(this.punts.to_string());
}
Provu se la respondo estas ĝusta:
private void correcto (string cor) {
if (this.c == cor) {
this.puntua ();
this.bd_select_preguntas ();
this.next_pregunta();
}
else{
//incorrecto
}
}
resposta1.clicked.connect (() => {
this.correcto("1");
});
resposta2.clicked.connect (() => {
this.correcto("2");
});
resposta3.clicked.connect (() => {
this.correcto("3");
});
resposta4.clicked.connect (() => {
this.correcto("4");
});
Tempa logiko, kiel ni vidis en la antaŭa afiŝo, ni nur devas aldoni se tio kontrolas, ke la tempon, se ĝi atingas 1, ni donas la respondon kiel malĝusta:
Kompili (ni aldonas –pkg sqlite3)
valac -v lol.vala --pkg gtk+-3.0 --pkg sqlite3
Kreante tri butonojn (50%, Frosti, Pase):
Ni kreas novan horizontalan Gbox kaj aldonas la tri butonojn al ĝi, ni aldonas ĉi tiun Gbox al tiu, kiun ni jam kreis:
this.box2 = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 0);
var button1 = new Gtk.Button.with_label ("50%");
var button2 = new Gtk.Button.with_label ("congelar");
var button3 = new Gtk.Button.with_label ("passar");
this.box2.pack_start(button1);
this.box2.pack_start(button2);
this.box2.pack_start(button3);
Kompleta kodo: http://paste.desdelinux.net/4882
3 komentoj, lasu la viajn
Koran dankon pro la lernilo, tre interesa por tiuj el ni, kiuj volas komenci per io simpla, mi bezonus pli da helpo pri la parto krei la datumajn tabelojn. Saluton
Tre bona! Bone klarigita kaj detala. Dankon pro la datumoj. (kaj)
Dankon viro! Tre interesa kiel la unua.
Estus bone vidi la diversajn komplementajn ekzemplojn, tajpi komentojn (tiuj tajpu pop-ups) aŭ menuojn (tajpi tiujn de la paneloj aperantaj en elementa aŭ gnome-ŝela) ...
La vero estas tre bona.
Ni legis: =)