Kirjautuminen

Haku

Tehtävät

Koodit: QB: Kehittyneempi Input-funktio

Kirjoittaja: Huoh

Kirjoitettu: 27.07.2002 – 27.07.2002

Tagit: teksti, koodi näytille, vinkki

Tässäpä tuollainen (LINE) INPUT korvike/tappaja/haastaja/whateva, elikäs hyvin yksinkertainen tekstineditointirutiini/komentorivieditori (pienillä lisäyksillä saa helposti esim. lisättyä listan, josta voi plärätä aikaisempia tekstejä, vrt. komentorivihistoria).

Tukee nuolinäppäimiä, inserttiä, deletee, home & end nämisköitä. ^U:lla saa tyhjennettyä koko tekstin. Lisäksi syötteen muotoa voi rajata hyväksyttävien merkkien muodossa.

DECLARE FUNCTION GetText% (Txt$, MaxLen%, VisLen%, Acc$)
DECLARE FUNCTION GetShiftStatus% ()
DECLARE SUB Delete (st$, p%, l%)
DECLARE SUB Insert (st$, i%, c$)

WIDTH 80, 50

Txt$ = "Hei äiti, olen intter Netissä"
PRINT "Kerro jotain? ";
IF (GetText%(Txt$, 80, 30, "")) THEN
    PRINT
    PRINT "Kiitos. Kirjoitit '" + Txt$ + "'"
ELSE
    PRINT
    PRINT "Ei vaengaellae"
END IF

SUB Delete (st$, p%, l%)
    st$ = LEFT$(st$, p% - 1) + MID$(st$, p% + l%)
END SUB

FUNCTION GetShiftStatus%
    DEF SEG = &H40
    GetShiftStatus% = PEEK(&H17)
    DEF SEG
END FUNCTION

'   GetText - (LINE) INPUT:in korvike
'
'   Parametrit:
'       Txt$        muokattava teksti
'       MaxLen%     tekstin maksimipituus
'       VisLen%     näytöllä näkyvien merkkien määrä ts. kentän pituus
'       Acc$        merkkijono, jossa on kaikki ne merkit, jotka kelpaa-
'                   vat syötteeksi. esim. jos Acc$ = "0123456789" niin
'                   muokattavaan merkkijonoon kelpuutetaan vain numerot.
'
'   Toimintonäppäimet:
'       <-, ->,
'       Home, End   navigointi
'       Del         merkin poisto
'       Ins         korvaus/lisäys (oletuksena lisäys)
'       Backspace   edellisen merkin poisto
'       Ctrl+U      puskurin tyhjennys
'
'   Paluuarvo:
'       0           ESC painettu, Txt$:n arvoa EI MUUTETTU
'       1           ENTER painettu, Txt$:n arvo päivitetty
'
FUNCTION GetText% (Txt$, MaxLen%, VisLen%, Acc$)
    X% = POS(0)
    Y% = CSRLIN

    CurPos% = LEN(Txt$) + 1
    DispStart% = 1
    Done% = 0
    Ins% = 1

    Accept$ = Acc$
    IF (Acc$ = "") THEN
        FOR i% = 0 TO 255: Accept$ = Accept$ + CHR$(i%): NEXT i%
    END IF

    IF (MaxLen%) THEN Buf$ = LEFT$(Txt$, MaxLen%) ELSE Buf$ = Txt$

    WHILE Done% = 0

        IF (VisLen%) THEN   ' rullausta tarvittaessa
            IF (CurPos% < DispStart%) THEN DispStart% = CurPos%
            IF (CurPos% > DispStart% + VisLen% - 1) THEN
                DispStart% = CurPos% - VisLen% + 1
            END IF
        END IF

        ' teksti ruudulle
        LOCATE Y%, X%, 0
        IF (VisLen%) THEN
            LOCATE Y%, X%, 0: PRINT SPACE$(VisLen%);
            LOCATE Y%, X%, 0:
            PRINT MID$(Buf$, DispStart%, VisLen%);
        ELSE
            PRINT Buf$ + " ";
        END IF

        ' tekstin mennessä yli ruudun oikeasta reunasta onnistuu
        ' kursorin kohdistaminen seuraavilla koordinaateilla
        '
        ' TempX% = (X% + (CurPos% - DispStart% - 1)) MOD 80 + 1
        ' TempY% = (X% + (CurPos% - DispStart% - 1)) \ 80 + 1
        '
        ' ... joista ei kuitenkaan ole hyötyä niin kauan, kun
        ' tulostetaan teksti PRINT:llä, joka tasaa tekstin
        ' vitulleen kun teksti menee ruudun oikean reunan yli

        LOCATE Y%, X% + (CurPos% - DispStart%), 1, 14 - (Ins% XOR 1) * 14, 15

        ' odota napi
        Key$ = "": WHILE Key$ = "": Key$ = INKEY$: WEND

        SELECT CASE Key$
            CASE CHR$(8)        ' backspace
                IF (CurPos% > 1) THEN
                    CurPos% = CurPos% - 1
                    CALL Delete(Buf$, CurPos%, 1)
                END IF

            CASE CHR$(27)       ' ESC, peruuta
                GetText% = 0
                Done% = 1

            CASE CHR$(13)       ' ENTER, ok
                GetText% = 1
                Txt$ = Buf$
                Done% = 1

            CASE CHR$(21)       ' C-U
                Buf$ = ""
                CurPos% = 1

            CASE CHR$(0) + "G"  ' Home
                CurPos% = 1

            CASE CHR$(0) + "O"  ' Home
                CurPos% = LEN(Buf$) + 1
                IF (CurPos% > MaxLen%) THEN CurPos% = MaxLen%

            CASE CHR$(0) + "K"  ' <-
                IF (CurPos% > 1) THEN
                    CurPos% = CurPos% - 1
                END IF

            CASE CHR$(0) + "M"  ' ->
                IF (CurPos% <= LEN(Buf$)) THEN
                    CurPos% = CurPos% + 1
                END IF

            CASE CHR$(0) + "S"  ' Delete
                CALL Delete(Buf$, CurPos%, 1)

            CASE CHR$(0) + "R"  ' Lisäys/korvaus
                Ins% = Ins% XOR 1

            CASE ELSE
                IF (INSTR(Accept$, Key$) > 0) THEN
                    IF (Ins%) THEN
                        IF (LEN(Buf$) < MaxLen%) THEN
                            CALL Insert(Buf$, CurPos%, Key$)
                            CurPos% = CurPos% + 1
                        END IF
                    ELSE
                        MID$(Buf$, CurPos%, 1) = Key$
                        IF (CurPos% < MaxLen%) THEN CurPos% = CurPos% + 1
                    END IF
                END IF
        END SELECT
    WEND
    LOCATE Y%, X%
END FUNCTION

SUB Insert (st$, i%, c$)
    st$ = LEFT$(st$, i% - 1) + c$ + MID$(st$, i%)
END SUB

Kommentit

Antti Laaksonen [29.07.2002 10:44:22]

#

Toimiva ja käyttökelpoinen aliohjelma, QuickBasic 7.1:lle ei tosin kelvannut aliohjelmien Delete ja Insert nimet.

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta