PlanetSquires Forums

Support Forums => Other Software and Code => Topic started by: Mark Strickland on January 20, 2006, 05:06:56 PM

Title: This code corrupts memory --- why?
Post by: Mark Strickland on January 20, 2006, 05:06:56 PM
Paul posted some skeleton code a while back to catch mouse clicks in a ListView.  I use the basic structure here.  I have been having Cheetah problems and this is the chunk of code that causes the problem.  No mouse click on the ListView then all is OK.  One click on the ListView and some of the code (in other areas -- button clicks,etc) on this form acts weird.  If you do things on the form without clicking on the ListView everything seems to work OK.

I am going guess it has something to do with the pointer to the structure:

pNMLV

Thanks.



FUNCTION FormDDinfoEdit_CUSTOM ( _
                            hWndForm      AS DWORD, _  ' handle of Form
                            wMsg          AS LONG,  _  ' type of message
                            wParam        AS DWORD, _  ' first message parameter
                            lParam        AS LONG   _  ' second message parameter
                            ) AS LONG
                           
   DIM row     AS LONG
   DIM c       AS STRING
   DIM c1      AS STRING
   DIM c2      AS STRING
   DIM v       AS STRING
   DIM LookFor AS STRING
   DIM x       AS STRING
   DIM stat    AS LONG
   DIM hDb     AS LONG
   DIM hIdx    AS LONG
   DIM fld     AS LONG
   
   LOCAL pNMLV AS NM_LISTVIEW PTR

   'Process mouse clicks from ListView
   SELECT CASE wMsg
   
       CASE %WM_NOTIFY
           pNMLV = lParam
         
           SELECT CASE @pNMLV.hdr.idfrom
         
               CASE IDC_FormDDinfoEdit_LISTVIEW1      :'notify message from the listview control
                   
                   SELECT CASE @pNMLV.hdr.code

                       CASE %NM_CLICK                 :'left click
                           row = FF_LISTVIEW_GETSELECTEDITEM (HWND_FormDDinfoEdit_LISTVIEW1)
                           c = FF_LISTVIEW_GETITEMTEXT (HWND_FormDDinfoEdit_LISTVIEW1, row, 1)
                           IF LEN(c) > 7 THEN
                               c = LEFT$(c,7) :'This is mirror so we flip flop codes
                               c2 = LSET$(PARSE$(c,"+",1),3)
                               c1 = LSET$(PARSE$(c,"+",2),3)
                           ELSE
                               c1 = LSET$(PARSE$(c,"+",1),3)
                               c2 = LSET$(PARSE$(c,"+",2),3)
                           END IF
                           c = c1 + c2
                           stat = xdbSeek&(hDBF_DDIINFO, hIDX_DDIINFO_IDX, c)
                           IF stat = %false THEN
                               stat = MESSAGEBOX(hWndForm, "DDINFO Record Not Found" + $CRLF + _
                                      "(" + c + ")", "ERROR", %mb_rxok)
                               v = ""
                           ELSE
                               v = xdbFieldValue$ (hDBF_DDIINFO,"",%DDIINFO_DDIINFO)
                           END IF
                           IF row > -1 AND FF_CONTROL_GETCHECK (HWND_FormDDinfoEdit_CHECK1) = 0 THEN
                               FF_TEXTBOX_SETTEXT (HWND_FormDDinfoEdit_TXTCODE1, c1)
                               FF_TEXTBOX_SETTEXT (HWND_FormDDinfoEdit_TXTCODE2, c2)
                               FF_CONTROL_SETTEXT (HWND_FORMDDINFOEDIT_LABELCODE1HIDDEN, c1)  :'save for later (avoids global)
                               FF_CONTROL_SETTEXT (HWND_FORMDDINFOEDIT_LABELCODE2HIDDEN, c2)
                               FF_TEXTBOX_SETTEXT (HWND_FormDDinfoEdit_TXTVALUE, v)
                               FF_CONTROL_SETTEXT (HWND_FormDDinfoEdit_BTNUPDATELIST, "Update (" + c1 + "+" + c2 + ") (alt-&S)")

                               LookFor = C1
                               SELECT CASE LEFT$(LookFor,1)
                                   CASE "m"
                                       hDb  = hDBF_MCCCD
                                       hIdx = hIDX_MCCCD_IDX
                                       fld  = %MCCCD_MCCDESC
                                   CASE "a"
                                       hDb  = hDBF_MCACD
                                       hIdx = hIDX_MCACD_IDX
                                       fld  = %MCACD_MCADESC
                                   CASE ELSE
                                       hDb  = hDBF_DDICD
                                       hIdx = hIDX_DDICD_IDX
                                       fld  = %DDICD_DDIDESC
                               END SELECT
                               stat = xdbSeek(hDb, hIdx, LookFor)
                               IF stat = %true THEN
                                   x = xdbFieldValue$ (hDb,"",fld)
                                   FF_CONTROL_SETTEXT (HWND_FORMDDINFOEDIT_LABELCODE1, x)
                               ELSE
                                   FF_CONTROL_SETTEXT (HWND_FORMDDINFOEDIT_LABELCODE1, "Code NOT On File")
                               END IF
                               
                               LookFor = C2
                               SELECT CASE LEFT$(LookFor,1)
                                   CASE "m"
                                       hDb  = hDBF_MCCCD
                                       hIdx = hIDX_MCCCD_IDX
                                       fld  = %MCCCD_MCCDESC
                                   CASE "a"
                                       hDb  = hDBF_MCACD
                                       hIdx = hIDX_MCACD_IDX
                                       fld  = %MCACD_MCADESC
                                   CASE ELSE
                                       hDb  = hDBF_DDICD
                                       hIdx = hIDX_DDICD_IDX
                                       fld  = %DDICD_DDIDESC
                               END SELECT
                               stat = xdbSeek(hDb, hIdx, LookFor)
                               IF stat = %true THEN
                                   x = xdbFieldValue$ (hDb,"",fld)
                                   FF_CONTROL_SETTEXT (HWND_FORMDDINFOEDIT_LABELCODE2, x)
                               ELSE
                                   FF_CONTROL_SETTEXT (HWND_FORMDDINFOEDIT_LABELCODE2, "Code NOT On File")
                               END IF
                               
                           ELSE
                               FF_CONTROL_SETTEXT (HWND_FormDDinfoEdit_BTNUPDATELIST, "Insert New Code (alt-&S)")
                               FF_TEXTBOX_SETTEXT (HWND_FormDDinfoEdit_TXTCODE1, "")
                               FF_TEXTBOX_SETTEXT (HWND_FormDDinfoEdit_TXTCODE2, "")
                               FF_CONTROL_SETTEXT (HWND_FORMDDINFOEDIT_LABELCODE1HIDDEN, "")  :'clear (avoids global)
                               FF_CONTROL_SETTEXT (HWND_FORMDDINFOEDIT_LABELCODE2HIDDEN, "")
                               FF_TEXTBOX_SETTEXT (HWND_FormDDinfoEdit_TXTVALUE, "")
                           END IF
                           
                           '??? FF_CONTROL_SETFOCUS (HWND_FormDDinfoEdit_TXTCODE1)

                       CASE %NM_DBLCLK                :'left double-click
                           row = FF_LISTVIEW_GETSELECTEDITEM (HWND_FormDDinfoEdit_LISTVIEW1)
                           c = FF_LISTVIEW_GETITEMTEXT (HWND_FormDDinfoEdit_LISTVIEW1, row, 1)
                           IF LEN(c) > 7 THEN
                               c = LEFT$(c,7) :'This is mirror so we flip flop codes
                               c2 = LSET$(PARSE$(c,"+",1),3)
                               c1 = LSET$(PARSE$(c,"+",2),3)
                           ELSE
                               c1 = LSET$(PARSE$(c,"+",1),3)
                               c2 = LSET$(PARSE$(c,"+",2),3)
                           END IF
                           c = c1 + c2
                           stat = xdbSeek&(hDBF_DDIINFO, hIDX_DDIINFO_IDX, c)
                           IF stat = %false THEN
                               stat = MESSAGEBOX(hWndForm, "DDINFO Record Not Found" + $CRLF + _
                                      "(" + c + ")", "ERROR", %mb_rxok)
                               v = ""
                           ELSE
                               v = xdbFieldValue$ (hDBF_DDIINFO,"",%DDIINFO_DDIINFO)
                           END IF
                           IF row > -1 AND FF_CONTROL_GETCHECK (HWND_FormDDinfoEdit_CHECK1) = 0 THEN
                               FF_TEXTBOX_SETTEXT (HWND_FormDDinfoEdit_TXTCODE1, c1)
                               FF_TEXTBOX_SETTEXT (HWND_FormDDinfoEdit_TXTCODE2, c2)
                               FF_CONTROL_SETTEXT (HWND_FORMDDINFOEDIT_LABELCODE1HIDDEN, c1)  :'save for later (avoids global)
                               FF_CONTROL_SETTEXT (HWND_FORMDDINFOEDIT_LABELCODE2HIDDEN, c2)
                               FF_TEXTBOX_SETTEXT (HWND_FormDDinfoEdit_TXTVALUE, v)
                               FF_CONTROL_SETTEXT (HWND_FormDDinfoEdit_BTNUPDATELIST, "Update (" + c1 + "+" + c2 + ") (alt-&S)")

                               LookFor = C1
                               SELECT CASE LEFT$(LookFor,1)
                                   CASE "m"
                                       hDb  = hDBF_MCCCD
                                       hIdx = hIDX_MCCCD_IDX
                                       fld  = %MCCCD_MCCDESC
                                   CASE "a"
                                       hDb  = hDBF_MCACD
                                       hIdx = hIDX_MCACD_IDX
                                       fld  = %MCACD_MCADESC
                                   CASE ELSE
                                       hDb  = hDBF_DDICD
                                       hIdx = hIDX_DDICD_IDX
                                       fld  = %DDICD_DDIDESC
                               END SELECT
                               stat = xdbSeek(hDb, hIdx, LookFor)
                               IF stat = %true THEN
                                   x = xdbFieldValue$ (hDb,"",fld)
                                   FF_CONTROL_SETTEXT (HWND_FORMDDINFOEDIT_LABELCODE1, x)
                               ELSE
                                   FF_CONTROL_SETTEXT (HWND_FORMDDINFOEDIT_LABELCODE1, "Code NOT On File")
                               END IF
                               
                               LookFor = C2
                               SELECT CASE LEFT$(LookFor,1)
                                   CASE "m"
                                       hDb  = hDBF_MCCCD
                                       hIdx = hIDX_MCCCD_IDX
                                       fld  = %MCCCD_MCCDESC
                                   CASE "a"
                                       hDb  = hDBF_MCACD
                                       hIdx = hIDX_MCACD_IDX
                                       fld  = %MCACD_MCADESC
                                   CASE ELSE
                                       hDb  = hDBF_DDICD
                                       hIdx = hIDX_DDICD_IDX
                                       fld  = %DDICD_DDIDESC
                               END SELECT
                               stat = xdbSeek(hDb, hIdx, LookFor)
                               IF stat = %true THEN
                                   x = xdbFieldValue$ (hDb,"",fld)
                                   FF_CONTROL_SETTEXT (HWND_FORMDDINFOEDIT_LABELCODE2, x)
                               ELSE
                                   FF_CONTROL_SETTEXT (HWND_FORMDDINFOEDIT_LABELCODE2, "Code NOT On File")
                               END IF
                               
                           ELSE
                               FF_CONTROL_SETTEXT (HWND_FormDDinfoEdit_BTNUPDATELIST, "Insert New Code (alt-&S)")
                               FF_TEXTBOX_SETTEXT (HWND_FormDDinfoEdit_TXTCODE1, "")
                               FF_TEXTBOX_SETTEXT (HWND_FormDDinfoEdit_TXTCODE2, "")
                               FF_CONTROL_SETTEXT (HWND_FORMDDINFOEDIT_LABELCODE1HIDDEN, "")  :'clear (avoids global)
                               FF_CONTROL_SETTEXT (HWND_FORMDDINFOEDIT_LABELCODE2HIDDEN, "")
                               FF_TEXTBOX_SETTEXT (HWND_FormDDinfoEdit_TXTVALUE, "")
                           END IF
                           
                           '??? FF_CONTROL_SETFOCUS (HWND_FormDDinfoEdit_TXTCODE1)


                       CASE %NM_RCLICK                :'right click

                       CASE %NM_RDBLCLK               :'right double-click

                   END SELECT
                   
           END SELECT                    

   END SELECT

