Frage deutsch
~~~~~~~~~~~~
Wie kann ich Tastatureingaben fester Länge programmieren?
(Ersatz des INPUT-Befehls)
 

Question English
~~~~~~~~~~~~~~
How To Do Controlled Text Input in QBasic with Limited Length?
 

Antwort 1
~~~~~~~~~
[ von Thomas Antoni, 1999 - 4.5.2002 ]
Ob Du es glaubst oder nicht, dies ist eine der am allermeisten zu QBasic gestellten Fragen! Mit den Sprachmitteln von QBasic kann man nicht direkt eine auf eine bestimmte Anzahl von Zeichen beschränkte Eingabe realisieren. Dazu muss man sich selber eine nette kleine Eingaberoutine basteln und statt des INPUT-Befehl verwenden.
Mein untenstehendes Programm INTEXT2.BAS zeigt ganz gut das Prinzip auf. Es ist leicht nachzuvollziehen, aber relativ unkomfortabel.
Mein zweites, ebenfalls unten aufgeführtes Program INTEXT.BAS ist eine komfortablere, flexibel zu verwendende Eingaberoutine.
EditLine von Pawel Kazakow ist wohl die komfortabelste Eingaberoutine in QBasic, aber auch sehr komplex. EditLine steht auf Pawels Homepage http://www.pkworld.de zum Herunterladen bereit.
Das unten in "Answer 2" aufgeführte sehr gute Programm SHOPLIST.BAS demonstriert, wie man Datenbankeingaben in feste Felder eines Bildschirmformulars realisieren kann
 
*** Programm INTEXT2.BAS von Thomas Antoni
Die SUB intext$ kann anstelle des INPUT-Befehls verwendet werden. Der Übergabeparameter length% legt die Länge des Eingabefeldes fest. Das aufrufende Programm ist dafür verantwortlich, den Cursor an die Eingabestelle zu setzen und die Farbe des Eingabefeldes zu definieren.
 
Zurückgeliefert wird der eingegebene Text als String. Zahlenwerte lassen sich durch VAL(intext$) aus dem String ableiten, z.B. VAL("3.2") = 3.2 .
 
Die Funktion intext$ gestattet über die Zurück-Taste (Backspace) das Löschen des zuletzt eingegebenen Zeichens und mit Esc das Löschen des gesamten Eingabefeldes. Außerdem wird durch die "1" im Befehl LOCATE y, x, 1 der Cursor jeweils an die richtige Eingabestelle gesetzt. Weitere Editierfunktionen gibt es nicht. Damit ist INTEXT2.BAS aber schon wesentlich leistungsfähiger als die meisten in den Foren kursierenden Programmvorschläge.
 
