U ovom drugom dijelu ćemo izgraditi logiku aplikacije (da bismo bolje vidjeli i analizirali kôd da bismo ga pogledali u cijelosti, stavit ću ga ispod posta), ali prije toga trebat ćemo instalirati sqlite3 biblioteke koje ćemo koristite da biste mogli spremiti pitanja i njihove odgovore:
sudo apt-get install libsqlite3-dev
Jednom kada se biblioteke instaliraju, trebat će nam samo "koristeći Sqlite;" da biste mogli koristiti sqlite u vali.
Trebat ćemo stvoriti tablicu koja sadrži:
Pitanje
Odgovor 1
Odgovor 2
Odgovor 3
Odgovor 4
tačno
primer:
Pregunta = es desdelinux un buen blog?
Odgovor1 = taj blog ne postoji
Odgovor2 = ne
Odgovor3 = da
Odgovor4 = zdravo
kao što ćemo svi znati tačan odgovor je 2 (dobra je 3)
tačno = 3
Da bismo kreirali tablicu i obradili je, trebamo znati sql (možete ga potražiti u vašoj omiljenoj tražilici), izraz za kreiranje tablice:
CREATE TABLE preguntas (pregunta TEXT, respuesta1 TEXT, respuesta2 TEXT, respuesta3 TEXT, respuesta4 TEXT, correcto INT);
Umetnite pitanja ...:
INSERT INTO preguntas (pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto) VALUES ('es desdelinux un buen blog', 'no es ningun blog', 'no', 'si', 'hola', 3);
Ok, sad dobijte pitanje (nasumično poredano):
SELECT pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto FROM preguntas ORDER BY RANDOM()
Otvaranje baze podataka:
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 ());
}
U slučaju da ga već nismo kreirali (prvi put kad pokrenemo kod), kreiraće se sam.
Kreirajte tablicu i umetnite pitanja:
private void bd () { string errmsg; // Abre la base de datos / Crea la base de datos 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 ()); } if (!FileUtils.test ("test.db", FileTest.IS_REGULAR)) { string query = """ CREATE TABLE preguntas ( pregunta TEXT, respuesta1 TEXT, respuesta2 TEXT, respuesta3 TEXT, respuesta4 TEXT, correcto INT ); INSERT INTO preguntas (pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto) VALUES ('es desdelinux un buen blog', 'no es ningun blog', 'no', 'si', 'hola', 3); INSERT INTO preguntas (pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto) VALUES ('5+5', '25', '10', '3', '5', 2); """; ec = db.exec (query, null, out errmsg); if (ec != Sqlite.OK) { stderr.printf ("Error: %s\n", errmsg); } } }
Provjerite da nema greške:
if (ec! = Sqlite.OK) {stderr.printf ("Greška:% s \ n", errmsg); return -1; }
Stvorit ćemo 6 nizova koji će nam pomoći da dodijelimo pitanja i odgovore.
privatni niz p; privatni niz r1; privatni niz r2; privatni niz r3; privatni niz r4; privatni niz c;
Postavljanje pitanja (koje dobivamo iz test.db) pomoću SELECT:
private void bd_select_questions () {string query = "ODABERITE pitanje, odgovor1, odgovor2, odgovor3, odgovor4, ispravite IZ pitanja NARUČITE SLUČAJNO ()"; int rc = db.prepare_v2 (upit, -1, van stmt, null); int kols = 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; } inače ako (col == 1) {r1 = txt; } inače if (col == 2) {r2 = txt; } inače if (col == 3) {r3 = txt; } inače ako (col == 4) {r4 = txt; } else {c = txt; } // ispis ("% s =% s \ n", stmt.column_name (col), txt); }}}
Postavite pitanje grafičkim elementima:
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);
}
Ocijeni:
private void puntua () {
this.punts = this.punts + 50;
this.puntos.set_label(this.punts.to_string());
}
Pokušajte ako je odgovor tačan:
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");
});
Logika vremena, kao što smo vidjeli u prethodnom postu, moramo dodati samo if koji potvrđuje da vrijeme ako dosegne 1 dajemo odgovor kao netačan:
Sastavi (dodamo –pkg sqlite3)
valac -v lol.vala --pkg gtk+-3.0 --pkg sqlite3
Izrada tri tipke (50%, Freeze, Pass):
Kreiramo novi horizontalni Gbox i na njega dodamo tri dugmeta, dodajemo ovaj Gbox onom koji smo već kreirali:
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);
Potpuni kod: http://paste.desdelinux.net/4882
Puno vam hvala na vodiču, vrlo zanimljivo za nas koji želimo započeti s nečim jednostavnim, trebala bih više pomoći oko dijela izrade tablica podataka. Živjeli
Veoma dobro! Dobro objašnjeno i detaljno. Hvala na podacima. (i)
Hvala čovječe! Vrlo zanimljivo kao prvo.
Bilo bi dobro vidjeti razne komplementarne instance, komentare tipa (ti tip iskačući prozori) ili menije (upišite one panele koji se pojavljuju u osnovnoj ili gnome-ljusci) ...
Istina je vrlo dobra.
Čitamo: =)