Raf Vermeulen
Member #7,166
April 2006
|
The program I'm making's almost done, but it's got two more weird bugs. 1) When there's no database, and the user presses the Clear Data button, it should create the table needed. When the table already exists, it should flush it (or destroy it and make it again. My code for that, is:
1 | open_dbase = sqlite3_open(file, &database); | 2 | if(open_dbase) { | 3 | alert("Problem opening database.", 0, 0, "&Ok", NULL, 'o', NULL); | 4 | sqlite3_close(database); | 5 | } | 6 | else { | 7 | std::stringstream query; | 8 | query << "DROP TABLE dictionary;"; | 9 | result = sqlite3_exec(database, query.str().c_str(), callback, 0, NULL); | 10 | | 11 | if (result == SQLITE_OK) alert("The database is empty now.", 0, 0, "&Ok", NULL, 'o', NULL); | 12 | else { | 13 | const char* error = sqlite3_errmsg(database); | 14 | alert(error, 0, 0, "&Ok", 0, 'o', 0); | 15 | } | 16 | | 17 | query << "CREATE TABLE dictionary (word TEXT, translation TEXT);"; | 18 | result = sqlite3_exec(database, query.str().c_str(), callback, 0, NULL); | 19 | | 20 | if (result == SQLITE_OK) alert("The database is empty now.", 0, 0, "&Ok", NULL, 'o', NULL); | 21 | else { | 22 | const char* error = sqlite3_errmsg(database); | 23 | alert(error, 0, 0, "&Ok", 0, 'o', 0); | 24 | } | 25 | | 26 | sqlite3_close(database); |
It gives this error message twice: No such table: dictionary When I take away the Drop part and create without the table already existing, it works fine. If I do this, but when the table already exists, it says that the table already exists. 2) I've got a Quit-button at the main part of my application. Pressing Esc works as well. It first comes up and asks if you really want to quit. It works fine when pressing Esc, but when using the Quit-button, pressing Cancel still quits the program. This's the code:
1 | void closebutton (void) | 2 | { | 3 | simulate_keypress ((KEY_ESC << 8) | scancode_to_ascii (KEY_ESC)); | 4 | } | 5 | | 6 | | 7 | int quit_proc(int msg, DIALOG *d, int c) { | 8 | (void)d; | 9 | (void)c; | 10 | | 11 | return (((msg == MSG_KEY) || (msg == MSG_XCHAR && c == KEY_F10 << 8)) | 12 | && alert(0, "Quit?", 0, "Ok", "Cancel", 0, 0) == 1 ? D_CLOSE : D_O_K); | 13 | } | 14 | | 15 | | 16 | (...) | 17 | | 18 | DIALOG main_dlg[] = | 19 | { | 20 | /* (dialog proc) (x) (y) (w) (h) (fg)(bg) (key) (flags) (d1) (d2) (dp) (dp2) (dp3) */ | 21 | | 22 | /* this element just clears the screen, therefore it should come before the others */ | 23 | { d_agup_clear_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }, | 24 | | 25 | // Text | 26 | { d_agup_ctext_proc, 134, 50, 10, 0, 0, 0, 0, 0, 0, 0, (void *)"Dictionary", 0, 0 }, | 27 | | 28 | // Buttons | 29 | { d_agup_push_proc, 90, 75, 100, 18, 0, 0, 0, 0, 0, 0, (void*)"Translate", 0, (void*)translation_form }, | 30 | { d_agup_push_proc, 90, 95, 100, 18, 0, 0, 0, 0, 0, 0, (void*)"Add", 0, (void*)add }, | 31 | { d_agup_push_proc, 90, 115, 100, 18, 0, 0, 0, 0, 0, 0, (void*)"Edit", 0, (void*)edit }, | 32 | { d_agup_push_proc, 90, 135, 100, 18, 0, 0, 0, 0, 0, 0, (void*)"Delete", 0, (void*)delete_record }, | 33 | { d_agup_push_proc, 90, 155, 100, 18, 0, 0, 0, 0, 0, 0, (void*)"Clear Data", 0, (void*)new_dbase }, | 34 | { d_agup_push_proc, 90, 180, 100, 18, 0, 0, 0, 0, 0, 0, (void*)"Quit", 0, (void*)closebutton }, | 35 | | 36 | { quit_proc, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0 }, | 37 | | 38 | /* the next two elements don't draw anything */ | 39 | { d_yield_proc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }, | 40 | { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL } | 41 | }; | 42 | set_gui(main_dlg); |
To me, it all seems pretty logical, and I can't think of why it would act the way it does.
|