]> git.saurik.com Git - wxWidgets.git/commitdiff
Fixed the GUI so it will now work correctly when widgets are clicked/used. This...
authorGeorge Tasker <gtasker@allenbrook.com>
Thu, 7 Oct 1999 11:04:06 +0000 (11:04 +0000)
committerGeorge Tasker <gtasker@allenbrook.com>
Thu, 7 Oct 1999 11:04:06 +0000 (11:04 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3864 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

samples/db/dbtest.cpp
samples/db/dbtest.h
samples/db/listdb.cpp
samples/db/listdb.h
samples/db/makefile.vc

index b5d0cbc3d236296876adac9f06a6f36cac6bb52a..81dfc6e7f7e01912c6a9fd2af62a0a818177a21c 100644 (file)
@@ -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
  */
  * 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;
 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);
 
        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
        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)
        {
        READONLY_DB = GetDbConnection(&DbConnectInf);
        if (READONLY_DB == 0)
        {
@@ -286,7 +291,7 @@ void DatabaseDemoFrame::CreateDataTable()
                return;
        }
 
                return;
        }
 
-       if (!Contact->CreateTable())
+       if (!Contact->CreateTable(FALSE))
        {
                wxEndBusyCursor();
                wxString tStr;
        {
                wxEndBusyCursor();
                wxString tStr;
@@ -307,7 +312,8 @@ void DatabaseDemoFrame::CreateDataTable()
                        success = FALSE;
                }
        }
                        success = FALSE;
                }
        }
-       wxEndBusyCursor();
+       while (wxIsBusy())
+               wxEndBusyCursor();
 
        delete Contact;
 
 
        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.
  */
  *     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
 {
        // 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()
 {
  */
 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
 
 
 }  // 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.  
        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();
 
        // 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
 
        // 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);
        {
                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
        // 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.  
 
        // 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 );
 }
 
   OnCommand( *win, event );
 }
 
+
 void CeditorDlg::OnCommand(wxWindow& win, wxCommandEvent& event)
 {
        wxString widgetName;
 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
                // 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;
                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         *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);
                                                        /* 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->LinesOfCode = atol(pLinesTxt->GetValue());
 
        Contact->NativeLanguage = (enum Language) pNativeLangChoice->GetSelection();
-       Contact->IsDeveloper = (bool) pDeveloperRadio->GetSelection();
+       Contact->IsDeveloper = pDeveloperRadio->GetSelection() > 0;
 
        return TRUE;
 }  // CeditorDlg::GetData()
 
        return TRUE;
 }  // CeditorDlg::GetData()
@@ -1139,8 +1156,6 @@ bool CeditorDlg::Save()
                failed = TRUE;
 
        // Perform any other required validations necessary before saving
                failed = TRUE;
 
        // Perform any other required validations necessary before saving
-
-
        if (!failed)
        {
                wxBeginBusyCursor();
        if (!failed)
        {
                wxBeginBusyCursor();
@@ -1207,11 +1222,16 @@ bool CeditorDlg::GetNextRec()
 {
        wxString w;
 
 {
        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 += "'";
 
        w += Contact->Name;
        w += "'";
 
@@ -1238,11 +1258,16 @@ bool CeditorDlg::GetPrevRec()
 {
        wxString w;
 
 {
        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 += "'";
 
        w += Contact->Name;
        w += "'";
 
@@ -1269,7 +1294,7 @@ bool CeditorDlg::GetRec(char *whereStr)
 {
        Contact->where = whereStr;
        Contact->orderBy = "NAME";
 {
        Contact->where = whereStr;
        Contact->orderBy = "NAME";
-       
+
        if (!Contact->Query())
        {
                wxString tStr;
        if (!Contact->Query())
        {
                wxString tStr;
@@ -1296,10 +1321,12 @@ bool CeditorDlg::GetRec(char *whereStr)
  */
 
 BEGIN_EVENT_TABLE(CparameterDlg, wxDialog)
  */
 
 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()
 
     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
 {
        // 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");
 
        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");
 
        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()
 
 
 }  // Cparameter::OnCloseWindow()
 
 
+void CparameterDlg::OnButton( wxCommandEvent &event )
+{
+  wxWindow *win = (wxWindow*) event.GetEventObject();
+  OnCommand( *win, event );
+}
+
 void CparameterDlg::OnCommand(wxWindow& win, wxCommandEvent& event)
 {
        wxString widgetName;
 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);
        pParamODBCSourceList->SetStringSelection(wxGetApp().params.ODBCSource);
        pParamUserNameTxt->SetValue(wxGetApp().params.UserName);
        pParamPasswordTxt->SetValue(wxGetApp().params.Password);
+       pParamDirPathTxt->SetValue(wxGetApp().params.DirPath);
        return TRUE;
 }  // CparameterDlg::PutData()
 
        return TRUE;
 }  // CparameterDlg::PutData()
 
@@ -1437,6 +1474,17 @@ bool CparameterDlg::GetData()
                return FALSE;
        }
        strcpy(wxGetApp().params.Password,tStr);
                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()
 
        return TRUE;
 }  // CparameterDlg::GetData()
 
@@ -1465,6 +1513,8 @@ bool CparameterDlg::Save()
        fputc('\n', paramFile);
        fputs(wxGetApp().params.Password, paramFile);
        fputc('\n', paramFile);
        fputc('\n', paramFile);
        fputs(wxGetApp().params.Password, paramFile);
        fputc('\n', paramFile);