'****************************************************************************
' INTEXT2.BAS = QBasic-Function zur Tasteneingabe definierter Laenge
' =====================================================================
' Ersetzt den INPUT-Befehl. An die FUNCTION intext$() wird die Laenge
' des Eingabefeldes uebergeben. intext$() realisiert dann eine auf diese
' Laenge begrenzte Tastatureingabe. Mit der Backspace-Taste laesst sich der
' Eingabtext editieren. Esc loescht das Eingabefenster.
'
' \ (c) Thomas Antoni, 4.5.02 - 5.11.02
' \ /\ Mailto:thomas@antonis.de
' ( ) http://www.antonis.de
' .( o ).
' ----==== Hottest QBasic Stuff on Earth !!! ====----
'
'****************************************************************************
DECLARE FUNCTION intext$ (length%)
DO
CLS
PRINT "Gib einen max. 12 Zeichen langen Text ein :": PRINT
COLOR 11
t$ = intext$(12)
COLOR 7
LOCATE 5: PRINT "Du hast " + t$ + " eingegeben"
PRINT : PRINT " <wiederholen mit beliebiger Taste | Abbruch mit Esc >"
DO: key$ = INKEY$: LOOP WHILE key$ = ""
IF key$ = CHR$(27) THEN END
LOOP
'
FUNCTION intext$ (length%)
column% = POS(0) 'Cursor-Spaltenposition sichern
text$ = "": key$ = ""
PRINT "[" + SPACE$(length%) + "]"; 'Eingabefeld anzeigen
DO
SELECT CASE key$
CASE CHR$(13): EXIT DO 'Eingabetaste -> Ende der Eingabe
CASE CHR$(27): text$ = "" 'Esc -> Text loeschen
CASE CHR$(8) 'Backspace-Taste
IF LEN(text$) > 0 THEN 'Falls Textlaenge > 0 ...
text$ = LEFT$(text$, LEN(text$) - 1) '... Text um 1 Zeichen kuerzen
END IF
CASE CHR$(29) TO CHR$(255) 'alfanumerisches Zeichen?
IF LEN(text$) = length% THEN 'hat Text schon die volle Laenge
text$ = LEFT$(text$, LEN(text$) - 1) + key$ 'letztes Zeichen austauschen
ELSE
text$ = text$ + key$ 'ansonsten Tastenzeichen anfuegen
END IF
END SELECT
LOCATE , column% + 1: PRINT SPACE$(length%); 'altem Text loeschen
LOCATE , column% + 1: PRINT text$; 'Neuen Text anzeigen
x% = LEN(text$) 'relative Cursorposition
IF x% = length% THEN x% = x% - 1 'Eingabefeld voll-> Cursor aufs letzte Zeichen
LOCATE , column% + x% + 1, 1 'Cursor anzeigen
DO: key$ = INKEY$: LOOP WHILE key$ = "" 'Warten bis Taste betaetigt
LOOP
intext$ = text$
END FUNCTION
 
Das obige Programm steht im Verzeichnis Progs\ zur Verfügung sowie online unter www.antonis.de/faq/progs/intext2.bas .
 
*** Programm INTEXT.BAS von Thomas Antoni
Dies Programm ist wesentlich komfortabler und ansprechender gestaltet als Intext2:
 
