Alpha Software Mobile Development Tools:   Alpha Anywhere    |   Alpha TransForm subscribe to our YouTube Channel  Follow Us on LinkedIn  Follow Us on Twitter  Follow Us on Facebook

Announcement

Collapse

The Alpha Software Forum Participation Guidelines

The Alpha Software Forum is a free forum created for Alpha Software Developer Community to ask for help, exchange ideas, and share solutions. Alpha Software strives to create an environment where all members of the community can feel safe to participate. In order to ensure the Alpha Software Forum is a place where all feel welcome, forum participants are expected to behave as follows:
  • Be professional in your conduct
  • Be kind to others
  • Be constructive when giving feedback
  • Be open to new ideas and suggestions
  • Stay on topic


Be sure all comments and threads you post are respectful. Posts that contain any of the following content will be considered a violation of your agreement as a member of the Alpha Software Forum Community and will be moderated:
  • Spam.
  • Vulgar language.
  • Quotes from private conversations without permission, including pricing and other sales related discussions.
  • Personal attacks, insults, or subtle put-downs.
  • Harassment, bullying, threatening, mocking, shaming, or deriding anyone.
  • Sexist, racist, homophobic, transphobic, ableist, or otherwise discriminatory jokes and language.
  • Sexually explicit or violent material, links, or language.
  • Pirated, hacked, or copyright-infringing material.
  • Encouraging of others to engage in the above behaviors.


If a thread or post is found to contain any of the content outlined above, a moderator may choose to take one of the following actions:
  • Remove the Post or Thread - the content is removed from the forum.
  • Place the User in Moderation - all posts and new threads must be approved by a moderator before they are posted.
  • Temporarily Ban the User - user is banned from forum for a period of time.
  • Permanently Ban the User - user is permanently banned from the forum.


Moderators may also rename posts and threads if they are too generic or do not property reflect the content.

Moderators may move threads if they have been posted in the incorrect forum.

Threads/Posts questioning specific moderator decisions or actions (such as "why was a user banned?") are not allowed and will be removed.

The owners of Alpha Software Corporation (Forum Owner) reserve the right to remove, edit, move, or close any thread for any reason; or ban any forum member without notice, reason, or explanation.

Community members are encouraged to click the "Report Post" icon in the lower left of a given post if they feel the post is in violation of the rules. This will alert the Moderators to take a look.

Alpha Software Corporation may amend the guidelines from time to time and may also vary the procedures it sets out where appropriate in a particular case. Your agreement to comply with the guidelines will be deemed agreement to any changes to it.



Bonus TIPS for Successful Posting

Try a Search First
It is highly recommended that a Search be done on your topic before posting, as many questions have been answered in prior posts. As with any search engine, the shorter the search term, the more "hits" will be returned, but the more specific the search term is, the greater the relevance of those "hits". Searching for "table" might well return every message on the board while "tablesum" would greatly restrict the number of messages returned.

When you do post
First, make sure you are posting your question in the correct forum. For example, if you post an issue regarding Desktop applications on the Mobile & Browser Applications board , not only will your question not be seen by the appropriate audience, it may also be removed or relocated.

The more detail you provide about your problem or question, the more likely someone is to understand your request and be able to help. A sample database with a minimum of records (and its support files, zipped together) will make it much easier to diagnose issues with your application. Screen shots of error messages are especially helpful.

When explaining how to reproduce your problem, please be as detailed as possible. Describe every step, click-by-click and keypress-by-keypress. Otherwise when others try to duplicate your problem, they may do something slightly different and end up with different results.

A note about attachments
You may only attach one file to each message. Attachment file size is limited to 2MB. If you need to include several files, you may do so by zipping them into a single archive.

If you forgot to attach your files to your post, please do NOT create a new thread. Instead, reply to your original message and attach the file there.

When attaching screen shots, it is best to attach an image file (.BMP, .JPG, .GIF, .PNG, etc.) or a zip file of several images, as opposed to a Word document containing the screen shots. Because Word documents are prone to viruses, many message board users will not open your Word file, therefore limiting their ability to help you.

Similarly, if you are uploading a zipped archive, you should simply create a .ZIP file and not a self-extracting .EXE as many users will not run your EXE file.
See more
See less

Cluttered Code Editor

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Cluttered Code Editor

    I have a utility to search layouts for any text object or RTF object which contain a specified substring. This worked fine under V5 but acts strange now under V10. After running it, the DragDropList for every layout observed appears side-by-side across the screen. Even though an "X" appears at the top, that doesn't make them go away. So I have to get out of Alpha and come back in.

    After doing an Xdialog for the substring and the selection of layouts to search, this is the way it works:

    For every layout (cLyt)
    - I determine the type of the layout (cType) which can be "Form", "Browse", "Report", or "Letter".
    - I open the layout with: pLyt = a5_layout_design(cLyt,cType)
    - For every object of pLyt, I look for the substring if it is a text object or an RTF object. If found, that is logged in a list.
    - I do a: pLyt.close()

    So, apparently, the a5_layout_design() brings up the layout along with the DragDropList but the pLyt.close() only closes the layout itself (not the DragDropList). I'm not aware at all of how I might accomplish my goals (e..g. with an extra parameter, a different function, etc.). Does anyone have any idea as to how I may get around this problem? Thanks in advance.

    Steve

    #2
    Re: Cluttered Code Editor

    Hi Steve,
    Have you taken a look at the xbasic for the xdialog? You may be missing some " ; " that should be at the end of a line. Otherwise copy and paste the xbasic here so we can take a look at it with you.
    Robin

    Discernment is not needed in things that differ, but in those things that appear to be the same. - Miles Sanford

    Comment


      #3
      Re: Cluttered Code Editor

      Hi Robin,

      Thanks for the response. It is not the xdialog which is creating the problem. Instead, once I get the data I need via the xdailog, I go through a loop. As I stated in my original posting, this loop opens every appropriate layout with the a5_layout_design() function. Then it closes the layout using the <object>.close() function. The entire function is shown below:
      Code:
      'Date Created: 09-Jan-2009 01:13:39 PM
      'Last Updated: 03-Sep-2014 03:34:06 PM
      'Created By  : Steve Andrews
      'Updated By  : Stephen Andrews
      FUNCTION Util_Text_Search AS V ( )
      'DESCRIPTION: This function searches the text objects (and RTF's) of various layouts for substrings.  No parameters needed.
      'NOTE:		When then director Janice Roll changed her name in 2009 to Janice Lavin, there were many official letters and reports with her name hardcoded.  It would be a
      '		huge task to load each one up and check for her name.  That was why this script was originally written - to see what layouts had an object whose text value 
      '		contained her last 	name.  
      '		It has since been enhanced to have the substring being searched for entered via the dialog, to allow choice of which layouts to process, to search RTF's as well 
      '		as text fields, etc.  Also, it was converted into a function for easier accessibility.
      
      dim nFound as N
      
      '************* [for use by subfunction] *****************************
      'DIM shared pLog as P
      'DIM shared cLogname as C
      cSystem = word(A5.Get_Name(),-1,"\\")
      'cLogname = A5.Get_Path()+"\StrSearch_"+WORD(cSystem,1,".")+".txt"	  'File to be created/updated.
      '
      'if is_object(pLog)	'If, say, pLog is still valid from a previous run (not properly closed), close it before proceeding.
      '	pLog.flush()
      '	pLog.close()
      'end if
      '**************************************************************************
      
      'NOTE:  The Import operation type was removed from the list below.  There were often problems
      '		even when trying to load Imports in design mode.
      
      DIM cForms AS C
      DIM cLst AS C
      DIM cLyts_All AS C
      DIM cType AS C
      DIM j AS N
      DIM cLyt_List AS C
      DIM cLyts[4] as C
      DIM cLayouts as C = ""
      DIM nChrs AS N
      DIM cPref AS C
      DIM SHARED cSearch4 as C = ""
      DIM SHARED cResults as C = ""
      
      cLyt_List=<<%aaa%
      Form
      Browse
      Report
      Letter
      %aaa%
      
      cLyts_All = ""
      'debug(1)
      '---------------  Generate enumerated lists for each layout type and store them into an array.  --------------
      for j = 1 to 4
      	cType = word(cLyt_List,j,crlf())
          SELECT
              CASE cType = "Form"
                  cPref = "f"
                  nChrs = 2					'This allows for a prefix of "sf" for subforms.
              CASE cType = "Browse"
                  cPref = "br"
                  nChrs = 2
              CASE cType = "Report"
                  cPref = "r"
                  nChrs = 1
              CASE cType = "Letter"
                  cPref = "ltr"
                  nChrs = 3
          end SELECT
      
      	'Get all layouts of type cType in Personnel.
      	cLst = eval("a5."+cType+"_Enum()")
      	'If drive F: was returned, replacee with path.
      	cLst = strtran(cLst,"@f:\\","@\\percy\v9pers$\\")
      	'Remove Tom's layouts from list.
      	'cLst = *for_each(foo,if(cPref$left(foo,nChrs).AND.mid(foo,at("@",foo),16)="@\\percy\v9pers$",foo,""),cLst)
      	'cLst = remove_blank_lines(cLst)
      	'if j = 1
      	'	'Remove Calendar subforms from list.
      	'	cLst = *for_each(foo,if("sfCalend"$foo,"",foo),cLst)
      	'	cLst = remove_blank_lines(cLst)
      	'end if
      	'Remove path.
      	cLst = *for_each(foo,word(foo,1,"@"),cLst)
      	cLst = sortsubstr(cLst,crlf())
      	
      	cLyts[j] = cLst
      	cLyts_All = cLyts_All + cLst + crlf()
      next j
      
      cLyts_All = remove_blank_lines(cLyts_All)
      'debug(0)
      '---------------  Allow user to select outlays for processing.  --------------
      DIM SHARED cWhich as C = cLyt_List
      dim SHARED bOK as L = .F.
      DIM SHARED varC_result as C
      DELETE a_cWhich		
      DIM a_cWhich[4] as c
      a_cWhich.initialize(cLyt_List)
      temp_count = w_count(cLyts_All,crlf())
      DELETE a_cLyts
      DIM a_cLyts[temp_count] as c
      a_cLyts.initialize(cLyts_All)
      ok_button_label = "&OK"
      cancel_button_label = "&Cancel"
      varC_result = ui_dlg_box("Forms to Have Changes",<<%dlg%
      {region}
      Enter substring to search for:| [.40cSearch4!Check_It];
      {endregion};
      {region}
      Which Layout Type\(s):| [.20,5cWhich^$$a_cWhich!cWhich_];
      ;
      Which Layouts:| [.40,15cLayouts^$$a_cLyts!Check_It];
      <%T= Select All Forms;%Select All!cAll_button_click>;
      <%T= Clear All Forms;%Clear All!cNone_button_click>;
      {endregion};
      {line=1,0};
      {region}
      <*15=ok_button_label!OK?bOK> <15=cancel_button_label!CANCEL>
      {endregion};
      %dlg%,<<%code%
      if left(a_dlg_button,8) = "Check_It" then 
      	bOK = .NOT.(cSearch4="" .OR. cLayouts="")
      	a_dlg_button = ""
      end if 
      if left(a_dlg_button,6) = "cWhich" then 
      	cLyts_All = ""
      	if "Form"$cWhich
      		cLyts_All = cLyts_All + cLyts[1] + crlf()
      	end if
      	if "Browse"$cWhich
      		cLyts_All = cLyts_All + cLyts[2] + crlf()
      	end if
      	if "Report"$cWhich
      		cLyts_All = cLyts_All + cLyts[3] + crlf()
      	end if
      	if "Letter"$cWhich
      		cLyts_All = cLyts_All + cLyts[4] + crlf()
      	end if
      	cLyts_All = remove_blank_lines(cLyts_All)
      	temp_count = w_count(cLyts_All,crlf())
      	REDIM a_cLyts[temp_count] as c
      	a_cLyts.initialize(cLyts_All)
      	a_dlg_button = ""
      end if 
      if a_dlg_button = "cAll_button_click" then 
      	cLayouts = cLyts_All
      	bOK = .NOT.(cSearch4="" .OR. cLayouts="")
      	a_dlg_button = ""
      end if 
      	
      if a_dlg_button = "cNone_button_click" then 
      	cLayouts = ""
      	bOK = .NOT.(cSearch4="" .OR. cLayouts="")
      	a_dlg_button = ""
      end if
      %code%)
      
      if varC_result <> "OK"
      	END
      end if
      
      'Create Heading.
      nWhich_Cnt = line_count(cWhich)
      cAll = iif(line_count(cLyts_All)=line_count(cLayouts),"all","selected")		'Did we include all or a selected subset of the possible layouts?
      if nWhich_Cnt = 1
      	cWch = strtran(cWhich,crlf(),"s")
      else
      	cAnd = iif(nWhich_Cnt=2," dna "," dna ,")					'cWhich = "Forms<CRLF>Browses<CRLF>Reports<CRLF>"
      	cWch = *reverse(strtran(cWhich,crlf(),"s, "))			'cLyts = " ,stropeR ,sesworB ,smroF"
      	cWch = strtran(cWch," ,","",1,1)							'cLyts = "stropeR ,sesworB ,smroF"
      	cWch = strtran(cWch," ,",cAnd,1,1)							'cLyts = "stropeR dna ,sesworB ,smroF"
      	cWch = *reverse(cWch)											'cLyts = "Forms, Browses, and Reports"
      end if
      cHdg = "    (Text & RTF objects of <all> <Which> containing the substring: '<Srch4>')"
      cHdg = strtran(cHdg,"<all>",cAll)
      cHdg = strtran(cHdg,"<Which>",cWch)
      cHdg = strtran(cHdg,"<Srch4>",cSearch4)
      Log_It("                     STRING SEARCH for "+cSystem)
      Log_It("")
      Log_It(cHdg)
      Log_It("")
      
      on error goto ERROR_TRAP
      nFound = 0
      nCnt = line_count(cLayouts)
      dim cLyt_Name as C
      
      'debug19(1)
      '-----------  Process the selected layouts.  ------------
      'ui_freeze(.T.)
      if nCnt > 0
      	for j = 1 to nCnt
      		cLyt = word(cLayouts,j,crlf())
      		'cTbl = word(cOp,2,"@")
      		'cLyt_Name = word(cLyt,1,"@")
      		StatusBar.Set_Text(cLyt)
      		PleaseWait2(.T.,cLyt)
      		
      		'Determine cType for this layout.
      		for k = 1 to 4
      			if word_occurs(cLyts[k],cLyt)
      				nType = k
      			end if
      		next k
      		cType = word(cLyt_List,nType,crlf())
      
      		'Load Layout.
      		exp = cType + ".Load_Low(\"" + cLyt + "\")"
      		'Log_It("   -   exp = "+exp)
      		'pLyt = eval(exp)
      		pLyt = a5_layout_design(cLyt,cType)
      		
      		'Check Text & RTF Objects.
      		cObs = pLyt.child_enum()
      		cOb = ""
      		if line_count(cObs) > 0
      			for k = 1 to line_count(cObs)
      				cOb = word(cObs,k,crlf())		' = "TEXT02"
      				cClass = eval("pLyt."+cOb+".Class()")
      				if cClass = "text" 
      					cTxt = eval("pLyt."+cOb+".text")
      				else if cClass = "rtf"
      					cTxt = eval("pLyt."+cOb+".rtf.rtf_text")
      				else
      					cTxt = ""
      				end if
      				
      				if cSearch4$cTxt
      					nFound = nFound + 1
      					cTxt2 = cTxt
      					if len(cTxt) > 60
      						nPos = at(upper(cSearch4),upper(cTxt))		'Sinct at() is case sensitive, we use upper() for the search.
      						if nPos < 21
      							cTxt2 = left(cTxt,50)
      						else
      							cTxt2 = "..."+substr(cTxt,nPos-20,50)+"..."
      						end if
      					end if
      					Log_It(cType+": "+cLyt)
      					Log_It("    "+cOb+" -> '"+cTxt2+"'")
      				end if
      			next k
      		end if
      		
      		pLyt.close()
      		xbasic_wait_for_idle()
      			
      			'debug(0)
      		'end if
      NEXT_LYT:
      		'debug(0)
      		PleaseWait()
      	next j
      end if
      ui_freeze(.F.)
      
      debug(0)
      
      if nFound = 0
      	Log_It("         (No such text fields were found.)")
      end if
      
      on error goto 0
      Log_It("Close")
      
      Clipboard.Set_Data(cResults)
      
      msg=<<%aaa%
      The Util_Text_Search script has finished.
      
      The results are on the Clipboard.
      %aaa%
      'msg = replace_parameters(msg,local_variables())
      ui_msg_box("Completed",msg)
      
      goto FINISHED
      
      ERROR_TRAP:
      errcd = error_code_get()
      errmsg = error_text_get(errcd)
      Log_It(cType+": "+cLyt)
      'Log_It("    Error: "+word(cLyt_Name,1,"@")+" locked by another session.")
      if cOb = ""
      	errobj = ""
      else
      	errobj = "("+cOb+")"
      end if
      Log_It("    Error: "+errobj+"  "+errmsg+".")
      resume NEXT_LYT
      
      FINISHED:
      END FUNCTION
      
      '**************************************************************************
      
      FUNCTION Log_It AS L (Message AS C )
      'DESCRIPTION: This function logs a message to the designated ascii text file.
      
      'NOTE:  Originally, this function managed the ascii file - opening it, appending a
      '		line to it, and closing it.  Now, it simply appends a line to the cResults
      '		variable.  When the script has finished, cResults is copied to the clipboard.
      ' 		This avoids creating ascii files at various locations and makes the script
      '		more generic.
      
      	if Message <> "Close"
      		cResults = cResults + Message + crlf()
      	end if
      
      	'dim msg as C
      	'msg = Message
      	'dim retval as L
      	'retval = .F.
      	'
      	'if .NOT. is_object(pLog)	'If cLogname has yet to be opened ...
      	'	if file.exists(cLogname) then 
      	'		file.remove(cLogname)
      	'	end if 
      	'	pLog = File.create(cLogname,FILE_RW_SHARED)
      	'	
      	'	'Position it to the end of the file.
      	'	'while .NOT. pLog.eof()
      	'	'	txt=pLog.read_line()
      	'	'wend
      	'end if	
      	'	
      	'if msg="Close"		'If the Message is "Close" ...
      	'	pLog.flush()
      	'	pLog.close()
      	'	retval = .T.
      	'else
      	'	'msg = time("0h:0m:0s.2")+" ["+cLog_Ref+"]  "+msg
      	'	pLog.write_line(msg)
      	'	retval = .T.
      	'end if
      	'
      	'Log_It = retval			
      END FUNCTION
      If you select just a few layouts in the xdialog for the search, you will likely see a few of the DragDropLists in your code editor when it is accessed. Again, this worked fine for V5. But it seems like the close() is insufficient to completely remove the layout.

      Steve
      Last edited by Steve Andrews; 09-04-2014, 04:09 PM.

      Comment


        #4
        Re: Cluttered Code Editor

        Steve,
        Have you seen this function?

        a5_sec_topparent_command("SYSTEM_DESIGN","design")

        It will put the currently active form in design mode. I got it from the toolbar editor.
        Last edited by MoGrace; 09-04-2014, 05:45 PM.
        Robin

        Discernment is not needed in things that differ, but in those things that appear to be the same. - Miles Sanford

        Comment


          #5
          Re: Cluttered Code Editor

          Robin,

          The only way I see to use that function is if I were to first run the form using a :Form_View("Name_Of_Form") and then to do a a5_sec_topparent_command(). That would run the OnInit and other scripts which I do not intend on doing. That is why I am using a5_layout_design() which only brings up the form in design mode.

          Steve

          Comment


            #6
            Re: Cluttered Code Editor

            I just tried a stripped down version of your script and had the same problem. It worked fine from the IW however, which suggests it might be a timing issue.

            Have you thought of buying the Aims App Analyzer? Cause I doubt Cal will come and tell us how he got this to work!
            Robin

            Discernment is not needed in things that differ, but in those things that appear to be the same. - Miles Sanford

            Comment


              #7
              Re: Cluttered Code Editor

              Code:
              dim layout as c
              dim vtype as c = "Form"
              dim lst1 as c
              dim lst2 as c
              dim ptr as p
              lst1 = <<%a%
              Browse 
              Form 
              Report
              %a%
              vtype = ui_get_list2("Select Type",vtype,lst1)
              if vtype = "" then
              	end
              end if
              lst2 = eval("a5."+alltrim(var->vtype)+"_Enum(2)")
              lst2 = sortsubstr(lst2,crlf())
              layout = ui_get_list2("Select Layout","1",lst2)
              if layout = "" then
              	end
              end if
              a5_layout_design(layout,vtype)
              xbasic_wait_for_idle(2) ' adding this here worked
              ptr = obj(layout)
              ptr.close()
              Robin

              Discernment is not needed in things that differ, but in those things that appear to be the same. - Miles Sanford

              Comment


                #8
                Re: Cluttered Code Editor

                At least it's nice to see that I'm not the only one who can experience this behavior. I do have the AIMS App Analyzer for my use - but I do not have Cal's source code. While I am the only one who uses AIMS where I work, this was meant to be a more universal search script for others to use - not requiring AIMS to be updated for every application.

                If anyone else wants to see it "stripped down" as you have done, here is a shorter script which does the same:

                Code:
                'Date Created: 05-Sep-2014 10:02:18 AM
                'Last Updated: 05-Sep-2014 10:13:38 AM
                'Created By  : Stephen Andrews
                'Updated By  : Stephen Andrews
                
                'Place 2-5 of the form names of your application here:
                cList= <<%aaa%
                Form_01
                Form_02
                Form_03
                %aaa%
                
                dim bCluttered as L = .T.			'Set to .T. to experience the bizarre behavior. 
                
                if bCluttered
                	'NOTE:  This is what I experienced in my original script.  It will generate a
                	'			DragDropList for every form loaded.
                	
                	'debug(1)
                	for j = 1 to line_count(cList)
                		cLyt = word(cList,j,crlf())
                		
                		pLyt = a5_layout_design(cLyt,"FORM")
                		'pLyt = Form.Load(cLyt)
                		pLyt.close()
                		xbasic_wait_for_idle()
                	next j	
                	'debug(0)
                else
                	'NOTE:	 While this approach works more smoothly, it fires the form's OnInit script plus
                	'		   more.  This can cause problems when a form depends on setup conditions such
                	'		   as global variables being set a certain way.
                	
                	'debug(1)
                	for j = 1 to line_count(cList)
                		cLyt = word(cList,j,crlf())
                		
                		'pLyt = a5_layout_design(cLyt,"FORM")
                		pLyt = Form.Load_Low(cLyt)
                		pLyt.close()
                		xbasic_wait_for_idle()
                	next j	
                	'debug(0)
                end if
                As you see, in addition to the questionable coding which uses A5_layout_design(), you can switch it to using Form.Load_Low() by toggling the bCluttered logical variable. That approach did avoid the multiple DragDropLists. However, I ran into other problems within UDF's which, say, were called by the form's OnInit script.

                You're right that Cal would know the workaround if anybody did.

                Steve

                Comment


                  #9
                  Re: Cluttered Code Editor

                  I placed the xb wait for idle BEFORE the ptr.close() - that seems to be where the timing issue might be. In fact I put it before I tried to get the pointer for the object I wanted to close. See if that makes any difference.
                  Robin

                  Discernment is not needed in things that differ, but in those things that appear to be the same. - Miles Sanford

                  Comment


                    #10
                    Re: Cluttered Code Editor

                    THANK YOU, Robin!!!

                    That did the trick! Since my original routine goes through all of the objects of every layout (searching for the substring within text and RTF objects) before it closes, I thought it had plenty of time to fully load the layout. My inclination was, therefore, to put the Xbasic_wait_for_idle() after the close() to give it more time before loading the next layout. But moving it to preceed the close() was the solution. Thank you, again.

                    Steve

                    Comment


                      #11
                      Re: Cluttered Code Editor

                      I'm really glad I could help - you presented an interesting task for sure. I take it your users would like to change some of the field labels on your forms? Or what is the intended use - I am curious...
                      Robin

                      Discernment is not needed in things that differ, but in those things that appear to be the same. - Miles Sanford

                      Comment


                        #12
                        Re: Cluttered Code Editor

                        Thank you again, Robin. As stated in some commented notes near the beginning of the code, the original use was when the agency director changed her name. There are plenty of letters in one application many of which had her old name hardcoded for a signature. I had to go through all of the reports and letters to search for the old name.

                        Right now, a similar use has surfaced. We will be moving to a new building within the coming month(s). As you would expect, the agency address is hardcoded frequently and I must find out where. Wherever I find the current address, I am replacing it with a lookup to a table where I have the address stored. This way, whenever the move is official, I will only have to change the address on the table to update all of the affected layouts.

                        While I find Cal's AIMS App Analyzer very helpful when searching layouts for script coding, calculated fields, and the like, it cannot (to my knowledge) search text objects and RTF objects for substrings. That is the purpose of this utility. I also have developed a similar utility for searching operations (for field expressions, paths of files, etc.). Thus, when you change the location of a file, how do you know whether an operation has the old location specified for the transaction file? You can open, scan, and close every operation if you like. Also, a changed global variable or UDF could be referenced in a field expression for an operation.

                        I hope that this answers your question about the use of this utility.

                        Steve

                        Comment


                          #13
                          Re: Cluttered Code Editor

                          Yes it does, thanks. I can see how useful this could be.
                          Robin

                          Discernment is not needed in things that differ, but in those things that appear to be the same. - Miles Sanford

                          Comment

                          Working...
                          X