END FUNCTION

Title: This code corrupts memory --- why?
Post by: TechSupport on January 20, 2006, 05:49:50 PM
I just read the Cheetah discussion in the other forum. I haven't had time to look into it further.

Nothing seems strange with the code you posted. If it was a pointer problem then your app would have GPF'd when attempting to access a null pointer.

In your posted code, you could try commenting out all the Cheetah function calls. Run your code and try clicking on the ListView. If it does not cause problems then maybe it is the Cheetah code in the ListView handler that is causing a problem. If the problem still exists then we can zero in on the ListView code instead.
Title: This code corrupts memory --- why?
Post by: Roger Garstang on January 21, 2006, 06:35:26 PM
I didn't scan 100% of the code, but from experiences with data or arrays and listviews, etc.  You have to check everything.  Just scanning I see a check for -1, but you have to make sure every possible angle is checked and no possible way for an index to go out of range/bounds.  I made an app once where entries were added and deleted, selected and unselected, etc and data was constantly updated with ownerdata and a master array read from.  -1 and 0 caused all kinds of problems.  when deleting it sometimes kept the current item selected as another item no longer there until clicking again, or when clicking it may deselect and cause -1 or 0 to be returned, etc.  You have to go through every possible case and be sure to check for valid values.  Like Paul said it usually will GPF unless you have Debug on though.  Sometimes though it may slip by without a GPF but give unpredictable results.  If things draw funny or icons are wrong, etc it is a good chance something went wrong and memory got corrupted.