'****************************************************************************
' INTEXT.BAS = QBasic-Function zur Tasteneingabe definierter Laenge
' =====================================================================
' Die eigentliche Funktionalität ist in der FUNCTION Intext$ hinterlegt.
' Das Hauptprogramm ist eine kleine Demo für Intext$ .
'
' \ (c) Thomas Antoni, 12.07.99 - 18.2.04
' \ /\ Mailto:thomas@antonis.de
' ( ) http://www.antonis.de
' .( o ).
' ----==== Hottest QBasic Stuff on Earth !!! ====----
'
'
'****************************************************************************
DECLARE FUNCTION Intext$ (length%)
'
DO
CLS
LOCATE 4
PRINT " -----===== Willkommen zu Intext$! =====-----"
PRINT
PRINT " Gib einen 14 Zeichen langen Text ein:"
LOCATE 10, 8
'-------------------------
eingabe$ = Intext$(14)
'-------------------------
COLOR 15, 0 'Farbe wieder Weiss auf Schwarz
LOCATE 15, 2
IF eingabe$ = CHR$(27) THEN
PRINT "Du hast die Eingabe mit Esc abgebrochen,";
PRINT "und es wurde CHR(27) zurueckgeliefert"
ELSE
PRINT "Du hast folgendes eingegeben:"
LOCATE 17, 8
PRINT eingabe$
END IF
LOCATE 20, 2
PRINT "Wiederholung mit beliebiger Taste, Abbruch mit Esc"
DO: taste$ = INKEY$
LOOP WHILE taste$ = ""
LOOP WHILE taste$ <> CHR$(27)
CLS
LOCATE 12, 8
PRINT "Danke, dass Du Intext$ ausprobiert hast!"
SLEEP 1
END
FUNCTION Intext$ (length%)
'*****************************************************************************
' Intext$ (length%) - QBasic Funktion zur Tastatureingabe begrenzter Laenge
' ============================================================================
' Diese Funktion ersetzt den INPUT-Befehl und ermoeglicht Tastatur-Eingaben
' definierter Laenge.
' Die Funktion liefert maximal length% alphanumerische Text-Zeichen zurueck,
' die ber die Tastatur eingeben werden koennen. Die Tastatureingabe wird
' mit der Enter-Taste abgeschlossen. Ein Editieren des Eingabetextes ist
' mit der Backspace-Taste moeglich. šber die Esc-Taste laesst sich eine
' Eingabe abbrechen; in diesem Falle liefert Intext den Wert CHR(27) zurueck
' (ASCII- Code von Esc).
' Die Cursortasten sowie Delete, Home und End werden nicht ausgewertet.
' Das Eingabefeld erscheint als blauer Kasten auf den Bildschirm. Das Echo
' der eingegebenen Zeichen erfolgt in gelb.
'
' Das aufrufende Programm ist dafuer verantwortlich
' - den Cursor vor dem Aufruf richtig zu setzen (z.B. mit LOCATE)
' - nach Abschluss der Funktion die alten Bildschirmfarben wiederher-
' zustellen
' - den Abbruch der Eingabe durch die Esc-Taste zu bearbeiten (in diesem
' Fall ist der Ruecklieferwert CHR$(27) ).
'
' (c) Thomas Antoni, 12.07.99 - 5.11.02
'****************************************************************************
COLOR 14, 3 'gelb auf cyan
begin% = POS(0): row% = CSRLIN 'Cursorposition Spalte/Zeile sichern
text$ = "": key$ = ""
DO
'------------------ Enter- und Esc-Taste bearbeiten -------------------------
IF key$ = CHR$(13) THEN EXIT DO 'Ende wenn Enter betaetigt
IF key$ = CHR$(27) THEN 'bei Abbruch ASCII-Zeichen von Esc
text$ = CHR$(27) 'zurueckliefern
EXIT DO
END IF
'------------------------ Backspace-Taste bearbeiten ------------------------
IF key$ = CHR$(8) AND LEN(text$) > 0 THEN 'Backspace und Textlaenge > 0 ?
text$ = LEFT$(text$, LEN(text$) - 1) 'Text um 1 Zeichen kuerzen
'-------------------------- andere Tasten bearbeiten ------------------------
ELSEIF key$ > CHR$(29) AND key$ < CHR$(255) THEN 'alfanum. Taste?
IF LEN(text$) = length% THEN 'Text hat schon die volle Laenge
text$ = LEFT$(text$, LEN(text$) - 1) + key$ 'letztes Zeichen austauschen
ELSE
text$ = text$ + key$ 'ansonsten Tastenzeichen anfuegen
END IF
END IF
'--------------- text$ und Cursor auf Bildschirm ausgeben -------------------
LOCATE row%, begin%: PRINT SPACE$(length%); 'Eingabefeld loeschen/blau faerben
LOCATE , begin%: PRINT text$; 'Text ausgeben
IF LEN(text$) < length% THEN csrpos% = POS(0) ELSE csrpos% = POS(0) - 1
LOCATE row%, csrpos%, 1, 1 'Cursor ausgeben
DO: key$ = INKEY$: LOOP WHILE key$ = "" 'warten bis Taste betaetigt
LOOP
LOCATE , , 0 'Cursor wieder deaktivieren
Intext$ = text$
END FUNCTION
 
 
Das obige Programm steht im Verzeichnis Progs\ zur Verfügung sowie online unter www.antonis.de/faq/progs/intext.bas .

 

Answer 2
~~~~~~~~
[ by Wouter Bergmann Tiest W.M.BergmannTiest*fys.ruu.nl 8th December 1995]
 
Below please find the program SHOPLIST.BAS which demonstrates how to realize limited-length keyboard inputs in several fields on the sreen, e.g. in a database input sheet.
 
In many situations, the standard input statements INPUT$ or LINE INPUT$ are not adequate. The length of the text cannot be limited, so your screen layout may become cluttered. Also, the program only continues when the Enter-key is pressed, and in many situations, it can be useful to be able to react to other keypresses as well.
 
The EDIT-function enables you to control the length of the input field, provide a default text and react to arrow keys, PgUp, PgDn, function keys, Esc and Enter. For the user, it gives full text editing possibilities, including Insert/Typeover switching with Insert and character erasing with Backspace and Delete.
 
