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
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.
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.