+       fputs(wxGetApp().params.DirPath, paramFile);
+       fputc('\n', paramFile);
        fclose(paramFile);
 
        return TRUE;
        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);
        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
        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();
        }
 
        GetParent()->SetFocus();
-       wxEndBusyCursor();
+       while (wxIsBusy())
+               wxEndBusyCursor();
 
        this->Destroy();
 
 
        this->Destroy();
 
@@ -1990,7 +2052,7 @@ void CqueryDlg::ProcessCountBtn()
 
        if (dbTable == 0)  // wxTable object needs to be created and opened
        {
 
        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;
                {
                        wxMessageBox("Memory allocation failed creating a wxTable object.","Error...",wxOK | wxICON_EXCLAMATION);
                        return;
index b6d1bd6ea34501c7ee6e6b40b0fe12ac872fa18e..2a18570f9bbe220dbe58ba40003395a2f24fefbe 100644 (file)
@@ -40,10 +40,10 @@ enum Language {langENGLISH, langFRENCH, langGERMAN, langSPANISH, langOTHER};
 class CeditorDlg;
 class CparameterDlg;
 
 class CeditorDlg;
 class CparameterDlg;
 
-#ifdef __WXGTK__
-const char paramFilename[] = "../database.cfg";
+#ifdef __UNIX__
+const char paramFilename[] = "../dbtest.cfg";
 #else
 #else
-const char paramFilename[] = "database.cfg";
+const char paramFilename[] = "dbtest.cfg";
 #endif
 
 
 #endif
 
 
@@ -102,6 +102,7 @@ typedef struct Cparameters
        char    ODBCSource[100+1];
        char    UserName[25+1];
        char    Password[25+1];
        char    ODBCSource[100+1];
        char    UserName[25+1];
        char    Password[25+1];
+       char    DirPath[MAX_PATH+1];
 } Cparameters;
 
 
 } Cparameters;
 
 
@@ -236,14 +237,15 @@ class CparameterDlg : public wxDialog
 
                // Pointers to all widgets on the dialog
                wxStaticText    *pParamODBCSourceMsg;
 
                // 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);
 
        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
 
                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_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 ***************************
 
 
 // *************************** CqueryDlg ***************************
 
index 574bab36be349ffab39474c25a313c48f95a07d8..a47e6a38757f700e8043cbedc0502102b5bb0d9e 100644 (file)
@@ -56,6 +56,8 @@
 
 #include <wx/dbtable.h>
 
 
 #include <wx/dbtable.h>
 
+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
 #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;
 
 
 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 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);
 {
 
        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)
 
 // 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;
 
 {
        int i = 0;
 
@@ -101,6 +160,13 @@ Clookup2::Clookup2(char *tblName, char *colName1, char *colName2, wxDB *pDb)
 }  // Clookup2()
 
 
 }  // 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))
 // 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);
        {
                wxString tStr;
                tStr.Printf("Unable to open the table '%s'.",tableName);
+               tStr += GetExtendedDBErrorMsg2(__FILE__,__LINE__);
                wxMessageBox(tStr,"ODBC Error...");
                Close();
                return;
                wxMessageBox(tStr,"ODBC Error...");
                Close();
                return;
@@ -329,7 +396,7 @@ ClookUpDlg::ClookUpDlg(wxWindow *parent, char *windowTitle, char *tableName,
 }  // Generic lookup constructor 2
 
 
 }  // Generic lookup constructor 2
 
 
-bool ClookUpDlg::OnClose(void)
+void ClookUpDlg::OnClose(wxCloseEvent& event)
 {
        widgetPtrsSet = FALSE;
        GetParent()->Enable(TRUE);
 {
        widgetPtrsSet = FALSE;
        GetParent()->Enable(TRUE);
@@ -340,11 +407,20 @@ bool ClookUpDlg::OnClose(void)
                delete lookup2;
 
        wxEndBusyCursor();
                delete lookup2;
 
        wxEndBusyCursor();
-       return TRUE;
+   event.Skip();
+
+//     return TRUE;
 
 }  // ClookUpDlg::OnClose
 
 
 
 }  // 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();
 void ClookUpDlg::OnCommand(wxWindow& win, wxCommandEvent& event)
 {
        wxString widgetName = win.GetName();
index 440ad92f3b8bbe57ae23bdc47a4294f26dd12f2b..fb64588a42fed9d82eb7bcdfa2e77645d0c48a0e 100644 (file)
@@ -112,9 +112,12 @@ class ClookUpDlg : public wxDialog
                                          wxDB                  *pDb = READONLY_DB,             // Database connection pointer
                                          bool           allowOk                = TRUE);                // is the OK button enabled
 
                                          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);
                void            OnCommand(wxWindow& win, wxCommandEvent& event);
-               bool            OnClose();
+               void            OnClose(wxCloseEvent& event);
                void            OnActivate(bool) {};  // necessary for hot keys
                void            OnActivate(bool) {};  // necessary for hot keys
+
+DECLARE_EVENT_TABLE()
 };
 
 #define LOOKUP_DIALOG                   500
 };
 
 #define LOOKUP_DIALOG                   500
index e1243b6d30664bab8d5f42048acfb21c7f0fbcde..b0b4859e316db40a22a7e511d51104d231d7a150 100644 (file)
@@ -10,6 +10,8 @@
 
 # Set WXDIR for your system
 WXDIR = $(WXWIN)
 
 # 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
 
 PROGRAM=dbtest
 OBJECTS = $(PROGRAM).obj listdb.obj