في هذا الجزء الثاني ، سنبني منطق التطبيق (لرؤية الكود وتحليله بشكل أفضل للنظر إليه بالكامل سأضعه أسفل المنشور) ، ولكن قبل ذلك سنحتاج إلى تثبيت مكتبات sqlite3 التي سنقوم بها استخدمها لتتمكن من حفظ الأسئلة والإجابات الخاصة بها:
sudo apt-get install libsqlite3-dev
بمجرد تثبيت المكتبات ، سنحتاج فقط إلى "using Sqlite؛" لتتمكن من استخدام sqlite في vala.
سنحتاج إلى إنشاء جدول يحتوي على:
استجواب
الجواب 1
الجواب 2
الجواب 3
الجواب 4
صيح
على سبيل المثال:
سؤال = هو desdelinux مدونة جيدة؟
Answer1 = هذه المدونة غير موجودة
Answer2 = لا
Answer3 = نعم
Answer4 = مرحبًا
كما سنعرف جميعًا أن الإجابة الصحيحة هي 2 (الصالح هو 3)
صحيح = 3
لإنشاء الجدول والتعامل معه ، سنحتاج إلى معرفة sql (يمكنك البحث عنها في محرك البحث المفضل لديك) ، بيان لإنشاء الجدول:
CREATE TABLE preguntas (pregunta TEXT, respuesta1 TEXT, respuesta2 TEXT, respuesta3 TEXT, respuesta4 TEXT, correcto INT);
أدخل الأسئلة ...:
أدخل في الأسئلة (سؤال، إجابة 1، إجابة 2، إجابة 3، إجابة 4، صحيحة) القيم ('es) desdelinux مدونة جيدة"، "إنها ليست مدونة"، "لا"، "نعم"، "مرحبًا"، 3)؛
حسنًا ، احصل الآن على سؤال (تم فرزه عشوائيًا):
SELECT pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto FROM preguntas ORDER BY RANDOM()
فتح قاعدة البيانات:
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 ());
}
في حالة عدم إنشائه بالفعل (في المرة الأولى التي نقوم فيها بتشغيل الكود) ، فسيتم إنشاء نفسه.
قم بإنشاء الجدول وإدراج الأسئلة:
Private void bd() { string errmsg; // فتح قاعدة البيانات / إنشاء قاعدة بيانات int ec = Sqlite.Database.open("test.db", out db); if (ec != Sqlite.OK) { stderr.printf ("لا يمكن فتح قاعدة البيانات: %d: %s\n"، db.errcode ()، db.errmsg ()); } if (!FileUtils.test ("test.db", FileTest.IS_REGULAR)) { استعلام السلسلة = """ إنشاء أسئلة الجدول ( نص السؤال، نص الإجابة 1، نص الإجابة 2، نص الإجابة 3، نص الإجابة 4، صحيح INT )؛ إدراج INTO الأسئلة (سؤال، إجابة 1، إجابة 2، إجابة 3، إجابة 4، صحيحة) القيم ('is desdelinux مدونة جيدة"، "إنها ليست مدونة"، "لا"، "نعم"، "مرحبًا"، 3)؛ أدخل في الأسئلة (سؤال، إجابة 1، إجابة 2، إجابة 3، إجابة 4، صحيح) القيم ('5+5'، '25'، '10'، '3'، '5'، 2)؛ """; ec = db.exec (استعلام، فارغ، خارج errmsg)؛ if (ec != Sqlite.OK) { stderr.printf ("خطأ: %s\n"، errmsg)؛ } } }
تأكد من عدم وجود خطأ:
if (ec! = Sqlite.OK) {stderr.printf ("خطأ:٪ s \ n"، errmsg)؛ عودة -1 ؛ }
سننشئ 6 سلاسل ستساعدنا في تخصيص الأسئلة والأجوبة.
سلسلة خاصة p ؛ سلسلة خاصة r1 ؛ سلسلة خاصة r2 ؛ سلسلة خاصة r3 ؛ سلسلة خاصة r4 ؛ سلسلة خاصة ج ؛
وضع سؤال (نحصل عليه من test.db) باستخدام SELECT:
private void bd_select_questions () {string query = "SELECT question، answer1، answer2، answer3، answer4، right FROM questions ORDER BY RANDOM ()"؛ int rc = db.prepare_v2 (استعلام ، -1 ، خارج stmt ، فارغ) ؛ int cols = stmt.column_count () ، rc = stmt.step () ؛ int كول؛ إذا (rc == Sqlite.ROW) {لـ (col = 0؛ col <cols؛ col ++) {string txt = stmt.column_text (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؛ } آخر {c = txt؛ } // print ("٪ s =٪ s \ n"، stmt.column_name (col)، txt)؛ }}}
اطرح السؤال على العناصر الرسومية:
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);
}
معدل:
private void puntua () {
this.punts = this.punts + 50;
this.puntos.set_label(this.punts.to_string());
}
حاول إذا كانت الإجابة صحيحة:
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");
});
منطق الوقت ، كما رأينا في المنشور السابق ، علينا فقط إضافة إذا كان هذا يتحقق من أن الوقت إذا وصل إلى 1 ، نعطي الإجابة على أنها غير صحيحة:
تجميع (نضيف –pkg sqlite3)
valac -v lol.vala --pkg gtk+-3.0 --pkg sqlite3
إنشاء ثلاثة أزرار (50٪ ، تجميد ، تمرير):
نقوم بإنشاء Gbox أفقي جديد وإضافة الأزرار الثلاثة إليه ، ونضيف Gbox إلى الزر الذي أنشأناه بالفعل:
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);
كود كامل: http://paste.desdelinux.net/4882
شكرًا جزيلاً على البرنامج التعليمي ، فهو ممتع جدًا لأولئك منا الذين يريدون البدء بشيء بسيط ، سأحتاج إلى مزيد من المساعدة في الجزء المتعلق بإنشاء جداول البيانات. في صحتك
جيد جدا! شرح جيد ومفصل. شكرا على البيانات. (و)
شكرا يا رجل! مثيرة جدا للاهتمام كالأول.
سيكون من الجيد رؤية الأمثلة التكميلية المختلفة ، اكتب التعليقات (تلك النوافذ المنبثقة من النوع) أو القوائم (اكتب تلك اللوحات التي تظهر في أولية أو جنوم شل) ...
الحقيقة جيدة جدا
نقرأ: =)