The Edit-function is included in a demonstration program, SHOPLIST.BAS, which clearly illustrates the use of the function. The arguments of the function are three integers: the screen row and column of the first character of the input field, and the length of the input field. The fourth argument should be a string variable of sufficient length to hold the text. Note that the function changes the contents of this variable to the text put in. The return value is the ASCII-value or the scan code of the key that was used to end the input. Use the constants that are defined at the start of the program to compare the return value with, as shown in SHOPLIST.BAS. FgCol and BgCol are constants defining the foreground and background colors.
 
*** Program SHOPLIST.BAS
 
'***************************************************************************
' SHOPLIST.BAS Demo fuer laengenbegrenzte Tastatureingaben in Tabellenfelder
' ============
' Edit function for easy input of strings.
'
' (c) Wouter Bergmann Tiest <W.M.BergmannTiest*fys.ruu.nl>
' 8th December 1995
'***************************************************************************
'To use this function, replace the code between the dashed lines with your
'own.
'
DEFINT A-Z
DECLARE FUNCTION Edit (Column, Row, Length, Text$)
'
'Colours (light grey and blue) and ASCII or scan codes of keys
CONST FgCol = 7, BgCol = 1, Enter = 13, Escape = 27, UpArrow = 72
CONST DownArrow = 80, LeftArrow = 75, RightArrow = 77, Home = 71
CONST EndKey = 79, Ins = 82, Del = 83, Backspace = 8
'
'----------------------------------------------------------------------------
'The following code is an example of the use of the Edit function.
'It is an input routine for a shopping list, with two fields:
'Item and Price. After input, the list is printed on screen.
'
'The dimensions of the shopping list
CONST ItemLength = 20, PriceLength = 10, NumberOfItems = 10
CONST FirstRow = 5, ItemColumn = 5, PriceColumn = ItemColumn + ItemLength + 2
CONST NumberOfFields = 2, ItemField = 1, PriceField = 2
'
'The items and prices are stored in two arrays
DIM Item$(1 TO NumberOfItems), Price$(1 TO NumberOfItems)
'
'The screen is set up
COLOR FgCol, BgCol
CLS
PRINT "Please enter your shopping list below."
PRINT "Use arrow keys, Enter, Ins, Del, Home, End and BackSpace for editing."
PRINT "Press Escape when ready."
LOCATE FirstRow, ItemColumn
PRINT "Item"
LOCATE FirstRow, PriceColumn
PRINT "Price"
FOR Counter = 1 TO NumberOfItems
LOCATE Counter + FirstRow, 1
PRINT USING "##."; Counter
NEXT Counter
'
'Initial values
FieldCounter = ItemField
ItemCounter = 1
'
'Main loop of input routine
DO
SELECT CASE FieldCounter
CASE ItemField
KeyPressed = Edit(ItemColumn, ItemCounter + FirstRow, ItemLength, Item$(ItemCounter))
CASE PriceField
KeyPressed = Edit(PriceColumn, ItemCounter + FirstRow, PriceLength, Price$(ItemCounter))
END SELECT
SELECT CASE KeyPressed
CASE UpArrow
ItemCounter = ItemCounter - 1
IF ItemCounter < 1 THEN ItemCounter = NumberOfItems
CASE DownArrow
ItemCounter = ItemCounter + 1
IF ItemCounter > NumberOfItems THEN ItemCounter = 1
CASE Enter
FieldCounter = FieldCounter + 1
IF FieldCounter > NumberOfFields THEN
FieldCounter = 1
ItemCounter = ItemCounter + 1
IF ItemCounter > NumberOfItems THEN ItemCounter = 1
END IF
END SELECT
LOOP UNTIL KeyPressed = Escape
'
'Printing the data
CLS
PRINT "This is your shopping list:"
PRINT
FOR Counter = 1 TO NumberOfItems
PRINT USING "##."; Counter;
LOCATE , ItemColumn
PRINT Item$(Counter);
LOCATE , PriceColumn
PRINT Price$(Counter)
NEXT Counter
'
END
'----------------------------------------------------------------------------
FUNCTION Edit (Column, Row, Length, Text$)
'This function takes two screen coordinates (Row, Column) and paints an
'edit field in reverse video of length Length with Text$ as default value.
'The text can be edited using the left and right arrow keys, Home, End, Del
'and Backspace. Ins switches between insert mode (default) and typeover mode.
'On completion, the parameter Text$ contains the edited string.
'The function returns the ASCII or scan code of the key that was used to
'end the editing (can be up or down arrow, Enter or Escape).
'
'Initial values
KeyPressed = 0
InsertSwitch = -1 'True
COLOR BgCol, FgCol
Position = LEN(Text$)
'
'Main loop
DO
LOCATE Row, Column, 0
PRINT Text$; SPACE$(Length - LEN(Text$));
IF InsertSwitch = -1 THEN
LOCATE Row, Position + Column, 1, 7, 8 'Line cursor
ELSE
LOCATE Row, Position + Column, 1, 0, 8 'Block cursor
END IF
DO
Key$ = INKEY$
LOOP WHILE Key$ = ""
SELECT CASE ASC(Key$)
CASE Escape
KeyPressed = Escape
CASE Enter
KeyPressed = Enter
CASE Backspace
IF Position > 0 THEN
Text$ = LEFT$(Text$, Position - 1) + RIGHT$(Text$, LEN(Text$) - Position)
Position = Position - 1
END IF
CASE 0 'Extended codes
SELECT CASE ASC(RIGHT$(Key$, 1))
CASE Home
Position = 0
CASE LeftArrow
IF Position > 0 THEN Position = Position - 1
CASE RightArrow
IF Position < LEN(Text$) THEN Position = Position + 1
CASE EndKey
Position = LEN(Text$)
CASE Del
IF Position < LEN(Text$) THEN Text$ = LEFT$(Text$, Position) + RIGHT$(Text$, LEN(Text$) - Position - 1)
CASE Ins
InsertSwitch = -1 - InsertSwitch
CASE UpArrow
KeyPressed = UpArrow
CASE DownArrow
KeyPressed = DownArrow
END SELECT
CASE IS >= 32 'Normal characters
IF InsertSwitch = -1 THEN
IF LEN(Text$) < Length THEN
Text$ = LEFT$(Text$, Position) + Key$ + RIGHT$(Text$, LEN(Text$) - Position)
Position = Position + 1
END IF
ELSEIF Position < Length THEN
IF Position = LEN(Text$) THEN
Text$ = Text$ + Key$
ELSE
MID$(Text$, Position + 1, 1) = Key$
END IF
Position = Position + 1
END IF
END SELECT
LOOP UNTIL KeyPressed > 0
LOCATE Row, Column, 0
COLOR FgCol, BgCol
PRINT Text$; SPACE$(Length - LEN(Text$));
Edit = KeyPressed
END FUNCTION
 
