From 65d7ddc4eb6ddd454c6727d28c9f3499cc9fa9e5 Mon Sep 17 00:00:00 2001 From: George Tasker Date: Thu, 7 Oct 1999 11:04:06 +0000 Subject: [PATCH] Fixed the GUI so it will now work correctly when widgets are clicked/used. This demo program was not really even usable, although the database portions worked correctly. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3864 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- samples/db/dbtest.cpp | 156 ++++++++++++++++++++++++++++------------- samples/db/dbtest.h | 22 +++--- samples/db/listdb.cpp | 84 ++++++++++++++++++++-- samples/db/listdb.h | 5 +- samples/db/makefile.vc | 2 + 5 files changed, 208 insertions(+), 61 deletions(-) diff --git a/samples/db/dbtest.cpp b/samples/db/dbtest.cpp index b5d0cbc3d2..81dfc6e7f7 100644 --- a/samples/db/dbtest.cpp +++ b/samples/db/dbtest.cpp @@ -93,7 +93,6 @@ wxDB *READONLY_DB; * NOTE: The value returned by this function is for temporary use only and * should be copied for long term use */ - char *GetExtendedDBErrorMsg(char *ErrFile, int ErrLine) { static wxString msg; @@ -193,12 +192,18 @@ bool DatabaseDemoApp::OnInit() buffer[strlen(buffer)-1] = '\0'; strcpy(params.Password,buffer); + fgets(buffer, sizeof(params.DirPath), paramFile); + buffer[strlen(buffer)-1] = '\0'; + strcpy(params.DirPath,buffer); + fclose(paramFile); // Connect to datasource strcpy(DbConnectInf.Dsn, params.ODBCSource); // ODBC data source name (created with ODBC Administrator under Win95/NT) strcpy(DbConnectInf.Uid, params.UserName); // database username - must already exist in the data source strcpy(DbConnectInf.AuthStr, params.Password); // password database username + strcpy(DbConnectInf.defaultDir,params.DirPath); // path where the table exists (needed for dBase) + READONLY_DB = GetDbConnection(&DbConnectInf); if (READONLY_DB == 0) { @@ -286,7 +291,7 @@ void DatabaseDemoFrame::CreateDataTable() return; } - if (!Contact->CreateTable()) + if (!Contact->CreateTable(FALSE)) { wxEndBusyCursor(); wxString tStr; @@ -307,7 +312,8 @@ void DatabaseDemoFrame::CreateDataTable() success = FALSE; } } - wxEndBusyCursor(); + while (wxIsBusy()) + wxEndBusyCursor(); delete Contact; @@ -344,7 +350,7 @@ void DatabaseDemoFrame::BuildParameterDialog(wxWindow *parent) * or creating a table objects which use the same pDb, know that all the objects * will be committed or rolled back when any of the objects has this function call made. */ -Ccontact::Ccontact (wxDB *pwxDB) : wxTable(pwxDB ? pwxDB : GetDbConnection(&DbConnectInf),CONTACT_TABLE_NAME,CONTACT_NO_COLS) +Ccontact::Ccontact (wxDB *pwxDB) : wxTable(pwxDB ? pwxDB : GetDbConnection(&DbConnectInf),CONTACT_TABLE_NAME,CONTACT_NO_COLS,NULL,!QUERY_ONLY,DbConnectInf.defaultDir) { // This is used to represent whether the database connection should be released // when this instance of the object is deleted. If using the same connection @@ -402,18 +408,20 @@ Ccontact::~Ccontact() */ void Ccontact::SetupColumns() { - SetColDefs ( 0,"NAME", DB_DATA_TYPE_VARCHAR, Name, SQL_C_CHAR, sizeof(Name), TRUE, TRUE); // Primary index - SetColDefs ( 1,"ADDRESS1", DB_DATA_TYPE_VARCHAR, Addr1, SQL_C_CHAR, sizeof(Addr1), FALSE,TRUE); - SetColDefs ( 2,"ADDRESS2", DB_DATA_TYPE_VARCHAR, Addr2, SQL_C_CHAR, sizeof(Addr2), FALSE,TRUE); - SetColDefs ( 3,"CITY", DB_DATA_TYPE_VARCHAR, City, SQL_C_CHAR, sizeof(City), FALSE,TRUE); - SetColDefs ( 4,"STATE", DB_DATA_TYPE_VARCHAR, State, SQL_C_CHAR, sizeof(State), FALSE,TRUE); - SetColDefs ( 5,"POSTAL_CODE", DB_DATA_TYPE_VARCHAR, PostalCode, SQL_C_CHAR, sizeof(PostalCode), FALSE,TRUE); - SetColDefs ( 6,"COUNTRY", DB_DATA_TYPE_VARCHAR, Country, SQL_C_CHAR, sizeof(Country), FALSE,TRUE); - SetColDefs ( 7,"JOIN_DATE", DB_DATA_TYPE_DATE, &JoinDate, SQL_C_TIMESTAMP, sizeof(JoinDate), FALSE,TRUE); - SetColDefs ( 8,"NATIVE_LANGUAGE", DB_DATA_TYPE_INTEGER, &NativeLanguage, SQL_C_ENUM, sizeof(NativeLanguage), FALSE,TRUE); - SetColDefs ( 9,"IS_DEVELOPER", DB_DATA_TYPE_INTEGER, &IsDeveloper, SQL_C_BOOLEAN, sizeof(bool), FALSE,TRUE); - SetColDefs (10,"CONTRIBUTIONS", DB_DATA_TYPE_INTEGER, &Contributions, SQL_C_USHORT, sizeof(Contributions), FALSE,TRUE); - SetColDefs (11,"LINES_OF_CODE", DB_DATA_TYPE_INTEGER, &LinesOfCode, SQL_C_ULONG, sizeof(LinesOfCode), FALSE,TRUE); + // NOTE: Columns now are 8 character names, as that is all dBase can support. Longer + // names can be used for other database engines + SetColDefs ( 0,"NAME", DB_DATA_TYPE_VARCHAR, Name, SQL_C_CHAR, sizeof(Name), TRUE, TRUE); // Primary index + SetColDefs ( 1,"ADDRESS1", DB_DATA_TYPE_VARCHAR, Addr1, SQL_C_CHAR, sizeof(Addr1), FALSE,TRUE); + SetColDefs ( 2,"ADDRESS2", DB_DATA_TYPE_VARCHAR, Addr2, SQL_C_CHAR, sizeof(Addr2), FALSE,TRUE); + SetColDefs ( 3,"CITY", DB_DATA_TYPE_VARCHAR, City, SQL_C_CHAR, sizeof(City), FALSE,TRUE); + SetColDefs ( 4,"STATE", DB_DATA_TYPE_VARCHAR, State, SQL_C_CHAR, sizeof(State), FALSE,TRUE); + SetColDefs ( 5,"POSTCODE", DB_DATA_TYPE_VARCHAR, PostalCode, SQL_C_CHAR, sizeof(PostalCode), FALSE,TRUE); + SetColDefs ( 6,"COUNTRY", DB_DATA_TYPE_VARCHAR, Country, SQL_C_CHAR, sizeof(Country), FALSE,TRUE); + SetColDefs ( 7,"JOINDATE", DB_DATA_TYPE_DATE, &JoinDate, SQL_C_TIMESTAMP, sizeof(JoinDate), FALSE,TRUE); + SetColDefs ( 8,"IS_DEV", DB_DATA_TYPE_INTEGER, &IsDeveloper, SQL_C_BOOLEAN(IsDeveloper),sizeof(IsDeveloper), FALSE,TRUE); + SetColDefs ( 9,"CONTRIBS", DB_DATA_TYPE_INTEGER, &Contributions, SQL_C_USHORT, sizeof(Contributions), FALSE,TRUE); + SetColDefs (10,"LINE_CNT", DB_DATA_TYPE_INTEGER, &LinesOfCode, SQL_C_ULONG, sizeof(LinesOfCode), FALSE,TRUE); + SetColDefs (11,"LANGUAGE", DB_DATA_TYPE_INTEGER, &NativeLanguage, SQL_C_ENUM, sizeof(NativeLanguage), FALSE,TRUE); } // Ccontact::SetupColumns @@ -488,7 +496,7 @@ CeditorDlg::CeditorDlg(wxWindow *parent) : wxPanel (parent, 1, 1, 460, 455) widgetPtrsSet = FALSE; // Create the data structure and a new database connection. - // (As there is not a pDb being passed in the constructor, a new database + // (As there is not a pDb being passed in the constructor, a new database // connection is created) Contact = new Ccontact(); @@ -500,7 +508,7 @@ CeditorDlg::CeditorDlg(wxWindow *parent) : wxPanel (parent, 1, 1, 460, 455) // Check if the table exists or not. If it doesn't, ask the user if they want to // create the table. Continue trying to create the table until it exists, or user aborts - while (!Contact->pDb->TableExists((char *)CONTACT_TABLE_NAME)) + while (!Contact->pDb->TableExists((char *)CONTACT_TABLE_NAME,DbConnectInf.Uid,DbConnectInf.defaultDir)) { wxString tStr; tStr.Printf("Unable to open the table '%s'.\n\nTable may need to be created...?\n\n",CONTACT_TABLE_NAME); @@ -620,10 +628,14 @@ CeditorDlg::CeditorDlg(wxWindow *parent) : wxPanel (parent, 1, 1, 460, 455) // to achieve a single row (in this case the first name in alphabetical order). // commented out because PostgreSQL can't do this - //Contact->whereStr.Printf("NAME = (SELECT MIN(NAME) FROM %s)",Contact->tableName); - - // NOTE: (const char*) returns a pointer which may not be valid later, so this is short term use only - Contact->where = (char*) (const char*) Contact->whereStr; + if (Contact->pDb->Dbms() != dbmsPOSTGRES) + { + Contact->whereStr.sprintf("NAME = (SELECT MIN(NAME) FROM %s)",Contact->tableName); + // NOTE: (const char*) returns a pointer which may not be valid later, so this is short term use only + Contact->where = (char*) (const char*) Contact->whereStr; + } + else + Contact->where = 0; // Perform the Query to get the result set. // NOTE: If there are no rows returned, that is a valid result, so Query() would return TRUE. @@ -675,6 +687,7 @@ void CeditorDlg::OnButton( wxCommandEvent &event ) OnCommand( *win, event ); } + void CeditorDlg::OnCommand(wxWindow& win, wxCommandEvent& event) { wxString widgetName; @@ -780,14 +793,18 @@ void CeditorDlg::OnCommand(wxWindow& win, wxCommandEvent& event) } } - // commented out because PostgreSQL can't do this - // Previous record not available, retrieve first record in table - //Contact->whereStr = "NAME = (SELECT MIN(NAME) FROM "; - //Contact->whereStr += Contact->tableName; - //Contact->whereStr += ")"; - - Contact->where = (char*) (const char*) Contact->whereStr; + if (Contact->pDb->Dbms() != dbmsPOSTGRES) + { + // PostgreSQL can't do this + Contact->whereStr = "NAME = (SELECT MIN(NAME) FROM "; + Contact->whereStr += Contact->tableName; + Contact->whereStr += ")"; + Contact->where = (char*) (const char*) Contact->whereStr; + } + else + Contact->where = 0; + if (!Contact->Query()) { wxString tStr; @@ -912,7 +929,7 @@ void CeditorDlg::OnCommand(wxWindow& win, wxCommandEvent& event) /* char *windowTitle */ "Select contact name", /* char *tableName */ (char *) CONTACT_TABLE_NAME, /* char *dispCol1 */ "NAME", - /* char *dispCol2 */ "JOIN_DATE", + /* char *dispCol2 */ "JOINDATE", /* char *where */ "", /* char *orderBy */ "NAME", /* bool distinctValues */ TRUE); @@ -1115,7 +1132,7 @@ bool CeditorDlg::GetData() Contact->LinesOfCode = atol(pLinesTxt->GetValue()); Contact->NativeLanguage = (enum Language) pNativeLangChoice->GetSelection(); - Contact->IsDeveloper = (bool) pDeveloperRadio->GetSelection(); + Contact->IsDeveloper = pDeveloperRadio->GetSelection() > 0; return TRUE; } // CeditorDlg::GetData() @@ -1139,8 +1156,6 @@ bool CeditorDlg::Save() failed = TRUE; // Perform any other required validations necessary before saving - - if (!failed) { wxBeginBusyCursor(); @@ -1207,11 +1222,16 @@ bool CeditorDlg::GetNextRec() { wxString w; - // commented out because PostgreSQL can't do this - //w = "NAME = (SELECT MIN(NAME) FROM "; - //w += Contact->tableName; - // w += " WHERE NAME > '"; - w = "(NAME > '"; + if (Contact->pDb->Dbms() != dbmsPOSTGRES) + { + // PostgreSQL can't do this + w = "NAME = (SELECT MIN(NAME) FROM "; + w += Contact->tableName; + w += " WHERE NAME > '"; + } + else + w = "(NAME > '"; + w += Contact->Name; w += "'"; @@ -1238,11 +1258,16 @@ bool CeditorDlg::GetPrevRec() { wxString w; - // commented out because PostgreSQL can't do this - //w = "NAME = (SELECT MAX(NAME) FROM "; - //w += Contact->tableName; - //w += " WHERE NAME < '"; - w = "(NAME < '"; + if (Contact->pDb->Dbms() != dbmsPOSTGRES) + { + // PostgreSQL can't do this + w = "NAME = (SELECT MAX(NAME) FROM "; + w += Contact->tableName; + w += " WHERE NAME < '"; + } + else + w = "(NAME < '"; + w += Contact->Name; w += "'"; @@ -1269,7 +1294,7 @@ bool CeditorDlg::GetRec(char *whereStr) { Contact->where = whereStr; Contact->orderBy = "NAME"; - + if (!Contact->Query()) { wxString tStr; @@ -1296,10 +1321,12 @@ bool CeditorDlg::GetRec(char *whereStr) */ BEGIN_EVENT_TABLE(CparameterDlg, wxDialog) + EVT_BUTTON(PARAMETER_DIALOG_SAVE, CparameterDlg::OnButton) + EVT_BUTTON(PARAMETER_DIALOG_CANCEL, CparameterDlg::OnButton) EVT_CLOSE(CparameterDlg::OnCloseWindow) END_EVENT_TABLE() -CparameterDlg::CparameterDlg(wxWindow *parent) : wxDialog (parent, PARAMETER_DIALOG, "ODBC parameter settings", wxPoint(-1, -1), wxSize(400, 275)) +CparameterDlg::CparameterDlg(wxWindow *parent) : wxDialog (parent, PARAMETER_DIALOG, "ODBC parameter settings", wxPoint(-1, -1), wxSize(400, 325)) { // Since the ::OnCommand() function is overridden, this prevents the widget // detection in ::OnCommand() until all widgets have been initialized to prevent @@ -1315,6 +1342,9 @@ CparameterDlg::CparameterDlg(wxWindow *parent) : wxDialog (parent, PARAMETER_DIA pParamPasswordMsg = new wxStaticText(this, PARAMETER_DIALOG_PASSWORD_MSG, "Password:", wxPoint(156, 193), wxSize(-1, -1), 0, "ParamPasswordMsg"); pParamPasswordTxt = new wxTextCtrl(this, PARAMETER_DIALOG_PASSWORD_TEXT, "", wxPoint(156, 209), wxSize(140, 25), 0, wxDefaultValidator, "ParamPasswordTxt"); + pParamDirPathMsg = new wxStaticText(this, PARAMETER_DIALOG_DIRPATH_MSG, "Directory:", wxPoint(10, 243), wxSize(-1, -1), 0, "ParamDirPathMsg"); + pParamDirPathTxt = new wxTextCtrl(this, PARAMETER_DIALOG_DIRPATH_TEXT, "", wxPoint(10, 259), wxSize(140, 25), 0, wxDefaultValidator, "ParamDirPathTxt"); + pParamSaveBtn = new wxButton(this, PARAMETER_DIALOG_SAVE, "&Save", wxPoint(310, 21), wxSize(70, 35), 0, wxDefaultValidator, "ParamSaveBtn"); pParamCancelBtn = new wxButton(this, PARAMETER_DIALOG_CANCEL, "C&ancel", wxPoint(310, 66), wxSize(70, 35), 0, wxDefaultValidator, "ParamCancelBtn"); @@ -1355,6 +1385,12 @@ void CparameterDlg::OnCloseWindow(wxCloseEvent& event) } // Cparameter::OnCloseWindow() +void CparameterDlg::OnButton( wxCommandEvent &event ) +{ + wxWindow *win = (wxWindow*) event.GetEventObject(); + OnCommand( *win, event ); +} + void CparameterDlg::OnCommand(wxWindow& win, wxCommandEvent& event) { wxString widgetName; @@ -1396,6 +1432,7 @@ bool CparameterDlg::PutData() pParamODBCSourceList->SetStringSelection(wxGetApp().params.ODBCSource); pParamUserNameTxt->SetValue(wxGetApp().params.UserName); pParamPasswordTxt->SetValue(wxGetApp().params.Password); + pParamDirPathTxt->SetValue(wxGetApp().params.DirPath); return TRUE; } // CparameterDlg::PutData() @@ -1437,6 +1474,17 @@ bool CparameterDlg::GetData() return FALSE; } strcpy(wxGetApp().params.Password,tStr); + + tStr = pParamDirPathTxt->GetValue(); + tStr.Replace("\\","/"); + if (tStr.Length() > (sizeof(wxGetApp().params.DirPath)-1)) + { + wxString errmsg; + errmsg.Printf("DirPath is longer than the data structure to hold it.\n'Cparameter.DirPath' must have a larger character array\nto handle a data source with this long of a name\n\nThe password currently specified is %d characters long.",tStr.Length()); + wxMessageBox(errmsg,"Internal program error...",wxOK | wxICON_EXCLAMATION); + return FALSE; + } + strcpy(wxGetApp().params.DirPath,tStr); return TRUE; } // CparameterDlg::GetData() @@ -1465,6 +1513,8 @@ bool CparameterDlg::Save() fputc('\n', paramFile); fputs(wxGetApp().params.Password, paramFile); fputc('\n', paramFile); + fputs(wxGetApp().params.DirPath, paramFile); + fputc('\n', paramFile); fclose(paramFile); return TRUE; @@ -1566,6 +1616,17 @@ CqueryDlg::CqueryDlg(wxWindow *parent, wxDB *pDb, char *tblName[], char *pWhereA wxString qualName; pQueryCol2Choice->Append("VALUE -->"); colInf = pDB->GetColumns(tblName); + + if (!colInf) + { + wxEndBusyCursor(); + wxString tStr; + tStr = "ODBC error during GetColumns()\n\n"; + tStr += GetExtendedDBErrorMsg(__FILE__,__LINE__); + wxMessageBox(tStr,"ODBC Error...",wxOK | wxICON_EXCLAMATION); + return; + } + for (int i = 0; colInf[i].colName && strlen(colInf[i].colName); i++) { // If there is more than one table being queried, qualify @@ -1837,7 +1898,8 @@ void CqueryDlg::OnCloseWindow(wxCloseEvent& event) } GetParent()->SetFocus(); - wxEndBusyCursor(); + while (wxIsBusy()) + wxEndBusyCursor(); this->Destroy(); @@ -1990,7 +2052,7 @@ void CqueryDlg::ProcessCountBtn() if (dbTable == 0) // wxTable object needs to be created and opened { - if (!(dbTable = new wxTable(pDB, masterTableName, 0))) + if (!(dbTable = new wxTable(pDB, masterTableName, 0, NULL, !QUERY_ONLY, DbConnectInf.defaultDir))) { wxMessageBox("Memory allocation failed creating a wxTable object.","Error...",wxOK | wxICON_EXCLAMATION); return; diff --git a/samples/db/dbtest.h b/samples/db/dbtest.h index b6d1bd6ea3..2a18570f9b 100644 --- a/samples/db/dbtest.h +++ b/samples/db/dbtest.h @@ -40,10 +40,10 @@ enum Language {langENGLISH, langFRENCH, langGERMAN, langSPANISH, langOTHER}; class CeditorDlg; class CparameterDlg; -#ifdef __WXGTK__ -const char paramFilename[] = "../database.cfg"; +#ifdef __UNIX__ +const char paramFilename[] = "../dbtest.cfg"; #else -const char paramFilename[] = "database.cfg"; +const char paramFilename[] = "dbtest.cfg"; #endif @@ -102,6 +102,7 @@ typedef struct Cparameters char ODBCSource[100+1]; char UserName[25+1]; char Password[25+1]; + char DirPath[MAX_PATH+1]; } Cparameters; @@ -236,14 +237,15 @@ class CparameterDlg : public wxDialog // Pointers to all widgets on the dialog wxStaticText *pParamODBCSourceMsg; - wxListBox *pParamODBCSourceList; - wxStaticText *pParamUserNameMsg, *pParamPasswordMsg; - wxTextCtrl *pParamUserNameTxt, *pParamPasswordTxt; - wxButton *pParamSaveBtn, *pParamCancelBtn; + wxListBox *pParamODBCSourceList; + wxStaticText *pParamUserNameMsg, *pParamPasswordMsg, *pParamDirPathMsg; + wxTextCtrl *pParamUserNameTxt, *pParamPasswordTxt, *pParamDirPathTxt; + wxButton *pParamSaveBtn, *pParamCancelBtn; public: CparameterDlg(wxWindow *parent); void OnCloseWindow(wxCloseEvent& event); + void OnButton( wxCommandEvent &event ); void OnCommand(wxWindow& win, wxCommandEvent& event); void OnActivate(bool) {}; // necessary for hot keys @@ -264,8 +266,10 @@ DECLARE_EVENT_TABLE() #define PARAMETER_DIALOG_NAME_TEXT 404 #define PARAMETER_DIALOG_PASSWORD_MSG 405 #define PARAMETER_DIALOG_PASSWORD_TEXT 406 -#define PARAMETER_DIALOG_SAVE 407 -#define PARAMETER_DIALOG_CANCEL 408 +#define PARAMETER_DIALOG_DIRPATH_MSG 407 +#define PARAMETER_DIALOG_DIRPATH_TEXT 408 +#define PARAMETER_DIALOG_SAVE 409 +#define PARAMETER_DIALOG_CANCEL 410 // *************************** CqueryDlg *************************** diff --git a/samples/db/listdb.cpp b/samples/db/listdb.cpp index 574bab36be..a47e6a3875 100644 --- a/samples/db/listdb.cpp +++ b/samples/db/listdb.cpp @@ -56,6 +56,8 @@ #include +extern DbList* WXDLLEXPORT PtrBegDbList; /* from db.cpp, used in getting back error results from db connections */ + #include "listdb.h" // Global structure for holding ODBC connection information @@ -78,8 +80,65 @@ char ListDB_Selection2[LOOKUP_COL_LEN+1]; const int LISTDB_NO_SPACES_BETWEEN_COLS = 3; + +/* + * This function will return the exact string(s) from the database engine + * indicating all error conditions which have just occured during the + * last call to the database engine. + * + * This demo uses the returned string by displaying it in a wxMessageBox. The + * formatting therefore is not the greatest, but this is just a demo, not a + * finished product. :-) gt + * + * NOTE: The value returned by this function is for temporary use only and + * should be copied for long term use + */ +char *GetExtendedDBErrorMsg2(char *ErrFile, int ErrLine) +{ + static wxString msg; + + wxString tStr; + + if (ErrFile || ErrLine) + { + msg += "File: "; + msg += ErrFile; + msg += " Line: "; + tStr.Printf("%d",ErrLine); + msg += tStr.GetData(); + msg += "\n"; + } + + msg.Append ("\nODBC errors:\n"); + msg += "\n"; + + /* Scan through each database connection displaying + * any ODBC errors that have occured. */ + for (DbList *pDbList = PtrBegDbList; pDbList; pDbList = pDbList->PtrNext) + { + // Skip over any free connections + if (pDbList->Free) + continue; + // Display errors for this connection + for (int i = 0; i < DB_MAX_ERROR_HISTORY; i++) + { + if (pDbList->PtrDb->errorList[i]) + { + msg.Append(pDbList->PtrDb->errorList[i]); + if (strcmp(pDbList->PtrDb->errorList[i],"") != 0) + msg.Append("\n"); + } + } + } + msg += "\n"; + + return (char*) (const char*) msg; +} // GetExtendedDBErrorMsg + + + // Clookup constructor -Clookup::Clookup(char *tblName, char *colName) : wxTable(READONLY_DB, tblName, 1) +Clookup::Clookup(char *tblName, char *colName) : wxTable(READONLY_DB, tblName, 1, NULL, !QUERY_ONLY, DbConnectInf.defaultDir) { SetColDefs (0, colName, DB_DATA_TYPE_VARCHAR, lookupCol, SQL_C_CHAR, LOOKUP_COL_LEN+1, FALSE, FALSE); @@ -89,7 +148,7 @@ Clookup::Clookup(char *tblName, char *colName) : wxTable(READONLY_DB, tblName, 1 // Clookup2 constructor Clookup2::Clookup2(char *tblName, char *colName1, char *colName2, wxDB *pDb) - : wxTable(pDb, tblName, (1 + (strlen(colName2) > 0))) + : wxTable(pDb, tblName, (1 + (strlen(colName2) > 0)), NULL, !QUERY_ONLY, DbConnectInf.defaultDir) { int i = 0; @@ -101,6 +160,13 @@ Clookup2::Clookup2(char *tblName, char *colName1, char *colName2, wxDB *pDb) } // Clookup2() +BEGIN_EVENT_TABLE(ClookUpDlg, wxDialog) +// EVT_LISTBOX(LOOKUP_DIALOG_SELECT, ClookUpDlg::SelectCallback) + EVT_BUTTON(LOOKUP_DIALOG_OK, ClookUpDlg::OnButton) + EVT_BUTTON(LOOKUP_DIALOG_CANCEL, ClookUpDlg::OnButton) + EVT_CLOSE(ClookUpDlg::OnClose) +END_EVENT_TABLE() + // This is a generic lookup constructor that will work with any table and any column ClookUpDlg::ClookUpDlg(wxWindow *parent, char *windowTitle, char *tableName, char *colName, char *where, char *orderBy) : wxDialog (parent, LOOKUP_DIALOG, "Select...", wxPoint(-1, -1), wxSize(400, 290)) @@ -234,6 +300,7 @@ ClookUpDlg::ClookUpDlg(wxWindow *parent, char *windowTitle, char *tableName, { wxString tStr; tStr.Printf("Unable to open the table '%s'.",tableName); + tStr += GetExtendedDBErrorMsg2(__FILE__,__LINE__); wxMessageBox(tStr,"ODBC Error..."); Close(); return; @@ -329,7 +396,7 @@ ClookUpDlg::ClookUpDlg(wxWindow *parent, char *windowTitle, char *tableName, } // Generic lookup constructor 2 -bool ClookUpDlg::OnClose(void) +void ClookUpDlg::OnClose(wxCloseEvent& event) { widgetPtrsSet = FALSE; GetParent()->Enable(TRUE); @@ -340,11 +407,20 @@ bool ClookUpDlg::OnClose(void) delete lookup2; wxEndBusyCursor(); - return TRUE; + event.Skip(); + +// return TRUE; } // ClookUpDlg::OnClose +void ClookUpDlg::OnButton( wxCommandEvent &event ) +{ + wxWindow *win = (wxWindow*) event.GetEventObject(); + OnCommand( *win, event ); +} + + void ClookUpDlg::OnCommand(wxWindow& win, wxCommandEvent& event) { wxString widgetName = win.GetName(); diff --git a/samples/db/listdb.h b/samples/db/listdb.h index 440ad92f3b..fb64588a42 100644 --- a/samples/db/listdb.h +++ b/samples/db/listdb.h @@ -112,9 +112,12 @@ class ClookUpDlg : public wxDialog wxDB *pDb = READONLY_DB, // Database connection pointer bool allowOk = TRUE); // is the OK button enabled + void OnButton( wxCommandEvent &event ); void OnCommand(wxWindow& win, wxCommandEvent& event); - bool OnClose(); + void OnClose(wxCloseEvent& event); void OnActivate(bool) {}; // necessary for hot keys + +DECLARE_EVENT_TABLE() }; #define LOOKUP_DIALOG 500 diff --git a/samples/db/makefile.vc b/samples/db/makefile.vc index e1243b6d30..b0b4859e31 100644 --- a/samples/db/makefile.vc +++ b/samples/db/makefile.vc @@ -10,6 +10,8 @@ # Set WXDIR for your system WXDIR = $(WXWIN) +# added by glt for my own environment +WXDIR = D:\wx2\wxWindows PROGRAM=dbtest OBJECTS = $(PROGRAM).obj listdb.obj -- 2.45.2