What event do I trap in a SuperClassed edit box to keep it from losing focus until it matches a validation if the user clicks in another field?
Bob Mechler
Bob Mechler
CASE %WM_KILLFOCUS Tlen = GetWindowTextLength(CBHNDL) 'get the text length IF Tlen < FieldLen(getdlgctrlid(CBHNDL)) THEN ShowBallonText GetParent(CBHNDL), CBHNDL, "Account field is required" SetFocus CBHNDL EXIT FUNCTION 'stay in field until there is a valid account END IF
CASE %ID_FILENAME ' check if the file is avaiable and no worker thread is running already, ' if so enable the start button [b]IF CBCTLMSG = %EN_CHANGE THEN[/b] DIALOG GET USER CBHNDL, %DSU_HTHREAD TO hThread IF ISFALSE hThread THEN ' no worker thread is running, so we can enable ' the 'go' button if this file is valid CONTROL GET TEXT CBHNDL, %ID_FILENAME TO sText IF DIR$ (sText) > "" THEN CONTROL ENABLE CBHNDL, %ID_START ELSE CONTROL DISABLE CBHNDL, %ID_START END IF END IF END IF
IF CBWPARAM = %VK_UP OR (CBWPARAM = %VK_TAB AND GetAsyncKeyState(%VK_SHIFT)) THEN SetFocus GetNextDlgTabItem(GetParent(CBHNDL), CBHNDL, -1) ELSE SetFocus GetNextDlgTabItem(GetParent(CBHNDL), CBHNDL, 0) END IF EXIT FUNCTION
GLOBAL F_F1 AS LONG FUNCTION NEditActnrF1Lookup(txtACTNR AS STRING,FileEquate AS LONG) AS STRING BTRVSETUP QF = 5: Q = FileEquate: Q$(Q) = TRIM$(txtACTNR): QNUM = 0: GOSUB 60000 IF QSTATUS = 0 THEN sTxt = F1.ACTNR$ ELSE sTxt = "" END IF FUNCTION = sTxt EXIT FUNCTION 60000 #INCLUDE "BTRVCALX.INC" END FUNCTION CALLBACK FUNCTION NEditActnrProc STATIC OldProc AS LONG, OffsetWndExtra AS LONG LOCAL V_NKEYPOS AS LONG,sTXT AS STRING,Txt AS ASCIIZ * %MAX_PATH, zfName AS ASCIIZ * %MAX_PATH LOCAL ValidActnrKeys AS STRING,FieldId as LONG LOCAL ActnrID AS LONG, DescID AS LONG, DescHandle AS LONG DIM Tlen AS LOCAL LONG ValidActnrKeys$ = " 0123456789" + CHR$(8) ValidActnrKeysAbbrev$ = "Entry must be 7 digits [0-9]" IF CBHNDL = 0 THEN OldProc = CBWPARAM: OffsetWndExtra = CBLPARAM: EXIT FUNCTION 'Control Id and Handle of ACTNR ActnrID& = getdlgctrlid(CBHNDL) 'Control Id and Handle of Read Only field displaying the F1.ACTNAM DescID& = ActnrID& + scr_NUM_FLD# DescHandle& = GetDlgItem(GetParent(CBHNDL),DescID&) SELECT CASE CBMSG CASE %WM_GETDLGCODE FUNCTION = %DLGC_WANTALLKEYS: EXIT FUNCTION CASE %WM_KEYUP CONTROL SEND GetParent(CBHNDL),ActnrID&, %EM_GETSEL, 0, 0 TO V_NKEYPOS& 'Used to detect when field is filled IF LOWRD(V_NKEYPOS&) = FieldLen(ActnrID&) THEN GetWindowText CBHNDL, Txt, %MAX_PATH sTxt = Txt sTxt = NEditActnrF1Lookup(sTxt,F_F1&) 'Returns the Account or blank if it is not on file IF LEN(TRIM$(sTxt)) = 0 THEN 'ShowBallonText GetParent(CBHNDL), CBHNDL, "Account is not on file" 'CONTROL SHOW STATE GetParent(CBHNDL),%ER_MSG,%SW_SHOW ' CONTROL SET TEXT GetParent(CBHNDL),%ER_MSG,"Account is not on file" 'SLEEP 1000 'CONTROL SHOW STATE GetParent(CBHNDL),%ER_MSG,%SW_HIDE 'EXIT FUNCTION ' stay in field until a valid CUSIP is found or the user presses enter with the field empty END IF SetWindowText CBHNDL, BYCOPY F1.ACTNR SetWindowText DescHandle&, BYCOPY F1.ACTNAM SetFocus GetNextDlgTabItem(GetParent(CBHNDL), CBHNDL, 0) 'all ok, move to the next field EXIT FUNCTION END IF IF GetWindowTextLength(CBHNDL) = 0 THEN 'handles the case where the field contents become zero during editing SetWindowText DescHandle&,"" END IF CASE %WM_KEYDOWN SELECT CASE CBWPARAM CASE %VK_UP,%VK_DOWN,%VK_RETURN,%VK_TAB Tlen = GetWindowTextLength(CBHNDL) 'get the text length IF Tlen = FieldLen(ActnrID&) THEN GetWindowText CBHNDL, Txt, %MAX_PATH sTxt = Txt sTxt = NEditActnrF1Lookup(sTxt,F_F1&) IF LEN(TRIM$(sTxt)) = 0 THEN 'Field however modified is valid, fill in the description field also 'ShowBallonText GetParent(CBHNDL), CBHNDL, "Account is not on file" 'CONTROL SHOW STATE GetParent(CBHNDL),%ER_MSG,%SW_SHOW 'CONTROL SET TEXT GetParent(CBHNDL),%ER_MSG,"Account is not on file" 'SLEEP 1000 'CONTROL SHOW STATE GetParent(CBHNDL),%ER_MSG,%SW_HIDE SetWindowText CBHNDL, "" SetWindowtext DescHandle&,"" 'EXIT FUNCTION ' stay in field until a valid CUSIP is found or the user presses enter with the field empty ELSE 'Field however modified is valid, fill in the description field also SetWindowText CBHNDL, BYCOPY F1.ACTNR SetWindowText DescHandle&, BYCOPY F1.ACTNAM END IF ELSE 'ShowBallonText GetParent(CBHNDL), CBHNDL, "Account field is required" 'CONTROL SHOW STATE GetParent(CBHNDL),%ER_MSG,%SW_SHOW 'CONTROL SET TEXT GetParent(CBHNDL),%ER_MSG,"Account field is required" 'SLEEP 1000 'CONTROL SHOW STATE GetParent(CBHNDL),%ER_MSG,%SW_HIDE 'EXIT FUNCTION 'stay in field until there is a valid account END IF IF CBWPARAM = %VK_UP OR (CBWPARAM = %VK_TAB AND GetAsyncKeyState(%VK_SHIFT)) THEN SetFocus GetNextDlgTabItem(GetParent(CBHNDL), CBHNDL, -1) ELSE SetFocus GetNextDlgTabItem(GetParent(CBHNDL), CBHNDL, 0) END IF EXIT FUNCTION CASE %VK_F 'find routine IF GetAsyncKeyState(%VK_CONTROL) THEN LSET C.INQ = "": LSET C.CSORT = CSORT$ SPARE$ = CPROGID$: LSET C.SPARE = SPARE$: C.LSPARE = LEN(SPARE$)': @pC = C PU_PROG$ = CPROGID$: LSET C.PU_PROG = PU_PROG$: @pC = C IF FNSP(CUST_DIR$) THEN SHELLPROG$ = "PUACCT.EXE " ELSE SHELLPROG$ = $STDEXE + "PUACCT.EXE " END IF DIALOG DISABLE GetParent(CBHNDL) Yinstance& = SHELL(SHELLPROG$ + COMMONLINK$) SLEEP 1000 Zprocessid& = OpenProcess(%PROCESS_QUERY_INFORMATION + %PROCESS_TERMINATE,%False,Yinstance&) DO DIALOG DOEVENTS I& = GetExitCodeProcess(BYVAL Zprocessid&,lpExitCode&) LOOP WHILE lpExitCode& = %STILL_ACTIVE DIALOG ENABLE GetParent(CBHNDL) DIALOG SHOW STATE hdlg,%SW_SHOW stat = GetCommon(C) INQACTNR$ = RTRIM$(INQ$) sTxt = INQACTNR$ 'same as if NEditActnrF1Lookup had been called IF LEN(TRIM$(sTxt)) = 0 THEN 'lookup cancelled go with field contents GetWindowText CBHNDL, Txt, %MAX_PATH sTxt = Txt END IF sTxt = NEditActnrF1Lookup(sTxt,F_F1&) IF LEN(TRIM$(sTxt)) = 0 THEN 'Field however modified is valid, fill in the description field also 'ShowBallonText GetParent(CBHNDL), CBHNDL, "Account is not on file" 'CONTROL SHOW STATE GetParent(CBHNDL),%ER_MSG,%SW_SHOW 'CONTROL SET TEXT GetParent(CBHNDL),%ER_MSG,"Account is not on file" 'SLEEP 1000 'CONTROL SHOW STATE GetParent(CBHNDL),%ER_MSG,%SW_HIDE SetWindowText CBHNDL, "" SetWindowtext DescHandle&,"" 'EXIT FUNCTION ' stay in field until a valid account is found ELSE 'Field has a valid value from the lookup, fill fields and proceed to the next tab stop SetWindowText CBHNDL, BYCOPY F1.ACTNR SetWindowText DescHandle&, BYCOPY F1.ACTNAM SetFocus GetNextDlgTabItem(GetParent(CBHNDL), CBHNDL, 0) EXIT FUNCTION END IF END IF CASE %VK_INSERT IF NOT V_INSOVR THEN V_INSOVR = -1 SetWindowText GetParent(CBHNDL),"OVR" ELSEIF V_INSOVR THEN V_INSOVR = 0 SetWindowText GetParent(CBHNDL),"INS" END IF END SELECT CASE %WM_CHAR IF INSTR(ValidActnrKeys$,CHR$(CBWPARAM)) = 0 THEN IF CBWPARAM > 32 THEN ShowBallonText GetParent(CBHNDL), CBHNDL, ValidActnrKeysAbbrev$ 'CONTROL SHOW STATE GetParent(CBHNDL),%ER_MSG,%SW_SHOW 'CONTROL SET TEXT GetParent(CBHNDL),%ER_MSG,ValidActnrKeysAbbrev$ 'SLEEP 1000 'CONTROL SHOW STATE GetParent(CBHNDL),%ER_MSG,%SW_HIDE END IF END IF IF INSTR(ValidActnrKeys$,CHR$(CBWPARAM)) = 0 THEN EXIT FUNCTION KeyState = GetAsyncKeyState(%VK_OEM_MINUS) OR GetAsyncKeyState(%VK_OEM_PLUS) IF INSTR("+-",CHR$(CBWPARAM)) > 0 AND KeyState <> &H8001 THEN EXIT FUNCTION IF V_INSOVR THEN SendMessage CBHNDL, %EM_GETSEL, 0, 0 TO V_NKEYPOS& 'Used to detect when field is filled V_NKEYPOS& = LOWRD(V_NKEYPOS&) SendMessage CBHNDL, %EM_SETSEL,V_NKEYPOS&,V_NKEYPOS& + 1 'Selects current character SendMessage CBHNDL, %WM_CLEAR,0,0 'If nothing to clear doesn't act END IF CASE %WM_SETFOCUS SendMessage CBHNDL, %EM_SETSEL, 0, -1 CASE %WM_KILLFOCUS ' Tlen = GetWindowTextLength(CBHNDL) 'get the text length ' IF Tlen < FieldLen(ActnrID&) AND Tlen > 0 THEN ' ShowBallonText GetParent(CBHNDL), CBHNDL, "WARNING! Account was not found." ' ELSEIF Tlen = 0 THEN ' ShowBallonText GetParent(CBHNDL), CBHNDL, "WARNING! Account is required." ' END IF 'SetFocus CBHNDL ' ShowBallonText GetParent(CBHNDL), CBHNDL, "Account not found" ' DIALOG GET SIZE GetParent(CBHNDL) TO tot_x&,tot_y& ' DIALOG GET CLIENT GetParent(CBHNDL) TO cli_x&,cli_y& ' DIALOG UNITS GetParent(CBHNDL),tot_x& - cli_x&,tot_y& - cli_y& TO PIXELS non_client_x&,non_client_y& ' DIALOG GET LOC GetParent(CBHNDL) TO MOUSE_X&,MOUSE_Y& ' DIALOG UNITS GetParent(CBHNDL), MOUSE_X&,MOUSE_Y& TO PIXELS P_MOUSE_X&,P_MOUSE_Y& ' CONTROL GET LOC GetParent(CBHNDL),ActnrID& TO TV_X&,TV_Y& ' DIALOG UNITS GetParent(CBHNDL), TV_X&,TV_Y& TO PIXELS P_TV_X&,P_TV_Y& ' SetCursorPos P_MOUSE_X& + P_TV_X& + 10, P_MOUSE_Y& + P_TV_Y& + non_client_y& + 9 ' EXIT FUNCTION 'stay in field until there is a valid account ' ELSEIF Tlen = 0 THEN ' ShowBallonText GetParent(CBHNDL), CBHNDL, "Account field is required" ' END IF END SELECT FUNCTION = CallWindowProc(OldProc, CBHNDL, CBMSG, CBWPARAM, CBLPARAM) END FUNCTION CALLBACK FUNCTION NActnrButtonProc STATIC OldProc AS LONG, OffsetWndExtra AS LONG LOCAL Txt AS ASCIIZ * %MAX_PATH, sTxt AS STRING LOCAL ActnrButtonID AS LONG, ActnrID AS LONG, DescID AS LONG LOCAL ActnrHandle AS LONG, DescHandle AS LONG IF CBHNDL = 0 THEN OldProc = CBWPARAM: OffsetWndExtra = CBLPARAM: EXIT FUNCTION ActnrButtonID& = getdlgctrlid(CBHNDL) ActnrID& = ActnrButtonID& - (scr_NUM_FLD# * 2 ) DescID& = ActnrButtonID& - scr_NUM_FLD# ActnrHandle& = GetDlgItem(GetParent(CBHNDL),ActnrID&) DescHandle& = GetDlgItem(GetParent(CBHNDL),DescID&) SELECT CASE CBMSG CASE %WM_LBUTTONDOWN LSET C.INQ = "": LSET C.CSORT = CSORT$ SPARE$ = CPROGID$: LSET C.SPARE = SPARE$: C.LSPARE = LEN(SPARE$) PU_PROG$ = CPROGID$: LSET C.PU_PROG = PU_PROG$: @pC = C IF FNSP(CUST_DIR$) THEN SHELLPROG$ = "PUACCT.EXE " ELSE SHELLPROG$ = $STDEXE + "PUACCT.EXE " END IF DIALOG DISABLE GetParent(CBHNDL) Yinstance& = SHELL(SHELLPROG$ + COMMONLINK$) SLEEP 1000 Zprocessid& = OpenProcess(%PROCESS_QUERY_INFORMATION + %PROCESS_TERMINATE,%False,Yinstance&) DO DIALOG DOEVENTS I& = GetExitCodeProcess(BYVAL Zprocessid&,lpExitCode&) LOOP WHILE lpExitCode& = %STILL_ACTIVE DIALOG ENABLE GetParent(CBHNDL) DIALOG SHOW STATE hdlg,%SW_SHOW stat = GetCommon(C) INQACTNR$ = RTRIM$(INQ$) sTxt = INQACTNR$ IF LEN(TRIM$(sTxt)) = 0 THEN GetWindowText ActnrHandle&,Txt,%MAX_PATH sTxt = Txt END IF sTxt = NEditActnrF1Lookup(sTxt,F_F1&) IF LEN(TRIM$(sTxt)) = 0 THEN 'Field however modified is valid, fill in the description field also ShowBallonText GetParent(CBHNDL), ActnrHandle&, "Account is not on file" 'CONTROL SHOW STATE GetParent(CBHNDL),%ER_MSG,%SW_SHOW 'CONTROL SET TEXT GetParent(CBHNDL),%ER_MSG,"Account is not on file" 'SLEEP 1000 'CONTROL SHOW STATE GetParent(CBHNDL),%ER_MSG,%SW_HIDE SetWindowText ActnrHandle&, "" SetWindowtext DescHandle&,"" EXIT FUNCTION ' stay in field until a valid account is found ELSE 'Field has a valid value from the lookup, fill fields and proceed to the next tab stop SetWindowText ActnrHandle&, BYCOPY F1.ACTNR SetWindowText DescHandle&, BYCOPY F1.ACTNAM SetFocus GetNextDlgTabItem(GetParent(CBHNDL),ActnrHandle&, 0) EXIT FUNCTION END IF END SELECT FUNCTION = CallWindowProc(OldProc, CBHNDL, CBMSG, CBWPARAM, CBLPARAM) END FUNCTION
DECLARE FUNCTION RealCallBack LIB "MyDLL.DLL" _ (BYVAL hwnd AS LONG, _ ByVAL usMSG AS LONG, BYVAL wParam AS LONG, _ BYVAL lParam AS LONG) AS LONG DIALOG NEW .... DIALOG SHOW hDlg.... CALL FunctionHere CALLBACK FUNCTION FunctionHere () AS LONG FUNCTION = RealCallBack (CBHNDL, CBMSG, CBWPARAM, CBLPARAM) END FUNCTION
CALLBACK FUNCTION RealCallback () EXPORT AS LONG END FUNCTION
We process personal data about users of our site, through the use of cookies and other technologies, to deliver our services, and to analyze site activity. For additional details, refer to our Privacy Policy.
By clicking "I AGREE" below, you agree to our Privacy Policy and our personal data processing and cookie practices as described therein. You also acknowledge that this forum may be hosted outside your country and you consent to the collection, storage, and processing of your data in the country where this forum is hosted.
Comment