This programm is available in the Progs\ directory and online under www.antonis.de/faq/progs/shoplist.bas .
 
 

Answer 3
~~~~~~~~~~~~
[ KELLY MUNDELL, July 29, 1993 ]
 
Following is a full line-editing subroutine that myself and programming partner James Parchen developed and refined over the last couple of years:
 

'***********************************************************************
' INTEXT5.BAS = Full Line-Editing Routine
' =========== Komfortable Eingaberoutine, ersetzt den INPUT-Befehl
'
' Deutsche Beschreibung
' ---------------------
' (von Thomas Antoni, 12.3.2006)
' Dieses Q(uick)Basic-Programm enthaelt eine komfortable Eingaberoutine,
' die den INPUT-Befehl ersetzt. Es ermoeglich eine Tastatureingabe mit
' definierter Laenge. Folgende Editeirtasten werden unterstuetzt:
' Cursor rechts/links, Backspace, Entf, Einfg, Esc und Eingabetaste.
' Den Sinn des Parameters Mask$ habe ich nicht verstanden :))
'
' English Description
' -------------------
' Following is a full line-editing subroutine that myself and
' programming partner James Parchen developed and refined over the
' last couple of years.
'
' (c) KELLY MUNDELL, July 29, 1993 - Released into public domain
'************************************************************************
'
DECLARE SUB KeyIn (Ver$, Ln$, Mask$, Fg%, Bg%, p%)
'
CLS
LOCATE 2, 2
CALL KeyIn("ALL", SPACE$(22), "", 0, 15, 0)
'22 Zeichen langes Eingabefeld mit schwarzer Schrift (0) auf weissem
'Hintergrund (15)
'
COLOR 7, 0
LOCATE 10, 2
PRINT "Your input was: "
LOCATE 11, 2
PRINT text$
SLEEP
END
DEFINT A-Z
'
'
SUB KeyIn (Ver$, Ln$, Mask$, Fg, Bg, p)
SHARED text$
'
'----------------------------------------------------------------------
' Parameters:
' Ver$ = "ALL" All Characters
' Ver$ = "a-z" Alpha Lower Case
' Ver$ = "A-Z" Alpha Upper Case
' Ver$ = "a-Z" Alpha Case off
' Ver$ = "#'s" Numbers Only
' Ln$ = SPACE$(Number of Characters to accept; max 79)
' Mask$ = "" i.e. To Enter DOB Mask$ would be " / / "
' Fg/Bg ForeGround Color/Background Color
' p Screen Page Number
'-----------------------------------------------------------------------
DIM Chk(10)
IF Mask$ <> "" THEN
Ln$ = Mask$
FOR Chk = 1 TO LEN(Mask$)
IF MID$(Mask$, Chk, 1) <> " " THEN Temp$ = Temp$ + STR$(Chk)
NEXT Chk
Mask$ = Temp$
END IF
S = POS(0): L = LEN(Ln$): COLOR Fg, Bg: PRINT Ln$; : IF p = 0 THEN p = 1
IF p > L THEN p = L + 1
LOCATE , S + p - 1, 1, 7, 7: Temp$ = ""
Alpha$ = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
Num$ = " 0123456789"
IF UCASE$(LEFT$(Ver$, 4)) = "A-Z#" THEN Ver$ = Alpha$ + Num$ + MID$(Ver$, 5)
SELECT CASE LEFT$(Ver$, 3)
CASE "ALL": Caps = 0: Ver$ = Alpha$ + Num$ + "!@#$%^&*()-_+=\[]{};':,./<>? "
CASE "A-Z": Caps = 1: Ver$ = Alpha$ + MID$(Ver$, 4)
CASE "a-z": Caps = 2: Ver$ = Alpha$ + MID$(Ver$, 4)
CASE "a-Z": Caps = 0: Ver$ = Alpha$ + MID$(Ver$, 4)
CASE "#'s": Caps = 0: Ver$ = Num$ + MID$(Ver$, 4)
CASE ELSE: Caps = 0
END SELECT
a = 0: e = 0
WHILE a <> 13 AND a <> 27 AND a <> 10
DO
IF Caps = 0 THEN a$ = INKEY$
IF Caps = 1 THEN a$ = UCASE$(INKEY$)
IF Caps = 2 THEN a$ = LCASE$(INKEY$)
LOOP UNTIL a$ <> ""
a = ASC(a$): IF a = 0 THEN a = ASC(RIGHT$(a$, 1)) * -1
p = POS(0) - S + 1: R = POS(0)
'SCREEN , , 0, 0: COLOR 7, 0: CLS : PRINT a: END
'
SELECT CASE a
CASE -32 ' ALT-D For Dos Shell
SCREEN , , 0, 0: CLS
SHELL "Type EXIT [ENTER] To Return To Program"
SHELL
CASE -77: IF p < L + 1 THEN PRINT CHR$(28); ELSE BEEP ' Right arrow
CASE -75: IF p <> 1 THEN PRINT CHR$(29); ' Left arrow
CASE -71: LOCATE , S ' <Home>
CASE -119 ' <Ctrl+Home>
LOCATE , S: Ln$ = SPACE$(L): PRINT Ln$; : LOCATE , S
CASE -79
LOCATE , LEN(RTRIM$(Ln$)) + S ' <End>
CASE -117 ' <Ctrl+End>
Ln$ = LEFT$(Ln$, p - 1) + SPACE$(L - p + 1)
LOCATE , S, 0: PRINT Ln$; : LOCATE , R, 1
CASE -116 ' <Ctrl+RightArrow>
IF p <= L THEN
Chk = INSTR(p, Ln$, " ")
IF Chk <> 0 THEN
Temp$ = LEFT$(LTRIM$(MID$(Ln$, Chk)), 1)
IF Temp$ <> "" THEN LOCATE , S - 1 + INSTR(Chk, Ln$, Temp$), 1
ELSE
LOCATE , LEN(RTRIM$(Ln$)) + S
END IF
END IF
CASE -115 ' <Ctrl+LeftArrow>
Temp$ = RTRIM$(LEFT$(Ln$, p - 1))
IF INSTR(Temp$, " ") THEN
DO WHILE INSTR(Temp$, " ")
Chk = INSTR(Temp$, " "): MID$(Temp$, Chk, 1) = "X"
LOOP
LOCATE , Chk + S, 1
ELSE
LOCATE , S
END IF
CASE 8 ' <BackSpace>
IF p <> 1 THEN
Ln$ = LEFT$(Ln$, p - 2) + MID$(Ln$, p) + " "
LOCATE , S, 0: PRINT Ln$; : LOCATE , R - 1, 1
ELSE
Ln$ = RIGHT$(Ln$, L - 1) + " ": LOCATE , S, 0: PRINT Ln$;
LOCATE , p + S - 1, 1
END IF
CASE 127 '<Ctrl+ BckSpc>
IF p > L THEN p = L
Ln$ = SPACE$(p) + MID$(Ln$, p + 1)
LOCATE , S, 0: PRINT Ln$; : LOCATE , R, 1
CASE -83 '<Delete>
IF p <= L THEN
Ln$ = LEFT$(Ln$, p - 1) + MID$(Ln$, p + 1) + " "
LOCATE , S, 0: PRINT Ln$; : LOCATE , R, 1
END IF
CASE -82 '<Insert>
IF insert = 0 THEN insert = 1 ELSE insert = 0
IF insert = 0 THEN LOCATE , , 1, 7, 7
IF insert = 1 THEN LOCATE , , 1, 4, 7
CASE ELSE
IF INSTR(Ver$, a$) AND p <= L THEN 'Print Character
IF insert = 1 THEN
Ln$ = LEFT$(Ln$, p - 1) + a$ + MID$(Ln$, p, L - p + 1)
LOCATE , , 0: PRINT MID$(Ln$, p, L - p + 1); : LOCATE , R + 1, 1
ELSE
PRINT a$; : MID$(Ln$, p, 1) = a$
END IF
IF INSTR(Mask$, STR$(p + 1)) THEN PRINT MID$(Ln$, p + 1, 1);
ELSE IF a <> 13 AND a <> 27 THEN BEEP
END IF
END SELECT
WEND
'
IF a = 27 THEN Ln$ = SPACE$(L)
EndKeyIn:
Ln$ = RTRIM$(Ln$)
text$ = Ln$
END SUB
 
