In hierdie tweede deel sal ons die logika van die toepassing opbou (om die kode beter te sien en te ontleed om volledig daarna te kyk en dit onder die boodskap te plaas), maar voor dit moet ons die sqlite3-biblioteke installeer wat ons sal gebruik om die vrae en hul onderskeie antwoorde op te slaan:
sudo apt-get install libsqlite3-dev
Nadat die biblioteke geïnstalleer is, is slegs 'n gebruik van Sqlite; ' om sqlite in vala te kan gebruik.
Ons sal 'n tabel moet opstel wat die volgende bevat:
vraag
Antwoord 1
Antwoord 2
Antwoord 3
Antwoord 4
korrek is
byvoorbeeld:
Vraag = is van Linux 'n goeie blog?
Antwoord1 = daardie blog bestaan nie
Antwoord2 = nee
Antwoord3 = ja
Antwoord4 = hallo
soos ons almal sal weet, is die regte antwoord 2 (die goeie een is 3)
korrek = 3
Om die tafel te maak en te hanteer, moet ons sql ken (u kan dit soek in u gunsteling soekenjin), stelling om die tabel te skep:
CREATE TABLE preguntas (pregunta TEXT, respuesta1 TEXT, respuesta2 TEXT, respuesta3 TEXT, respuesta4 TEXT, correcto INT);
Voeg vrae in ...:
VOEG IN VRAE (vraag, antwoord1, antwoord2, antwoord3, antwoord4, korrek) WAARDES ('dit is 'n goeie blog van Linux', 'dit is nie 'n blog nie', 'nee', 'ja', 'hallo', 3);
Ok, kry nou 'n vraag (willekeurig gesorteer):
SELECT pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto FROM preguntas ORDER BY RANDOM()
Die opening van die databasis:
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 ());
}
As ons dit nog nie geskep het nie (die eerste keer dat ons die kode gebruik), sal dit self skep.
Maak die tabel en voeg vrae in:
private nietig bd () {string errmsg; // Maak die databasis oop / Skep die databasis int ec = Sqlite.Database.open ("test.db", out db); as (ec! = Sqlite.OK) {stderr.printf ("Kan databasis nie oopmaak nie:% d:% s \ n", db.errcode (), db.errmsg ()); } if (! FileUtils.test ("test.db", FileTest.IS_REGULAR)) {string query = "" "TAFEL vrae (vraag TEKS, antwoord1 TEKS, antwoord2 TEKS, antwoord3 TEKS, antwoord4 TEKS, korrekte INT); INVOEGING IN VRAE (vraag, antwoord1, antwoord2, antwoord3, antwoord4, korrek) WAARDES ('dit is 'n goeie blog van Linux', 'dit is geen blog nie', 'nee', 'ja', 'hallo', 3); INVOEG IN vrae (vraag, antwoord1, antwoord2, antwoord3, antwoord4, korrek) WAARDES ('5 + 5', '25', '10', '3', '5', 2); "" "; ec = db.exec (navraag, null, out errmsg); as (ec! = Sqlite.OK) {stderr.printf ("Fout:% s \ n", errmsg); }}}
Kyk of daar geen fout is nie:
as (ec! = Sqlite.OK) {stderr.printf ("Fout:% s \ n", errmsg); terugkeer -1; }
Ons sal 6 snare maak wat ons sal help om vrae en antwoorde op te stel.
private string p; privaat string r1; private string r2; private string r3; private string r4; private string c;
Stel 'n vraag (wat ons van test.db kry) met 'n SELECT:
private leemte bd_select_questions () {string query = "KIES vraag, antwoord1, antwoord2, antwoord3, antwoord4, korrek VANAF vrae BESTEL OP RANDOM ()"; int rc = db.prepare_v2 (navraag, -1, out stmt, null); int cols = stmt.column_count (); rc = stmt.step (); int kol; as (rc == Sqlite.ROW) {vir (col = 0; col <cols; col ++) {string txt = stmt.column_text (col); as (kol == 0) {p = txt; } anders as (kol == 1) {r1 = txt; } anders as (kol == 2) {r2 = txt; } anders as (kol == 3) {r3 = txt; } anders as (kol == 4) {r4 = txt; } anders {c = txt; } // druk ("% s =% s \ n", stmt.column_name (col), txt); }}}
Stel die vraag aan die grafiese elemente:
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);
}
Koers:
private void puntua () {
this.punts = this.punts + 50;
this.puntos.set_label(this.punts.to_string());
}
Probeer of die antwoord korrek is:
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");
});
Tydlogika, soos ons reeds in die vorige berig gesien het, hoef ons net 'n by te voeg as dit bevestig dat die tyd as dit 1 bereik, ons die antwoord as verkeerd gee:
Stel saam (ons voeg –pkg sqlite3 by)
valac -v lol.vala --pkg gtk+-3.0 --pkg sqlite3
Maak drie knoppies (50%, vries, slaag):
Ons skep 'n nuwe horisontale Gbox en voeg die drie knoppies daarby, ons voeg hierdie Gbox by die een wat ons reeds geskep het:
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);
Volledige kode: http://paste.desdelinux.net/4882
3 kommentaar, los joune
Baie dankie vir die tutoriaal, baie interessant vir diegene onder ons wat met iets eenvoudigs wil begin. Ek sal meer hulp nodig hê met die skep van die datatabelle. Cheers
Baie goed! Goed verduidelik en gedetailleerd. Dankie vir die data. (en)
Dankie man! Baie interessant as die eerste.
Dit sal goed wees om die verskillende aanvullende gevalle, tipe opmerkings (die soort pop-ups) of menu's te sien (tik die panele in elementêre of kabouter-dop) ...
Die waarheid, baie goed.
Ons lees: =)