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 SUBToimiva ja käyttökelpoinen aliohjelma, QuickBasic 7.1:lle ei tosin kelvannut aliohjelmien Delete ja Insert nimet.