1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

CONsole SELECT

Discussion in 'Open Forum' started by Joe Caverly, Sep 10, 2011.

  1. Joe Caverly

    Joined:
    Aug 28, 2009
    Messages:
    680
    Likes Received:
    8
    Hi,
    Below is a program that I wrote, which is by no means a polished, finished product. I am just passing it along in the event someone else finds it useful like I do.

    Please feel free to make any changes or improvements to the code.

    Joe

    Code:
    ***********************************************************************
    * CON_SELECT.PRG
    *
    * Displays a console window to select a line from a file,
    *   similar to the TCC variable function @select
    *
    * After using this program to select a line, the line number is
    *   returned to the command processor via the ERRORLEVEL.
    *
    * Pressing ESC returns an ERRORLEVEL of 0 (zero).
    *
    * Refer to TEST.BTM for an example of this programs use.
    *
    * Written using the Harbour Compiler, available from
    *   http://www.harbour-project.org/
    *
    * Harbour is a free, open-source, 100% Compatible Clipper compiler
    *
    * September 2011, Joe Caverly
    ***********************************************************************
    PROC Main()
      PARAMETERS cFileName, nTop, nLeft, nBottom, nRight
    
      LOCAL cString
      LOCAL cScr
      LOCAL nCurrentLine
      LOCAL aArray := {}
    
      IF PCOUNT() < 5
        ? "USAGE: CON_SELECT FileName, Top, Left, Bottom, Right"
        QUIT
      ENDIF
    
      *
      * See if the file exists
      *
      IF FILE(cFileName)
        cString := MEMOREAD(cFileName)
      ELSE
        ? "Error reading the file"
        QUIT
      ENDIF
    
      SETCOLOR("W+/N, BG+/B, , , W/N")
      
      cScr := SAVESCREEN( VAL(nTop)-1, VAL(nLeft)-1, VAL(nBottom)+1, VAL(nRight)+1 )
    
      @ VAL(nTop)-1, VAL(nLeft)-1 to VAL(nBottom)+1, VAL(nRight)+1  
      
      nLines := MLCOUNT(cString)
      nLineLength := VAL(nRight)
    
      FOR nCurrentLine := 1 TO nLines
        AADD(aArray, MEMOLINE(cString, nLineLength, nCurrentLine, , ))
      NEXT
    
      nPosition := ACHOICE( VAL(nTop), VAL(nLeft), VAL(nBottom), VAL(nRight), aArray)
      
      RESTSCREEN( VAL(nTop)-1, VAL(nLeft)-1, VAL(nBottom)+1, VAL(nRight)+1, cScr )
      
      ERRORLEVEL(nPosition)
    RETURN
    With harbour installed (I am using Version 3), you build the above program into an EXE by issuing the following;

    Code:
    hbmk2 -shared -strip con_select.prg
    
    Code:
    ::*****************************************
    ::* TEST.BTM
    ::*
    ::* Demonstrates how to use CON_SELECT.EXE
    ::*****************************************
    @setlocal
    @echo off
    set thefile=con_select.prg
    con_select.exe %thefile 5 7 20 180
    set theline=%?
    iff %theline gt 0 then
      echo %@line[%thefile, %@eval[%theline-1]]
    else
      echo No selection was made
    endiff
    msgbox ok "ERRORLEVEL" %?
    endlocal
     

Share This Page