Das obige Programm steht im Verzeichnis Progs\ zur Verfügung sowie online unter www.antonis.de/faq/progs/intext5.bas .
 
 

Answer 4
~~~~~~~~~~~~~~~~~~
[ by BRIAN MCLAUGHLIN, Dec. 2, 1993 ]
 
'***************************************************************
' INTEXT6.BAS = Line Editor with adjustable input length
' =========== Eingaberoutine - Zeileneditor mit einstellbarer
' Eingabelaenge
'
' (c) by BRIAN MCLAUGHLIN, Dec. 2, 1993
'****************************************************************
DECLARE FUNCTION LineEdit$ (Row%, Col%, EntryLen%, Prompt$)
Row% = 4: Col% = 4
EntryLen% = 55 'number of spaces the entry can occupy
Prompt$ = "Write here: "
CLS
OutString$ = LineEdit$(Row%, Col%, EntryLen%, Prompt$)
LOCATE CSRLIN + 2, 4
PRINT "You said: "; OutString$
END
'====================================================
FUNCTION LineEdit$ (Row%, Col%, EntryLen%, Prompt$)
'====================================================
'
CONST TRUE = -1, FALSE = 0
'
DO: LOOP WHILE LEN(INKEY$) 'clears any impending keys
LOCATE Row%, Col%
'
PRINT Prompt$;
Col% = POS(0)
AllLength% = Col% + EntryLen%
IF AllLength% > 79 THEN EntryLen% = EntryLen% - (AllLength% - 80)
'
SHOW$ = STRING$(EntryLen%, CHR$(176)) 'use squares
PRINT SHOW$;
LOCATE Row%, Col%, 1, 7, 1 'a big cursor
'
' -----------------------------
' START OF MAIN PROCEDURE LOOP
' -----------------------------
'
DO 'it keeps going and going and going
DO
Akey$ = INKEY$ ' wait for some kind of input
LOOP UNTIL LEN(Akey$)
IF LEN(Akey$) = 1 THEN
Ky% = ASC(Akey$)
ELSE 'it must be an extended key like F1
Char2$ = RIGHT$(Akey$, 1)
Ky% = ASC(Char2$) * -1 'convert the keycode to a negative number
END IF
SELECT CASE Ky%
CASE 13 'on ENTER break out of LOOP
EXIT DO
CASE -75 ' on LEFT ARROW move left one position
IF (Cpos% > 0) THEN
Cpos% = Cpos% - 1
LOCATE Row%, Col% + Cpos%
END IF
CASE -77 ' on RIGHT ARROW move right
IF (Cpos% < length%) THEN
Cpos% = Cpos% + 1
LOCATE Row%, Col% + Cpos%
END IF
CASE -79 ' on END go to end of line
Cpos% = length%
LOCATE Row%, Col% + Cpos%
CASE -71 ' on HOME go to start of line
Cpos% = 0
LOCATE Row%, Col% + Cpos%
CASE -83 ' on a DEL keypress
IF (length% > 0) AND (Cpos% < length%) THEN
Temp1$ = LEFT$(OutPut$, Cpos%)
Temp2$ = RIGHT$(OutPut$, length% - Cpos% - 1)
OutPut$ = Temp1$ + Temp2$
length% = length% - 1
LOCATE Row%, Col%
PRINT OutPut$ + CHR$(176);
LOCATE Row%, Col% + Cpos%
END IF
CASE 8 ' on BACKSPACE
IF (length% > 0) AND (Cpos% > 0) THEN
Temp1$ = LEFT$(OutPut$, Cpos% - 1)
Temp2$ = RIGHT$(OutPut$, (length% - Cpos%))
OutPut$ = Temp1$ + Temp2$
length% = length% - 1
Cpos% = Cpos% - 1
LOCATE Row%, Col%
PRINT OutPut$ + CHR$(176);
LOCATE Row%, Col% + Cpos%
END IF
CASE 32 TO 126 'our "printable" characters
IF (length% < EntryLen%) THEN
Temp1$ = LEFT$(OutPut$, Cpos%)
Temp2$ = RIGHT$(OutPut$, length% - Cpos%)
OutPut$ = Temp1$ + CHR$(Ky%) + Temp2$
length% = length% + 1
Cpos% = Cpos% + 1
LOCATE Row%, Col%
PRINT OutPut$;
LOCATE Row%, Col% + Cpos%
END IF
END SELECT
LOOP
'
LOCATE , , 0 'turns the cursor off
LineEdit$ = OutPut$
END FUNCTION
 
Das obige Programm steht im Verzeichnis Progs\ zur Verfügung sowie online unter www.antonis.de/faq/progs/intext6.bas .

[ The QBasic-MonsterFAQ --- Start Page: www.antonis.de/faq ]