home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-06-09 | 61.1 KB | 1,945 lines |
- {
- // Module Name: FORM_EXT.COD
- // Description: This module produces PROCEDURES & FUNCTIONS
- // used in form processing (for FORM.COD)
- //
- //----Modified 6/9/91 by Barry Fox, Fox Computer Consulting to allow
- // help support generation to proceed if database name is different
- // from form name. Will prompt user for database name to check for
- // existance of help dbf if no help dbf is found corresponding to
- // form name.
- //
- define screen_size()
- // Test screen size if display > 2 screen is 43 lines
- display = numset(_flgcolor)
- if display > ega25 then
- scrn_size = 39
- max_pop_row = 36
- else
- scrn_size = 21
- max_pop_row = 18
- endif
-
- // Test to see if status was off before going into form designer
- dB_status = numset(_flgstatus)
- if scrn_size == 21 and !db_status then
- scrn_size = 24
- max_pop_row = 21
- endif
- if scrn_size == 39 and !db_status then // status is off
- scrn_size = 42
- max_pop_row = 39
- endif
- return;
- enddef
-
- //--------------------------------------------------------------
- define display_type()
- // Find out the display type we are working on
- var temp;
- case display of
- mono: temp = "MONO"
- cga: temp = "COLOR"
- ega25: temp = "EGA25"
- mono43: temp = "MONO43"
- ega43: temp = "EGA43"
- endcase
- return temp;
- enddef
-
- //--------------------------------------------------------------
- define getcolor(f_display, // Color of the current field
- f_editable // Field is SAY or GET
- )
- // Determines the color from f_display and f_editable (GET or SAY)
- enum Foreground = 7,
- Intensity = 8, // Color
- Background = 112,
- MIntensity = 256,
- Reverse = 512, // Mono
- Underline =1024,
- Blink =2048,
- default =32768; // Screen set to default
-
- var forgrnd, enhanced, backgrnd, blnk, underln, revrse, use_colors, incolor;
- incolor=""
-
- use_colors = default & f_display
- forgrnd = Foreground & f_display
- enhanced = (Intensity & f_display) || (MIntensity & f_display)
- backgrnd = Background & f_display
- blnk = Blink & f_display
- underln = Underline & f_display
- revrse = Reverse & f_display
-
- if not use_colors then // Use system colors, no colors set in designer
-
- if backgrnd then backgrnd = backgrnd/16 endif
-
- if (display != mono and display != mono43) then
- case forgrnd of
- 0: incolor = "n"
- 1: incolor = "b"
- 2: incolor = "g"
- 3: incolor = "bg"
- 4: incolor = "r"
- 5: incolor = "rb"
- 6: incolor = "gr"
- 7: incolor = "w"
- endcase
- else
- incolor = "w"
- endif
-
- if revrse then
- incolor = incolor + "i"
- endif
- if underln then
- incolor = incolor + "u"
- endif
- if enhanced then
- incolor = incolor + "+"
- endif
- if blnk then
- incolor = incolor + "*"
- endif
-
- incolor = incolor + "/"
-
- if (display != mono and display != mono43) then
- case backgrnd of
- 0: incolor = incolor + "n"
- 1: incolor = incolor + "b"
- 2: incolor = incolor + "g"
- 3: incolor = incolor + "bg"
- 4: incolor = incolor + "r"
- 5: incolor = incolor + "rb"
- 6: incolor = incolor + "gr"
- 7: incolor = incolor + "w"
- endcase
- else
- incolor = incolor + "n"
- endif
-
- if f_editable and incolor then
- incolor = incolor + "," + incolor
- endif
-
- endif // use no colors
- return alltrim(incolor);
- enddef
-
- //--------------------------------------------------------------
- define outbox(mbox, // Border type
- mchar // Special character of border
- )
- // Output the of Box border and character if any
- var result;
- case mbox of
- 0: result = " " // single
- 1: result = " DOUBLE "
- 2: result = " CHR("+mchar+") "
- endcase
- return result;
- enddef
-
- //--------------------------------------------------------------
- define outcolor()
- // Output the of color of the @ SAY GET or Box
- var result;
- result = "";
- if len(color) > 0 then
- if color_flg then
- // If flag is set output a dBASE continuation ";"
- result = ";" + crlf + space(3)
- endif
- result = result + "COLOR " + color + " "
- endif
- return result;
- enddef
-
- //--------------------------------------------------------------
- define window_def(cur) // Pass in foreach cursor
- // Build dBASE window command
- var result;
- result = "wndow" + wnd_cnt + " FROM " + Box_Coordinates(cur)
- result = result + outbox(cur.BOX_TYPE, cur.BOX_SPECIAL_CHAR)
- color = getcolor(cur.FLD_DISPLAY, cur.FLD_EDITABLE)
- result = result + outcolor()
- return result;
- enddef
-
- //--------------------------------------------------------------
- define box_coordinates(cur) // Pass in foreach cursor
- // Build box coordinates for a dBASE window command
- var result, temp_page, line_cnt;
- temp_page = page_cnt;
-
- // Adjust box coordinates so that negative numbers are not generated
- do while ( nul2zero(cur.BOX_TOP) - (scrn_size * temp_page) ) <= 1
- temp_page = temp_page - 1
- enddo
- //-- Adjust "temp_page" for page 1 and 2
- if page_cnt == 1 then
- temp_page = 0
- endif
- if page_cnt == 2 then
- temp_page = 1
- endif
- //-------------------------
-
- if !temp_page then
- line_cnt = 0
- else
- line_cnt = (scrn_size * temp_page) + (1 * temp_page)
- endif
-
- result = nul2zero(cur.BOX_TOP) - line_cnt +","
- result = result + nul2zero(cur.BOX_LEFT) + " TO "
- temp = nul2zero(cur.BOX_TOP) + cur.BOX_HEIGHT - line_cnt - 1
- if temp > scrn_size then temp = scrn_size endif
- result = result + temp + "," + (nul2zero(cur.BOX_LEFT) + cur.BOX_WIDTH - 1)
- return result;
- enddef
-
- //--------------------------------------------------------------
- define carry_flds()
- // Build dBASE SET CARRY command
- carry_len = carry_lent = 13
- carry_first = 0
- foreach FLD_ELEMENT flds
- if FLD_CARRY then
- carry_len = carry_len + len(FLD_FIELDNAME + ",")
- carry_lent = carry_lent + len(FLD_FIELDNAME + ",")
- if carry_lent > 1000 then
- print(crlf + "SET CARRY TO ")
- carry_len = carry_lent = 13
- endif
- if carry_len > 75 then
- print(";" + crlf + " ")
- carry_len = 2
- endif
- temp = cap_first(FLD_FIELDNAME)
- if !carry_first then
- print(temp)
- carry_first = 1
- else
- print("," + temp)
- endif
- endif
- next flds
- print(" ADDITIVE");
- return
- enddef
-
- //--------------------------------------------------------------
- define picture_for_get(c)
- if c.FLD_PICFUN then}@{c.FLD_PICFUN}\
- { if at("S", c.FLD_PICFUN) then}{c.FLD_PIC_SCROLL}{endif}\
- {//leave this space}\
- { endif
- if at("M", c.FLD_PICFUN) then
- c.FLD_PIC_CHOICE}\
- { else
- c.FLD_TEMPLATE}\
- { endif
- return;
- enddef
-
- //--------------------------------------------------------------
- define picture_for_say(c)
- if c.FLD_PICFUN then}@{c.FLD_PICFUN}\
- { if at("S", c.FLD_PICFUN) then}{c.FLD_PIC_SCROLL}{endif}\
- {//leave this space}\
- { endif
- if !at("M", c.FLD_PICFUN) then
- c.FLD_TEMPLATE}\
- { endif
- return;
- enddef
-
- //--------------------------------------------------------------
- define ok_template(cur) // Pass in foreach cursor
- if cur.FLD_TEMPLATE && !(chr(cur.FLD_VALUE_TYPE) == "D" ||
- chr(cur.FLD_VALUE_TYPE) == "M") then
- return 1;
- else
- return 0;
- endif
- enddef
- //--------------------------------------------------------------
- define ok_coordinates(cur, // Current cursor
- xtra_width, // Additional width to check ie, shadow
- want_message, // Display message flag 0:No 1:Yes
- message) // Message to display to user
- // Check to see if coordinates of popup or shadow will fit on screen
- // based on the dimensions of the current field
- if nul2zero(cur.COL_POSITN) + len(cur.FLD_TEMPLATE) + xtra_width > screen_width then
- if want_message then
- beep(2) // UDF in builtin.def
- cls()
- say_center(10,"Error on Field: " + cur.FLD_FIELDNAME)
- say_center(12, message)
- pause(any_key)
- endif
- return 0;
- else
- return 1;
- endif
- enddef
-
- //--------------------------------------------------------------
- define make_program(ext)
- // Attempt to create program (fmt) file.
- ext = upper( ext)
- default_drv = strset(_defdrive) // grab default drive from dBASE
- fmt_name = FRAME_PATH + NAME // Put path on to object name
- if not fileok(fmt_name) then
- if not default_drv then
- fmt_name = NAME
- else
- fmt_name = default_drv + ":" + NAME
- endif
- endif
- fmt_name = upper(fmt_name)
- if not create(fmt_name + ext) then
- pause(fileroot(fmt_name) + ext + read_only + any_key)
- return 0;
- endif
- return 1;
- enddef
-
- //--------------------------------------------------------------
- define make_udf()
- // Attempt to create dBASE procedure (prg) file.
- var udf_root_file_name;
- udf_root_file_name = frame_path + "u_" + rtrim(substr(name,1,6))
- if not create( udf_root_file_name + ".PRG") then
- pause(udf_root_file_name + ".PRG" + read_only + any_key)
- return 0;
- endif
- // Force dBASE to recompile the .prg
- fileerase(udf_root_file_name + ".DBO")
- udf_file = 1 // Global flag to determine if UDF file was created
- return 1;
- enddef
-
- //--------------------------------------------------------------
- define udf_header()
- // Print Header in UDF program
- print("*"+replicate("-",78)+crlf);}
- *-- Name....: {frame_path}u_{rtrim(substr(name,1,6))}.PRG
- *-- Date....: {ltrim(SUBSTR(date(),1,8))}
- *-- Version.: dBASE IV, Procedures for Format (.fmt) v{Frame_ver}.1
- *-- Notes...: Procedure file for VALID POPUPs and/or Context Sensitive Help
- *-- ........: for {filename(fmt_name)}FMT
- {print("*"+replicate("-",78)+crlf);
- enddef
-
- //--------------------------------------------------------------
- define make_pop_code()
- var lookup_dbf, // store get_file(FLD_OK_COND) for faster processing
- is_format, // is there a format file
- temp_name, // store get_popname(FLD_OK_COND) for faster processing
- ;
- // temp_key; // store KEY field
-
- // Create the Procedure File for POPUP's if required
- if is_popup then
- // if !at("FORMBROW", upper(getenv("dtl_form"))) then
- if !make_udf() then
- return 0;
- endif
- udf_header()
- // endif
- if workarea_cnt <= max_workareas then
- }
- PROCEDURE S_{lower(substr(name,1,7))}{tabto(40)}&& Open Lookup files for faster processing
- { foreach FLD_ELEMENT flds
- if popup_or_browse(flds) then
- lookup_dbf = get_file(FLD_OK_COND)
- if not at(lookup_dbf, workarea_dbfs) then
- workarea_dbfs = workarea_dbfs + "," + lookup_dbf;
- }
- USE {lookup_dbf} ORDER {get_key(FLD_OK_COND)} IN SELECT() \
- { if (upper(lookup_dbf) == FLD_FILENAME) then}
- AGAIN ALIAS {"A"+substr(lookup_dbf,1,7)}
- { else}
- {//leave this space}
- { endif
- endif
- endif
- next flds;
- }
- RETURN
- *-- EOP: S_{lower(substr(name,1,7))}
-
- PROCEDURE C_{lower(substr(name,1,7))}{tabto(40)}&& Close Lookup files
- { workarea_dbfs = ""
- foreach FLD_ELEMENT flds
- if popup_or_browse(flds) then
- lookup_dbf = get_file(FLD_OK_COND);
- if not at(lookup_dbf, workarea_dbfs) then
- workarea_dbfs = workarea_dbfs + "," + lookup_dbf;
- }
- USE IN ALIAS("{ upper(lookup_dbf) == FLD_FILENAME ? "A"+substr(lookup_dbf,1,7) : lookup_dbf }")
- { endif
- endif
- next flds;
- endif
- }
- RETURN
- *-- EOP: C_{lower(substr(name,1,7))}
-
- FUNCTION Empty && Determine if the passed argument is NULL
- {lmarg(offset)}
- PARAMETER x
- PRIVATE retval, lc_type
- lc_type = TYPE("x")
- DO CASE
- CASE lc_type = "C"
- retval = (LEN(TRIM(x))=0)
- CASE lc_type$"NF"
- retval = (x=0)
- CASE lc_type = "D"
- retval = (" "$DTOC(x))
- OTHERWISE lc_type = "U"
- retval = .T.
- ENDCASE
- {lmarg(0)}
- RETURN (retval)
- *-- EOP: _Empty
-
- {print("*"+replicate("-",78)+crlf);}
- PROCEDURE _DbfEmpty
- *-- Error box if Lookup .dbf is empty
- *-- Save the screen and setup window
- PRIVATE ALL LIKE l?_*
- DEFINE WINDOW u_error FROM 5,15 TO 11,55
- SAVE SCREEN TO u_error
- DO _Shadowg WITH 5,15,11,55
-
- *-- Activate the window and put up error message
- ACTIVATE WINDOW u_error
- lc_fpath = SET("fullpath")
- SET FULLPATH OFF
- @ 1,2 SAY "Lookup table: " + SUBSTR( DBF(),3) + " is empty!"
- @ 2,2 SAY "{any_key}"
- ln_errorky = INKEY(10)
-
- *-- Restore the screen and clean up
- SET FULLPATH &lc_fpath.
- RELEASE WINDOW u_error
- RESTORE SCREEN FROM u_error
- RELEASE SCREEN u_error
- RETURN
- *-- EOP: _DbfEmpty
-
- {
- line_cnt = 0
- page_cnt = 1
-
- foreach FLD_ELEMENT flds
-
- at_pop = at("POPUP", upper(ltrim(FLD_OK_COND))) == "2" ? 1 : 0;
-
- new_page(flds)
- if popup_or_browse(flds) then
- trow_positn = nul2zero(ROW_POSITN) - line_cnt
- tcol_positn = nul2zero(COL_POSITN)
- color = getcolor(FLD_DISPLAY, FLD_EDITABLE) // get color of element
-
- if at_pop and !ok_coordinates(flds, 2, 0, "") then loop endif
-
- print("*"+replicate("-",78)+crlf);
- }
- FUNCTION {get_udfname(FLD_FIELDNAME)}
- {lmarg(offset)}
- PARAMETER fld_name
- PRIVATE ALL LIKE l?_*
- PRIVATE fld_name, rtn_fld
-
- ll_return = .T. && Declare return variable for function
- ln_row = ROW() && Current Row of Get
- ln_col = COL() && Current Column of Get
- rtn_fld = fld_name && Current Value of Get
-
- { if !is_required(FLD_OK_COND) then}
- IF EMPTY(fld_name) && Not a required field
- RETURN (.T.) && if null field
- ENDIF
-
- { endif
- if is_help then}
-
- ON KEY LABEL {on_key_help}
- { endif
- if is_recalc then}
- ON KEY LABEL {on_key_recalc}
- { endif
- if is_zoom then}
- ON KEY LABEL {on_key_zoom}
- { endif}
-
- lc_alias = ALIAS() && Grab current workarea
- //--------------------------------------------------------------------------
- // kjn New design for Edit/Browse that will eliminate the @ GET code
- // Will allow this code to go away
- //--------------------------------------------------------------------------
-
- IF ln_row = {row_positn} .AND. (ln_col >= {col_positn} .AND. ln_col <= {col_positn+FLD_LENGTH+6} )
- ll_edit = .T.
- ELSE
- ll_edit = .F.
- ENDIF
-
- { lookup_dbf = get_file(FLD_OK_COND);
- temp_key = alltrim(get_key(FLD_OK_COND));
-
- if workarea_cnt <= max_workareas then
- }
- SELECT ("{ upper(lookup_dbf) == FLD_FILENAME ? "A"+substr(lookup_dbf,1,7) :
- lookup_dbf }")
- { else}
- SELECT SELECT()
- IF FILE("{lookup_dbf}.dbf")
- USE {lookup_dbf} ORDER {temp_key} \
- { if (upper(lookup_dbf) == FLD_FILENAME) then}
- AGAIN
- { else}
- {//leave this space}
- { endif}
- ELSE
- SET MESSAGE TO "{lookup_dbf}.dbf {use_err} {any_key}"
- ll_wait = INKEY(0)
- SET MESSAGE TO
- RETURN .F.
- ENDIF
- { endif // workarea_cnt}
-
- lc_exact = SET("EXACT") && Store value of EXACT
- SET EXACT ON
- { if !at_pop then}
- lc_near = SET("NEAR") && Store value of NEAR
- SET NEAR ON && Do "soft" seek into "BROWSE"
-
- { endif
- if chr(FLD_VALUE_TYPE) == "C" then}
- fld_name = IIF( EMPTY( TRIM( fld_name)), fld_name, TRIM( fld_name))
- { endif}
- SEEK fld_name
-
- SET EXACT &lc_exact. && Restore SET EXACT to org. value
- { if !at_pop then}
- SET NEAR &lc_near. && Restore SET NEAR to org. value
- { endif}
-
- IF .NOT. FOUND()
-
- { temp_name = get_popname(FLD_OK_COND);
-
- if at_pop then // Gen for Popup lookup}
- DEFINE POPUP {temp_name} FROM \
- { if trow_positn < max_pop_row then
- trow_positn + 1},{tcol_positn} ;
- TO {scrn_size-1},{tcol_positn + len(FLD_TEMPLATE) + 1} ;
- { else
- trow_positn - 11},{tcol_positn} ;
- TO {trow_positn - 1},{tcol_positn + len(FLD_TEMPLATE) + 1} ;
- { endif}
- PROMPT FIELD {get_field(FLD_OK_COND)} ;
- MESSAGE {select_msg1}
-
- ON SELECTION POPUP {temp_name} DEACTIVATE POPUP
-
- { if chr(FLD_VALUE_TYPE) == "C" then}
- KEYBOARD TRIM( fld_name ) CLEAR
-
- { endif
- else
- // Gen for BROWSE lookup
- if (is_update(FLD_OK_COND) and is_fields(FLD_OK_COND)) then
- // If updateable and fields declared then check for no records
- }
- // Currently BLOWS dbase UP kjn
- //
- // IF RECCOUNT() = 0
- // APPEND BLANK
- // REPLACE {cap_first(FLD_FIELDNAME)} WITH \
- //{ cap_first(FLD_FILENAME)}->{cap_first(FLD_FIELDNAME)}
- // KEYBOARD( CHR( kn_Tab)) CLEAR
- // ENDIF
- //{ else}
- IF RECCOUNT() = 0
- DO _DbfEmpty
- ll_return = .F.
- ENDIF
-
- IF ll_return
-
- { lmarg(offset*2)
- endif}
- DEFINE WINDOW {temp_name} FROM \
- { if is_window(FLD_OK_COND) then
- get_browse_window(flds)
- else
- print("14,0 TO 20,79")
- endif
- }
-
- { endif}
- SAVE SCREEN TO {temp_name}
-
- { if is_shadow(FLD_OK_COND) then
- if at_pop and ok_coordinates( flds, 4, 1, bad_shadow ) then
- }
- DO _Shadowg WITH {get_pop_shadow(FLD_TEMPLATE);}
- { endif
- if !at_pop then}
- DO _Shadowg WITH \
- { if is_window(FLD_OK_COND) then
- get_browse_shadow(FLD_OK_COND)
- else
- print("14,0,20,77")
- endif
- endif
- endif
- if at_pop then}
- ACTIVATE POPUP {temp_name}
-
- rtn_fld = PROMPT() && Get user choice from Picklist
-
- RELEASE POPUP {temp_name}
- { else}
-
- lc_message = {select_msg1} +;
- {select_msg2}
-
- lc_message = IIF("500" $ VERSION(1), ;
- LEFT( lc_message, LEN( lc_message) - 17) , lc_message)
- SET MESSAGE TO lc_message
-
- ON KEY LABEL Ctrl-M KEYBOARD( CHR( kn_CtrlEnd)) CLEAR && Same as Enter send Ctrl-W
-
- { is_format = is_format_file(flds, FLD_OK_COND);
- if is_format then}
- IF FILE("{fileroot( get_format_file( FLD_OK_COND)) + ".FMT"}")
- SET FORMAT TO {fileroot( get_format_file(FLD_OK_COND))}
- ENDIF
-
- { endif}
- IF .NOT. "500" $ VERSION(1)
- ON KEY LABEL {on_key_move} DO _MoveWind WITH WINDOW(), lc_message
- ENDIF
-
- BROWSE WINDOW {temp_name} NOMENU COMPRESS NOFOLLOW NODELETE LOCK 1 \
- { if ( !is_update(FLD_OK_COND) or
- !is_fields(FLD_OK_COND) or
- ( upper(lookup_dbf) == FLD_FILENAME )
- ) then}
- ;
- NOAPPEND NOEDIT \
- { endif
- if is_format then}
- ;
- FORMAT \
- { endif
- if is_fields(FLD_OK_COND) then}
- ;
- FIELDS {get_browse_fields_list(flds)} \
- // outputs correct line spacing
- { endif}
-
-
- // Currently BLOWS dbase UP kjn
- //{ if is_update(FLD_OK_COND) then}
- // IF EMPTY({cap_first(get_field(FLD_OK_COND))}) .AND. RECCOUNT() = 1
- // lc_safety = SET("SAFETY")
- // SET SAFETY OFF
- // ZAP
- // SET SAFETY &lc_safety.
- // ENDIF
- //
- //{ endif}
- { if is_format then}
- SET FORMAT TO
- { endif}
- ON KEY LABEL {on_key_move}
- ON KEY LABEL Ctrl-M
- SET MESSAGE TO
-
- RELEASE WINDOW {temp_name}
- { endif}
-
- RESTORE SCREEN FROM {temp_name}
-
- {// for code that blows up above kjn
- // if !(is_update(FLD_OK_COND) and is_fields(FLD_OK_COND)) then
- // Need ENDIF for IF ll_return above
-
- if (is_update(FLD_OK_COND) and is_fields(FLD_OK_COND)) then
- // for now gen endif for this, kjn. if append works
- // delete this if and uncomment out the one right above
- lmarg(offset)
- }
- ENDIF
- { endif}
-
- IF LASTKEY() <> kn_esc
- { if !at_pop then}
- rtn_fld = {cap_first(get_field(FLD_OK_COND))}
- { endif}
- { if is_required(FLD_OK_COND) then}
-
- IF EMPTY(rtn_fld) && Is a required field, so return .F.
- ll_return = .F.
- ELSE
- { lmarg(offset * 2)
- endif}
-
- //--------------------------------------------------------------------------
- // kjn New design for Edit/Browse that will eliminate the @ GET code
- // Will allow this code to go away
- //--------------------------------------------------------------------------
- IF ll_edit
- @ {trow_positn},{tcol_positn} GET rtn_fld \
- { if Ok_Template(flds) then}
- PICTURE "{picture_for_get(flds);}" \
- { outcolor()}
- { endif}
-
- ENDIF
- //--------------------------------------------------------------------------
-
- REPLACE {cap_first(FLD_FILENAME)}->{cap_first(FLD_FIELDNAME)} WITH \
- { if chr(FLD_VALUE_TYPE) == "C" or
- at("BROWSE", upper(ltrim(FLD_OK_COND))) == "2" then}
- rtn_fld
- { else}
- VAL(rtn_fld)
- { endif}
-
- ll_return = .T.
- { if is_required(FLD_OK_COND) then
- lmarg(offset)}
- ENDIF
- { endif}
- ELSE
- ll_return = .F.
- {
- if !is_required(FLD_OK_COND) then
- }
-
- IF EMPTY(fld_name) && Not a required field, so return .t.
- ll_return = .T.
- ENDIF
-
- { endif}
- ENDIF
-
- ELSE
- ll_return = .T.
- ENDIF
- {if is_replace(FLD_OK_COND) then}
-
- IF ll_return
- DO U_{lower(substr(FLD_FIELDNAME,1,7))} WITH ll_edit, \
- { if chr(FLD_VALUE_TYPE) == "C" or
- at("BROWSE", upper(ltrim(FLD_OK_COND))) == "2" then}
- rtn_fld
- { else}
- VAL(rtn_fld)
- { endif}
- ENDIF
- {endif}
-
- {if workarea_cnt > max_workareas then}
- USE
-
- {endif}
- SELECT (lc_alias) && Go back to the edit file
-
- {if is_help then}
- ON KEY LABEL {on_key_help} \
- DO {"H_" + lower(rtrim(substr(name,1,6)))} WITH VARREAD() && Call Help code
- {endif
- if is_recalc then}
- ON KEY LABEL {on_key_recalc} \
- DO {"R_" + lower(rtrim(substr(name,1,6)))} WITH VARREAD() && Call Recalc code
- {endif
- if is_zoom then}
- ON KEY LABEL {on_key_zoom} \
- DO {"Z_" + lower(rtrim(substr(name,1,6)))} WITH VARREAD() && Call Zoom code
- {endif
- lmarg(0)}
- RETURN (ll_return)
- *-- EOP: {get_udfname(FLD_FIELDNAME)}
-
- { endif
- next flds
- endif // there were POPUP VALID clauses
-
- return;
- // eof - make_pop_code()
- enddef
-
- //--------------------------------------------------------------
- define make_shadow_proc()
- // Make the dBASE code for shadowing
- print("*"+replicate("-",78)+crlf);
- }
- PROCEDURE _Shadowg && displays shadow that grows
- { lmarg(offset)}
- PARAMETER x1,y1,x2,y2
- PRIVATE x1,y1,x2,y2
-
- x0 = x2+1
- y0 = y2+2
- dx = 1
- dy = (y2-y1) / (x2-x1)
- DO WHILE x0 <> x1 .OR. y0 <> y1+2
- @ x0,y0 FILL TO x2+1,y2+2 COLOR n+/n
- x0 = IIF(x0<>x1,x0 - dx,x0)
- y0 = IIF(y0<>y1+2,y0 - dy,y0)
- y0 = IIF(y0<y1+2,y1+2,y0)
- ENDDO
- { lmarg(0)}
- RETURN
- *-- EOP: _Shadowg
-
- {print("*"+replicate("-",78)+crlf);}
- PROCEDURE _dbtrap && error routine for SET("dbtrap")
- { var wcol1, wcol2, error_msg_length;
- error_msg_length = len( dbtrap_err)
- wcol1 = (screen_width/2) - ( error_msg_length/2) - 2
- wcol2 = (screen_width/2) + ( error_msg_length/2) + 2
- lmarg(offset);
- }
- SET CURSOR OFF
- PRIVATE ALL LIKE l?_*
- SAVE SCREEN TO _dbtrap
- DO _Shadowg WITH 10, {wcol1}, 15, {wcol2}
- DEFINE WINDOW _dbtrap FROM 10,{wcol1} TO 15,{wcol2} DOUBLE
- ACTIVATE WINDOW _dbtrap
- lc_error = "{dbtrap_err}"
- lc_error2 = "{any_key}"
- @ 1, CENTER( lc_error, {wcol2 - wcol1}) SAY lc_error
- @ 2, CENTER( lc_error2, {wcol2 - wcol1}) SAY lc_error2
- lc_wait = INKEY(10)
- RELEASE WINDOW _dbtrap
- RESTORE SCREEN FROM _dbtrap
- RELEASE SCREEN _dbtrap
- SET CURSOR ON
- { lmarg(0)}
- RETURN
- *-- EOP: _dbtrap
- { return;
- enddef // make_shadow_proc()
-
- //--------------------------------------------------------------
- define make_help_code()
- //------------------------------------
- // Make procedures for the help system
- // called from form.gen
- //------------------------------------
- if is_help then
- // If the udf file has not already been created, make it.
- if !udf_file then
- if !make_udf() then
- return 0;
- endif
- // Put up the UDF header
- udf_header()
- endif
- // Make procedures for the help system
- make_help()
- endif
- return;
- enddef
-
- //--------------------------------------------------------------
- define make_help()
- // Make the dBASE code for help
- var help_name;
- help_name = "H_" + lower(rtrim(substr(name,1,6)))
- print("*"+replicate("-",78)+crlf);
- }
-
- PROCEDURE {help_name}
- { lmarg(offset)}
- *-- Activates the HELP window
- PARAMETER lc_var
- PRIVATE ALL LIKE l?_*
- IF .NOT. FILE("{fileroot(hlp_name)}.dbf")
- *-- Help file has been deleted or can't be found
- RETURN
- ENDIF
-
- SET CURSOR OFF
- ON KEY LABEL {on_key_help}
-
- *-- Select workarea and open Help dbf
- lc_area = ALIAS()
- SELECT SELECT()
- USE {fileroot(hlp_name)} ORDER fld_name NOUPDATE && Open HELP .dbf
-
- lc_exact = SET("EXACT") && Store value of EXACT
- SET EXACT ON
- SEEK lc_var
- SET EXACT &lc_exact.
-
- IF FOUND() && If found show Help
- ln_t = 5
- ln_l = 6
- ln_b = 15
- ln_r = 74
- DEFINE WINDOW {lower(help_name)} FROM ln_t+1, ln_l+2 TO ln_b-1, ln_r-2 NONE
- ON ERROR lc_error = error()
- SAVE SCREEN TO {lower(help_name)}
-
- *-- Make Help Box
- DO _Shadowg WITH ln_t, ln_l, ln_b, ln_r
- @ ln_t+1, ln_l+1 CLEAR TO ln_b-1, ln_r-1
- @ ln_t, ln_l TO ln_b, ln_r DOUBLE
-
- ln_memline = SET("MEMO")
- SET MEMOWIDTH TO 65
- IF MEMLINES(fld_help) > 9
- @ ln_t+1,ln_r SAY CHR(24)
- @ ln_b-1,ln_r SAY CHR(25)
- SET CURSOR ON
- ENDIF
- lc_string = CHR(185)+ [ Help for ] + TRIM(fld_headng) +[ ] + CHR(204)
- lc_message = IIF( MEMLINES(fld_help) > 9 , ;
- "{help_msg1}" , ;
- "" ;
- // "{help_msg1 + help_msg2}" , ;
- // "{help_msg2}" ;
- )
-
- @ ln_t,CENTER(lc_string,80) SAY lc_string
- @ 0,0 GET fld_help OPEN WINDOW {lower(help_name)} MESSAGE lc_message
- // ON KEY LABEL {on_key_toggle} DO _Toggle
- // ON KEY LABEL {on_key_move} DO _MoveWind WITH WINDOW(), lc_message
- READ
- SET MEMOWIDTH TO ln_memline
- ON ERROR
- // ON KEY LABEL {on_key_toggle}
- // ON KEY LABEL {on_key_move}
- RELEASE WINDOW {lower(help_name)}
- RESTORE SCREEN FROM {lower(help_name)}
- RELEASE SCREEN {lower(help_name)}
- ENDIF
- SET MESSAGE TO
- SET CURSOR ON
- USE && Close help file
- SELECT (lc_area) && Back to edit work area
- ON KEY LABEL {on_key_help} DO {help_name} WITH VARREAD()
- { lmarg(0)}
- RETURN
- *-- EOP: {help_name}
-
- //{ print("*"+replicate("-",78)+crlf);}
- //PROCEDURE _Toggle
- //{ lmarg(offset)}
- //PRIVATE ln_wait
- //*-- Toggles the Help message back to the original screen
- //SAVE SCREEN TO Toggle
- //RESTORE SCREEN FROM {lower(help_name)}
- //{ if (scrn_size == 24 or scrn_size == 42) then}
- //@ {scrn_size}, 0
- //@ {scrn_size}, CENTER("{any_key}", {screen_width}) SAY "{any_key}"
- //{ else}
- //SET MESSAGE TO "{any_key}"
- //{ endif}
- //ln_wait = INKEY(15)
- //RESTORE SCREEN FROM Toggle
- //RELEASE SCREEN Toggle
- //SET MESSAGE TO lc_message
- //{ lmarg(0)}
- //RETURN
- //*-- EOP: _Toggle
- //
- {return;
- enddef
-
- //--------------------------------------------------------------
- define make_other_udfs()
- // Make other UDF's used durning form processing
- print(crlf + "*"+replicate("-",78)+crlf);
- }
- PROCEDURE _Cut
- { lmarg(offset)}
- *-- Cut data from a field
- PRIVATE ALL LIKE l?_*
-
- lc_field = VARREAD()
- lc_type = TYPE( lc_field)
- SAVE SCREEN TO _cut
-
- DO CASE
- CASE lc_type = "C"
- gc_cut = TRIM( &lc_field.)
- CASE lc_type $ "NF"
- ln_cnt = 0
- ln_number = &lc_field.
- DO WHILE _numdec( ln_number)
- ln_number = ln_number * 10
- ln_cnt = ln_cnt + 1
- ENDDO
- gc_cut = LTRIM( STR( &lc_field., 14, ln_cnt))
- CASE lc_type = "D"
- gc_cut = DTOC( &lc_field.)
- CASE lc_type = "L"
- gc_cut = IIF( &lc_field., "Y", "F")
- CASE lc_type = "M"
- gc_cut = SUBSTR( &lc_field., 1, 254)
- ln_len = LEN( TRIM( gc_cut))
- ln_cnt = 1
-
- DO WHILE ln_cnt <= ln_len
- *-- Get rid of MODI COMM's soft carriage returns characters
- IF ASC( SUBSTR( gc_cut, ln_cnt, 1)) = 141 .OR.;
- ASC( SUBSTR( gc_cut, ln_cnt, 1)) = 10 .OR.;
- ASC( SUBSTR( gc_cut, ln_cnt, 1)) = 13
-
- IF ASC( SUBSTR( gc_cut, ln_cnt, 1)) = 13
- gc_cut = STUFF( gc_cut, ln_cnt, 1, " ")
- ELSE
- gc_cut = STUFF( gc_cut, ln_cnt, 1, "")
- ENDIF
-
- ln_len = LEN( TRIM( gc_cut)) && Length of string can change
- LOOP
- ENDIF
- ln_cnt = ln_cnt + 1
- ENDDO
- ENDCASE
-
- lc_message = SUBSTR( gc_cut, 1, {(screen_width - 1) - len(paste_msg1)}) + "{paste_msg1}"
- { if (scrn_size == 24 or scrn_size == 42) then}
- @ {scrn_size}, CENTER(lc_message, {screen_width}) SAY lc_message
- { else}
- SET MESSAGE TO lc_message
- { endif}
- ln_key = INKEY(2.5)
- gc_cut = gc_cut + SPACE( 254 - LEN( gc_cut))
- SET MESSAGE TO
- RESTORE SCREEN FROM _cut
- RELEASE SCREEN _cut
- { lmarg(0)}
- RETURN
-
- { print("*"+replicate("-",78)+crlf);}
- PROCEDURE _Paste
- { lmarg(offset)}
- *-- Cut data to a field
- PRIVATE ALL LIKE l?_*
-
- lc_field = VARREAD() && Grab field we left from
- lc_type = TYPE( lc_field) && Grab the data type
- lc_cut = TRIM( gc_cut) && Trim blanks from cut data
-
- IF lc_type = "D"
- *-- Remove "/" from character data so that KEYBOARD will work on a
- *-- date field
- // KJN "/" -> set("sepa")
- lc_cut = STUFF(lc_cut, AT("/", lc_cut), 1, "") && Get rid of first "/"
- lc_cut = STUFF(lc_cut, AT("/", lc_cut), 1, "") && Get rid of second "/"
- ENDIF
- *-- Keyboard cut data into the field
- DO CASE
- CASE lc_type $ "NFD"
- *-- Start at the beginning of the field and clear it.
- KEYBOARD ( CHR(kn_home) + CHR(kn_CtrlY) + lc_cut) CLEAR
- CASE lc_type <> "M"
- *-- Paste at the location of the cursor
- KEYBOARD (lc_cut) CLEAR
- OTHERWISE
- IF LEN( &lc_field.) > 0
- *-- Pad space to offset "scrap" from end of memo
- lc_cut = " " + lc_cut
- ENDIF
- REPLACE &lc_field. WITH lc_cut ADDITIVE && Replace into memo field
- ln_keyboard = CHR(kn_ctrlhme) + CHR(kn_ctrlpdn) + ;
- CHR(kn_space) + CHR(kn_bakspce) && Makes EDIT think data has changed
- KEYBOARD (ln_keyboard) CLEAR && Move to bottom of memo
- ENDCASE
- { lmarg(0)}
- RETURN
-
- { print("*"+replicate("-",78)+crlf);}
- PROCEDURE _Edpaste
- { lmarg(offset)}
- *-- Edit Cut data
- PRIVATE ALL LIKE l?_*
-
- lc_deli = SET("DELIMITERS")
- lc_form = SET("FORMAT")
- SET DELIMITERS OFF
- SET FORMAT TO
- SAVE SCREEN TO _edpaste
- DEFINE WINDOW _edpaste FROM \
- { if !(scrn_size == 24 or scrn_size == 42) then
- scrn_size-2},0 TO {scrn_size},79
- { else
- scrn_size-3},0 TO {scrn_size-1},79
- { endif}
-
- lc_message = "{paste_msg2}"
- lc_message = IIF("500" $ VERSION(1), ;
- LEFT( lc_message, LEN( lc_message) - 17) , lc_message)
- IF .NOT. "500" $ VERSION(1)
- ON KEY LABEL {on_key_move} DO _MoveWind WITH WINDOW(), lc_message
- ENDIF
- ACTIVATE WINDOW _edpaste
- SET MESSAGE TO lc_message
- @ 0,0 GET gc_cut PICTURE "@S78"
- READ
- ON KEY LABEL {on_key_move}
- SET MESSAGE TO
- RELEASE WINDOW _edpaste
- RESTORE SCREEN FROM _edpaste
- RELEASE SCREEN _edpaste
- SET DELIMITERS &lc_deli.
- SET FORM TO (lc_form)
- { lmarg(0)}
- RETURN
-
- { print("*"+replicate("-",78)+crlf);}
- PROCEDURE _MoveWind
- PARAMETER wind_name, message
- { lmarg(offset)}
- *----------------------------------------------------------
- *- Move the &wind_name. window based on arrow keys. Any
- *- other key stops the move process.
- *----------------------------------------------------------
- ON KEY LABEL {on_key_move}
- ON ERROR ?? CHR(7)
- SET MESSAGE TO
- DO WHILE .T.
- SET MESSAGE TO {wind_msg1}
- ln_keyhit = INKEY(0)
- IF ln_keyhit <> 0
- DO CASE
- CASE ln_keyhit = kn_RghtArw && Right arrow
- MOVE WINDOW &wind_name. BY 0,1
- CASE ln_keyhit = kn_UpArw && Up arrow
- MOVE WINDOW &wind_name. BY -1,0
- CASE ln_keyhit = kn_LeftArw && Left arrow
- MOVE WINDOW &wind_name. BY 0,-1
- CASE ln_keyhit = kn_DownArw && Down Arrow
- MOVE WINDOW &wind_name. BY 1,0
- OTHERWISE
- EXIT
- ENDCASE
- ENDIF
- ENDDO
- ON ERROR
- ON KEY LABEL {on_key_move} DO _MoveWind WITH WINDOW(), "&message."
- SET MESSAGE TO message
- { lmarg(0)}
- RETURN
- *-- EOP: _MoveWind
-
- { print("*"+replicate("-",78)+crlf);}
- FUNCTION _numdec
- PARAMETER ln_dec
- IF ln_dec - INT(ln_dec) > 0
- RETURN .T.
- ELSE
- RETURN .F.
- ENDIF
- *-- EOF: _numdec
-
- { print("*"+replicate("-",78)+crlf);}
- FUNCTION Center
- *-- UDF to center a string.
- *-- lc_string = String to center
- *-- ln_width = Width of screen to center in
- *--
- *-- Ex. @ 15,center(string,80) say string
- *-- Will center the <string> withing 80 columns
- PARAMETER lc_string, ln_width
- RETURN ((ln_width/2)-(LEN(lc_string)/2))
- *-- EOP: Center()
-
- {print("*"+replicate("-",78)+crlf);}
- PROCEDURE _key_vars
- *----------------------------------------------------------------------------
- * Enumerate the key values for LASTKEY() and INKEY() functions
- *
- * To check for the Escape key after the INKEY()
- *
- * ln_key = INKEY(0) && Wait for any key press
- * IF ln_key = kn_Esc && Escape was pressed
- * DO esc_hand
- * ENDIF
- *
- *----------------------------------------------------------------------------
- IF TYPE("kn_end") = "U"
- {lmarg(offset)}
- PUBLIC kn_End , kn_Tab , kn_Enter , kn_CtrlEnd , kn_CtrlY , ;
- kn_Home , kn_Esc , kn_CtrlHme , kn_CtrlPDn , kn_CtrlPUp , ;
- kn_Space , kn_BakSpce , kn_RghtArw , kn_UpArw , kn_LeftArw , ;
- kn_DownArw , kn_PgDn , kn_PgUp , kn_F1 , kn_Del , ;
- kn_CtrLArw , kn_CtrRArw , kn_f7 , kn_ShftF7
-
- kn_End = 2 && Ctrl-B
- kn_Tab = 9 && Ctrl-I
- kn_Enter = 13 && Ctrl-M
- kn_CtrlEnd = 23 && Ctrl-W
- kn_CtrlY = 25
- kn_Home = 26 && Ctrl-Z
- kn_Esc = 27 && Ctrl-[
- kn_CtrlHme = 29 && Ctrl-]
- kn_CtrlPDn = 30 && Ctrl-PgDn
- kn_CtrlPUp = 31 && Ctrl-PgUp
- kn_Space = 32
- kn_BakSpce = 127
- kn_RghtArw = 4 && Ctrl-D
- kn_UpArw = 5 && Ctrl-E
- kn_LeftArw = 19 && Ctrl-S
- kn_DownArw = 24 && Ctrl-X
- kn_PgDn = 3 && Ctrl-C
- kn_PgUp = 18 && Ctrl-R
- kn_F1 = 28 && Ctrl-\
- kn_Del = 7 && Ctrl-G
- kn_CtrLArw = 1 && Ctrl-A
- kn_CtrRArw = 6 && Ctrl-F
- kn_F7 = -6
- kn_ShftF7 = -26
-
- *----------------------------------------------------------------------------
- * Enumerate the key values for READKEY()
- *
- * To check to see if data has changed
- *
- * IF READKEY() >= rn_updated && Data has changed
- * REPLACE name WITH m->name
- * ENDIF
- *
- * To check for page down regardless of data change
- *
- * ln_readkey = READKEY()
- * IF ln_readkey = rn_PgDn .OR. ln_readkey = rn_PgDn+rn_Updated
- * DO pgdn_hand
- * ENDIF
- *
- *----------------------------------------------------------------------------
- PUBLIC rn_Updated , rn_LeftArw , rn_BakSpce , rn_RghtArw , rn_CtrLArw , ;
- rn_CtrRArw , rn_UpArw , rn_DownArw , rn_PgUp , rn_PgDn , ;
- rn_Esc , rn_CtrlEnd , rn_Enter , rn_EnterA , rn_CtrlHme , ;
- rn_CtrlPUp , rn_CtrlPDn , rn_F1
-
- rn_Updated = 256 && Add to rn_key value for updated condition
- rn_LeftArw = 0 && Includes Ctrl-S and Ctrl-H - backward one character
- rn_BakSpce = 0 && backward one character
- rn_RghtArw = 1 && Includes Ctrl-D and Ctrl-L - forward one character
- rn_CtrLArw = 2 && Ctrl-Left Arrow, includes Ctrl-A - previous word
- rn_CtrRArw = 3 && Ctrl-Right Arrow, includes Ctrl-F - next word
- rn_UpArw = 4 && Includes Ctrl-E and Ctrl-K - backward one field
- rn_DownArw = 5 && Includes Ctrl-J and Ctrl-X - forward one field
- rn_PgUp = 6 && Includes Ctrl-R - backward one screen
- rn_PgDn = 7 && Includes Ctrl-C - forward one screen
- rn_Esc = 12 && Includes Ctrl-Q - Terminate w/o save
- rn_CtrlEnd = 14 + rn_updated && Includes Ctrl-W - Terminate w/save
- rn_Enter = 15 && Includes Ctrl-M RETURN of fill last record
- rn_EnterA = 16 && Enter at the beginning of a record in APPEND
- rn_CtrlHme = 33 && Ctrl-Home - Menu display toggle
- rn_CtrlPUp = 34 && Ctrl-PgUp - Zoom Out
- rn_CtrlPDn = 35 && Ctrl-PgDn - Zoom In
- rn_F1 = 36 && Help function key
- {lmarg(0)}
- ENDIF
-
- RETURN
- *-- EOP: _key_vars
-
- {return;
- enddef
-
- //--------------------------------------------------------------
-
- define check_for_gen_extensions()
- // Check for all the different extensions to forms support for this fmt file
- // Help extension
- var dbf_name;
- // next line modified to include rtrim statement per Bill Ramos
- hlp_name = frame_path + rtrim(substr( fileroot( fmt_name), 1, 6)) + "_H"
- if fileexist(hlp_name + ".DBF") and fileexist(hlp_name + ".DBT") then
- is_help = 1 // Global flag for help support
- // Following lines added by Barry Fox to prompt user for the name of the
- // the database to check for help support. This allows the generation
- // help support when the form name differs from the parent database
- // name.
- else
- dbf_name = askuser("Enter dbf name for help support or press ENTER to continue ","",12)
- hlp_name = frame_path + rtrim(substr( fileroot( dbf_name), 1, 6)) + "_H"
- if fileexist(hlp_name + ".DBF") and fileexist(hlp_name+ ".DBT" ) then
- is_help = 1
- endif
- endif
- foreach FLD_ELEMENT flds
- // Popup or Browse support
- if popup_or_browse(flds) then
- is_popup = 1
- workarea_cnt = workarea_cnt + 1
- endif
- // Zoom support
- if is_zoom(FLD_OK_COND) then
- is_zoom = 1
- endif
- // Recalc support
- if is_recalc(FLD_DESCRIPT) then
- is_recalc = 1
- endif
- // Replace lookup support
- if is_replace(FLD_OK_COND) then
- is_replace = 1
- endif
- next flds
- if is_help or is_popup or is_zoom or is_recalc or is_replace then
- return 1;
- else
- return 0;
- endif
- enddef
-
- //--------------------------------------------------------------
- define popup_or_browse(cur) // Pass in foreach cursor
- // Check for "popup" or "browse" string for this fmt file
- if at("POPUP", upper(ltrim(cur.FLD_OK_COND))) == "2" or
- at("BROWSE", upper(ltrim(cur.FLD_OK_COND))) == "2" then
- return 1;
- else
- return 0;
- endif
- enddef
-
- //--------------------------------------------------------------
- define new_page(cur) // Pass in foreach cursor
- // Checks for a page break and adjusts line_cnt and page_cnt
- if nul2zero(cur.ROW_POSITN) - line_cnt > scrn_size then
- line_cnt = line_cnt + scrn_size + 1;
- ++page_cnt;
- return 1;
- endif
- return 0;
- enddef
-
- //--------------------------------------------------------------
- define parse_line( before, // Out: chars before the look_for string
- input, // In: line being parsed
- look_for // In: string searched for
- ) // Rtn: chars after the look_for string
- // If the look_for sting is not found, the before sting will equal the
- // input string, and the returned value will be NUL
- var location, after;
-
- location = at(look_for, upper(input))
- if location == 0 then
- before = input
- return ( "" );
- endif
-
- before = substr( input, 1, location-1)
- after = substr( input, location)
- after = substr( after, 1, len(after) - 1)
-
- return ( alltrim( substr( after,
- 1 + len(look_for),
- get_next_key_word(
- substr( after,
- 1 + len( look_for)
- )
- )
- )
- )
- );
- // end: parse_line()
- enddef
-
- //--------------------------------------------------------------
- define get_next_key_word(rest_of_str) // String to search for keyword
- var str_length;
-
- str_length = len(rest_of_str)
- rest_of_str = upper(rest_of_str)
-
- for cnt = 1 to str_length
-
- if at(" ORDER", substr(rest_of_str, cnt)) == 1 or
- at(" REQ", substr(rest_of_str, cnt)) == 1 or
- at(" SHADOW",substr(rest_of_str, cnt)) == 1 or
- at(" FIELDS",substr(rest_of_str, cnt)) == 1 or
- at(" UPDATE",substr(rest_of_str, cnt)) == 1 or
- at(" FORMAT",substr(rest_of_str, cnt)) == 1 or
- at(" FROM", substr(rest_of_str, cnt)) == 1 or
- at(" REPLACE", substr(rest_of_str, cnt)) == 1 or
- at(" ZOOM", substr(rest_of_str, cnt)) == 1 then
- exit
- endif
-
- next
- return cnt - 1;
- enddef
-
- //--------------------------------------------------------------
- // Parsing routines for pulling objects out of the VALID string
- // "POPUP" = "file->fld_name ORDER key_fld REQ"
- // 1234567890123456789012345678901234567890123
- // 1 2 3 4
- define get_file(valid_str)
- var s_arrow, // String "->"
- test,
- s_equal, // String "="
- next_alpha,
- at_alias,
- s_before, // String before the searched for item
- r_target, // Remainder of the target string after item
- use_name; // Return for file
-
- s_arrow = "->"
- s_equal = "="
- r_target = parse_line( s_before, valid_str, s_equal ) // ' "file->...'
- next_alpha = atalpha(r_target) // 3
- at_alias = at(s_arrow, r_target) // 7
- use_name = substr(r_target,next_alpha,at_alias-next_alpha) // 'file'
-
- return cap_first(use_name);
- enddef
-
- //--------------------------------------------------------------
- define get_udfname(fld_str)
- // Create UDF name
- return cap_first( "l_" + substr( fld_str,1,6) );
- enddef
-
- //--------------------------------------------------------------
- define get_key(valid_str)
- var s_order, // String "ORDER "
- at_space,
- s_before, // String before the searched for item
- r_target, // Remainder of the target string after item
- order_tag; // Search TAG to ORDER BY
-
- s_order = "ORDER "
- r_target = parse_line( s_before, valid_str, s_order ) // 'key_fld REQ'
- at_space = at(" ",r_target)
- if at_space == 0 then
- order_tag = substr(r_target, 1, len(r_target)) // 'key_fld"'
- else
- order_tag = substr(r_target, 1, at_space)
- endif
- return cap_first(order_tag);
- enddef
-
- //--------------------------------------------------------------
- define get_field(valid_str)
- var s_arrow, // String "->"
- at_space,
- s_before, // String before the searched for item
- r_target, // Remainder of the target string after item
- fld_name; // Field name to lookup in target file
-
- s_arrow = "->"
- r_target = parse_line( s_before,
- valid_str, s_arrow ) // 'fld_name ORDER...'
- at_space = at(" ",r_target)
-
- fld_name = ( at_space == 0 ? r_target : substr(r_target, 1, at_space-1) );
-
- return cap_first(fld_name);
- enddef
-
- //--------------------------------------------------------------
- define get_popname(valid_str)
- // Create popup name
- return ( lower( "l_" + substr( get_field( valid_str),1,6) ) );
- enddef
-
- //--------------------------------------------------------------
- define is_required(valid_str)
- // Determines if the field is required before moving to the next field
- return ( ( at(" REQ ", upper(valid_str)) ? 1 : 0 ) or
- ( at(" REQ\"", upper(valid_str)) ? 1 : 0 )
- );
- enddef
-
- //--------------------------------------------------------------
- define is_shadow(valid_str)
- // Determines if the user wants shadowing for popup
- return ( ( at(" SHADOW ", upper(valid_str)) ? 1 : 0 ) or
- ( at(" SHADOW\"", upper(valid_str)) ? 1 : 0 )
- );
- enddef
-
- //--------------------------------------------------------------
- define is_update(valid_str)
- // Determines if the user wants updating in the BROWSE
- return ( ( at(" UPDATE ", upper(valid_str)) ? 1 : 0 ) or
- ( at(" UPDATE\"", upper(valid_str)) ? 1 : 0 )
- );
- enddef
-
- //--------------------------------------------------------------
- define is_format_file(k, valid_str)
- // Determines if the user has a format file entered and is valid
- var is_format, format_file;
-
- is_format = ( at(" FORMAT ", upper(valid_str)) ? 1 : 0 );
-
- if is_format then
- format_file = parse_line("", k.FLD_OK_COND, "FORMAT ")
- format_file = (at(".", format_file) ? format_file : format_file + ".fmt");
- is_format = ( fileexist(format_file) ? 1 : 0 );
- endif
-
- return is_format;
- enddef
-
- //--------------------------------------------------------------
- define is_window(valid_str)
- // Determines if the user wants windowing for BROWSE
- return ( at(" FROM ",upper(valid_str)) ? 1 : 0 );
- enddef
-
- //--------------------------------------------------------------
- define is_fields(valid_str)
- // Determines if the user wants to set fields for BROWSE
- return ( at(" FIELDS ",upper(valid_str)) ? 1 : 0 );
- enddef
-
- //--------------------------------------------------------------
- define is_zoom(valid_str)
- // Determines if the field wants zoom before moving to the next field
- return ( ( at(" ZOOM ", upper(valid_str)) ? 1 : 0 ) or
- ( at(" ZOOM\"", upper(valid_str)) ? 1 : 0 )
- );
- enddef
-
- //--------------------------------------------------------------
- define is_recalc(descrip_str)
- // Determines if the users wants recalc on calculated fields
- return ( at("RECALC", upper(descrip_str)) ? 1 : 0 );
- enddef
-
- //--------------------------------------------------------------
- define is_replace(valid_str)
- // Determines if the users wants recalc on calculated fields
- return ( at(" REPLACE ", upper(valid_str)) ? 1 : 0 );
- enddef
-
- //--------------------------------------------------------------
- define get_pop_shadow(field_template) // Pass in FLD_TEMPLATE to deter. shadow
- if trow_positn < max_pop_row then
- trow_positn + 1},{tcol_positn},{scrn_size-1},{tcol_positn+len(Field_template)+1}
- { else
- trow_positn - 11},{tcol_positn},{trow_positn - 1},{tcol_positn+len(Field_template)+1}
- { endif
- return;
- enddef
-
- //--------------------------------------------------------------
- define get_browse_shadow(from_to)
- // Determine shadow coordinates for BROWSE
-
- var from_clause, from_coord, to_coord, r1, c1, r2, c2;
-
- // Get From clause for the DEFINE WINDOW
- from_clause = alltrim( upper( parse_line("", from_to, "FROM ")))
-
- if !from_clause then return ""; endif
-
- // Get FROM coordinates
- from_coord = alltrim( substr( from_clause, 1, at("TO", from_clause) - 1))
- r1 = substr( from_coord, 1, at(",", from_coord)-1)
- c1 = substr( from_coord, at(",", from_coord)+1)
-
- // Get TO coordinates
- to_coord = alltrim( substr( from_clause, at("TO", from_clause) + 2))
- r2 = substr( to_coord, 1, at(",", to_coord)-1)
- // Check shadow height and adjust if necessary
- r2 = (val( r2) + 1) <= scrn_size ? r2 : str( scrn_size - 1) ;
-
- c2 = substr( to_coord, at(",", to_coord)+1)
- // Check shadow width and adjust if necessary
- c2 = (val(c2)+2) <= 79 ? c2 : str(77) ;
-
- print( r1 + "," + c1 + "," + r2 + "," + c2)
- return;
- enddef
-
- //--------------------------------------------------------------
- define get_browse_fields_list(k)
- // Search for "FIELDS" in FLD_OK_COND and return the field list for BROWSE
- var field_list, key_length;
-
- field_list = parse_line("", k.FLD_OK_COND, "FIELDS ")
- key_length = len( temp_key)
-
- if is_update(k.FLD_OK_COND) then
- // Add /R readonly flag to KEY field of lookup table, if updateable
- return substr( field_list, 1, at( upper(temp_key), upper(field_list)) + key_length -1)
- + " /R" +
- substr( field_list, at( upper(temp_key), upper(field_list)) + key_length);
- else
- return field_list;
- endif
- enddef
-
- //--------------------------------------------------------------
- define get_browse_window(k)
- // Search for "FROM" in FLD_OK_COND and return the list for BROWSE
- return parse_line("", k.FLD_OK_COND, "FROM ");
- enddef
-
- //--------------------------------------------------------------
- define get_format_file(_file)
- // Search for "FORMAT" in FLD_OK_COND and return the NAME for BROWSE
- return cap_first(parse_line("", _file, "FORMAT "))
- enddef
-
- define get_zoom_format_file(_file)
- // Search for "ZOOM" in FLD_OK_COND and return the FORMAT NAME for EDIT
- return cap_first(parse_line("", _file, "ZOOM "));
- enddef
-
- define make_zoom_to_form()
- var zoom_name, lookup_dbf;
- zoom_name = "Z_" + lower(rtrim(substr(name,1,6)))
- if !is_zoom then
- return 0;
- endif
- print(crlf + "*"+replicate("-",78)+crlf);
- }
- PROCEDURE {zoom_name}
- *-- Branch to another EDIT form based on lc_var
- PARAMETER lc_var
- PRIVATE ALL LIKE l?_*
-
- ON KEY LABEL {on_key_zoom}
- SAVE SCREEN TO {zoom_name}
- lc_area = ALIAS()
- ll_edit = .F.
- SELECT SELECT()
- DO CASE
- { foreach FLD_ELEMENT flds
- if is_zoom( FLD_OK_COND) then
- lookup_dbf = get_file( FLD_OK_COND);
- }
- CASE lc_var = "{FLD_FIELDNAME}"
- { if workarea_cnt > max_workareas then}
- IF FILE("{lookup_dbf}.dbf")
- USE {lookup_dbf} ORDER {alltrim(get_key( FLD_OK_COND))}
- { if chr( FLD_VALUE_TYPE) == "C" then}
- lc_var = IIF( EMPTY( TRIM( lc_var)), lc_var, TRIM( lc_var))
- { endif
- else
- }
- SELECT ("{ upper(lookup_dbf) == FLD_FILENAME ?
- "A"+substr(lookup_dbf,1,7) :
- lookup_dbf}")
- { endif }
- SEEK &lc_area.->&lc_var.
-
- IF FILE("{fileroot( get_zoom_format_file( FLD_OK_COND)) + ".FMT"}")
- SET FORMAT TO {fileroot( get_zoom_format_file(FLD_OK_COND))}
- ENDIF
- ll_edit = .T.
- { if workarea_cnt > max_workareas then}
- ENDIF
- { endif
- endif
- next
- }
- OTHERWISE
- KEYBOARD CHR( kn_CtrlHme ) CLEAR && Gets user into memo field
- ENDCASE
-
- IF ll_edit
- EDIT NEXT 1 && Edit the Zoomed record
- ENDIF
-
- { if workarea_cnt > max_workareas then}
- USE
- { endif}
- SELECT (lc_area) && Back to edit work area
- RESTORE SCREEN FROM {zoom_name}
- RELEASE SCREEN {zoom_name}
- { if is_help then}
- ON KEY LABEL {on_key_help} DO {"H_" + lower(rtrim(substr(name,1,6)))} WITH VARREAD()
- { endif
- if is_recalc then}
- ON KEY LABEL {on_key_recalc} DO {"R_" + lower(rtrim(substr(name,1,6)))} WITH VARREAD()
- { endif}
- ON KEY LABEL {on_key_cut} DO _Cut
- ON KEY LABEL {on_key_paste} DO _Paste
- ON KEY LABEL {on_key_edpaste} DO _Edpaste
- ON KEY LABEL {on_key_zoom} DO {zoom_name} WITH VARREAD()
- RETURN
- *-- EOP: {zoom_name}
- {enddef
-
- define make_recalc_code()
- var recalc_name;
- recalc_name = "R_" + lower(rtrim(substr(name,1,6)))
- if !is_recalc then
- return 0;
- endif
- if !udf_file then
- if !make_udf() then
- return 0;
- endif
- // Put up the UDF header
- udf_header()
- endif
- print(crlf + "*"+replicate("-",78)+crlf);
- }
- PROCEDURE {recalc_name}
- *-- Recalculate calculated fields
- PARAMETER lc_var
- PRIVATE ALL LIKE l?_*
- ON KEY LABEL {on_key_recalc}
-
- {textopen( fmt_name + ".tmp")
- temp = textgetl();
- if page_cnt > 1 then
- }
- DO CASE
- CASE lc_var $ "{temp}"
- { lmarg(offset*2)
- endif
- color_flg = line_cnt = 0;
- foreach FLD_ELEMENT k
- if new_page(k) then
- temp = textgetl();
- lmarg(offset)
- }
-
- CASE lc_var $ "{temp}"
- { lmarg(offset*2)
- endif
- color = getcolor(FLD_DISPLAY, FLD_EDITABLE) // get color of element
- if FLD_FIELDTYPE == calc and is_recalc(FLD_DESCRIPT) then}
- *-- Calculated field: {cap_first(FLD_FIELDNAME)} - {FLD_DESCRIPT}
- @ {nul2zero(ROW_POSITN) - line_cnt},{nul2zero(COL_POSITN)} SAY \
- { // Loop thru expression in case it is longer than 237
- foreach FLD_EXPRESSION fcursor in k
- FLD_EXPRESSION}
- { next}
- // Output a space after the Fld_expression and get ready for picture clause
- \
- { if Ok_Template(k) then}
- PICTURE "{picture_for_say(k);}" \
- { endif
- outcolor()}
-
- { endif
- next k;
- if page_cnt > 1 then
- lmarg(0)
- }
- ENDCASE
- {endif}
-
- ON KEY LABEL {on_key_recalc} DO {"R_" + lower(rtrim(substr(name,1,6)))} WITH VARREAD()
- RETURN
- *-- EOP: {recalc_name}
- { textclose()
- fileerase( fmt_name + ".tmp")
- enddef
-
- define write_recalc_get_list()
- if is_recalc then // Write get list out for each page
- append( fmt_name + ".tmp") // Used for "recalc" option
- print( get_list + crlf)
- append( fmt_name + ".fmt")
- endif
- enddef
-
- //--------------------------------------------------------------
- define make_replace_code()
- // Make REPLACE and @ GET statements for other fields related to the LOOKUP
- var replace_field_name, field_list, temp2;
-
- if !is_replace then
- return 0;
- endif
-
- color_flg = line_cnt = 0;
-
- foreach FLD_ELEMENT x
- if is_replace( FLD_OK_COND ) then // found a field with REPLACE
- replace_field_name = "U_" + lower( rtrim( substr( FLD_FIELDNAME, 1, 7)));
- print(crlf + "*"+replicate("-",78)+crlf);
- }
- PROCEDURE {replace_field_name}
- PARAMETER is_edit, key_field
- *-- Update Look'ed up fields for {cap_first( FLD_FIELDNAME )}
-
- { if at("POPUP", upper(ltrim(FLD_OK_COND))) then}
- SEEK key_field
-
- { endif
- lmarg(4)
- get_replace_fields_list(x)
- get_memvar_fields_list(x)
- lmarg(0)
- }
-
- IF is_edit
- { foreach FLD_ELEMENT y
- if is_replace( y.FLD_OK_COND) and x == y then
-
- field_list = upper( parse_line( "", y.FLD_OK_COND, "REPLACE ") )
- do while len(field_list) > 0
- temp = upper( substr( field_list, 1, at(" WITH", field_list) - 1 ))
- temp2 = at("M->", upper(temp)) ?
- substr( temp, at("M->", upper(temp)) + 3 ) :
- temp;
- foreach FLD_ELEMENT z
- if FLD_FIELDNAME == alltrim( temp2 ) then
- color = getcolor(z.FLD_DISPLAY, z.FLD_EDITABLE); // get color of element
- }
- @ {z.ROW_POSITN},{z.COL_POSITN} GET \
- { if at("M->", upper(temp)) then
- temp}
- { else
- cap_first(z.FLD_FILENAME)}->\
- { cap_first(z.FLD_FIELDNAME)}\
- { endif
- if Ok_Template(z) then}
- PICTURE "{picture_for_get(z);}" \
- { outcolor()}
- { endif}
-
- { exit
- endif
- next z
- if at( ",", field_list) > 0 then
- field_list = substr( field_list, at( ",", field_list) + 1 )
- else
- field_list = ""
- endif
- enddo
- }
- ENDIF
- RETURN
- *-- EOP: {replace_field_name}
-
- { exit
- endif
- next y
- endif
- next x
- return;
- enddef
-
- //--------------------------------------------------------------
- define get_replace_fields_list(k)
- // Search for "REPLACE" in FLD_OK_COND and return the field list for REPLACE
- var field_list, key_length, first_loop;
-
- first_loop = 1;
- // Get REPLACE field data
- field_list = upper( parse_line( "",k.FLD_OK_COND, "REPLACE ") )
-
- // Fix the data up and print on multiple lines
- do while len( field_list) > 0
- if !at("M->", upper(substr(field_list, 1, at(" WITH", field_list) - 1 ))) then
- if first_loop then
- print("REPLACE ")
- first_loop = 0
- else
- print( ", ;" + crlf + space( 7))
- endif
- print( cap_first( k.FLD_FILENAME) + "->" +
- cap_first(alltrim(substr(field_list, 1, at(" WITH", field_list) - 1 ))) +
- " WITH "
- )
-
- temp = cap_first( alltrim( substr( field_list, at( "WITH", field_list) + 4 )))
- if at( ",", temp) > 0 then
- temp = substr( temp, 1, at( ",", temp) - 1 )
- endif
-
- print( temp)
- endif
- if at( ",", field_list) > 0 then
- field_list = substr( field_list, at(",", field_list) + 1 );
- if len( alltrim( field_list) ) == 0 then
- field_list = ""
- endif
- else
- field_list = ""
- endif
- enddo
- print( crlf )
- return ;
- enddef
-
- define get_memvar_fields_list(k)
- // Search for "REPLACE" in FLD_OK_COND and return the field list for MEMVAR
- // declaration
- var field_list, key_length;
-
- field_list = upper( parse_line( "",k.FLD_OK_COND, "REPLACE ") )
- // Produce memvar statements instead of replace statements
- do while len( field_list) > 0
- if at("M->", upper(substr(field_list, 1, at(" WITH", field_list) - 1 ))) then
- // Before "WITH"
- print( cap_first( alltrim( substr(field_list, 1,
- at(" WITH", field_list) - 1 ))) +
- " = "
- )
- // After "WITH"
- temp = cap_first( alltrim( substr( field_list, at( "WITH", field_list) + 4 )))
- if at( ",", temp) > 0 then
- temp = substr( temp, 1, at( ",", temp) - 1 )
- endif
- print( temp + crlf)
- endif
-
- if at( ",", field_list) > 0 then
- field_list = substr( field_list, at(",", field_list) + 1 )
- if len( alltrim( field_list) ) == 0 then
- field_list = ""
- endif
- else
- field_list = ""
- endif
- enddo
- return ;
- enddef
-
- define make_memvar_declarations()
- // Make memvars for lookups
- foreach FLD_ELEMENT
- if FLD_FIELDTYPE == memvar then
- }
- IF TYPE("M->{FLD_FIELDNAME}") = "U"
- m->{FLD_FIELDNAME} = \
- { if chr(FLD_VALUE_TYPE) == "C" then
- print("SPACE(" + len(FLD_TEMPLATE) + ")")
- endif
- if at(chr(FLD_VALUE_TYPE), "NF") then
- print("0")
- endif
- if chr(FLD_VALUE_TYPE) == "D" then
- print("{ \ \ }")
- endif
- if chr(FLD_VALUE_TYPE) == "L" then
- print(".F.")
- endif //
- print(crlf)
- }
- ENDIF
- {
- endif
- next
- return ;
- enddef
- }