'Linefeed-Error in last screenline nearly corrected.. Function InputLn(byVal s As String, _ 'message string byVal Sys As String="$", _ 'indicator for input type byVal Upper As Integer=1=0, _ 'Flag to automatically UCase-Chrs byVal pw As String="", _ 'to provide a passwordmask byVal AddLf As Integer=1=1, _ 'flag for adding a linefeed after input or not.. byVal Comma As String=",", _ 'if desired place an alternative chr for '.' here.. byVal Edit As String="") As String '¸2007 by ytwinky, MD without any warranty.. Var BS=!"\8", Cr=!"\r", Esc=!"\27", Teb=!"\9", Del=!"\127", FunChr=!"\255" Var SysChar="0123456789ABCDEF", NumChar="", r="", m="", c="", p="" Var CurFG=LoWord(Color), CurBG=HiWord(Color), ScrX=0, ScrY=0, CurX=0, Ins=1=1, NumSys=0, i=0, DoIt=0 If pw<>"" Then pw=Chr(pw[0]) If s<>"" Then Print s; 'Hmmmm, wie wär's hier mit 'ner Art Stacklift.. Sys=UCase(Sys) If Instr("$PBOHD", Sys)=0 Then Sys="$" If Instr("$P", Sys)=0 Then NumSys=-2*(Sys="B")-8*(Sys="O")-16*(Sys="H") If NumSys=0 Then NumSys=10 End If ScrX=Pos() ScrY=CsrLin CurX=1 r=Edit Do 'it now.. Locate ScrY+DoIt, ScrX, 0 DoIt=ScrY=HiWord(Width) If pw="" Then Print r; Else Print String(Len(r), pw) Locate ScrY+DoIt, ScrX+CurX-1, 1 If NumSys Then Upper=1=1 Do '@1st get a char.. c=Inkey 'Don't change cases(not yet..) Sleep 1 If Upper Then c=UCase(c) 'now is the time.. Loop Until c<>"" 'W8 until a char is available(may be more..) If InStr(BS &Cr &Esc &Teb, c) Then c=FunChr &c ' manipulate single 'editing' chars If Len(c)>1 Then 'equal goes it loose..(H.Lübke) Select Case UCase(Right(c, 1)) 'Stringediting.. Case Chr(71) 'Home, ok CurX=1 Case Chr(79) 'End, ok CurX=Len(r)+1 Case Chr(75) 'Left, ok CurX+=CurX>1 Case Chr(77) 'Right, ok CurX+=Abs(CurX0 Then Select Case NumSys Case 2 If Left(r, 1)<>"&" Then r="&B" &r Case 8 If Left(r, 1)<>"&" Then r="&O" &r Case 10 If Left(r, 2)="&D" Then r=Mid(r, 3) i=InStr(r, "^") If i>1 Then 'okay evaluate it.. r=Str(Val(Left(r, i-1))^Val(Mid(r, i+1))) 'no error checking yet, only works if entered correctly.. End If Case 16 If Left(r, 1)<>"&" Then r="&H" &r End Select End If Return r '..and now return it Case BS, Del 'Del, ok If CurX=1 Then 'could be done by a sub =>another function r=Mid(r, 2) Else r=Left(r, CurX-2) &Mid(r, CurX) End If Locate ScrY+DoIt, ScrX Print r;" " CurX+=CurX>1 End Select Else 'okay, input only If Sys<>"$" Then Select Case UCase(c) Case "&" ' ok If CurX<>1 Or InStr(r, c) Then c="" Case "B" ' ok If CurX<>2 Or InStr(r, c) Then c="" If InStr(r, "&H") Then c="B" NumSys=2 Case "D" ' ok If CurX<>2 Or InStr(r, c) Then c="" If InStr(r, "&H") Then c="D" NumSys=10 Case "H" ' ok If CurX<>2 Or InStr(r, c) Then c="" NumSys=16 Case "O" ' ok If CurX<>2 Or InStr(r, c) Then c="" NumSys=8 Case Comma, "." 'Michael Frey requested it.., ok c="." If InStr(r, c) Or NumSys<>10 Then c="" Case "^" 'my hobby ;-)), ok If InStr(r, c) And NumSys<>10 Then c="" Case "E" 'only valid for decimals AND in Hex.., ok Select Case NumSys Case 10 'only one E allowed.. If InStr(r, c) Then c="" Case 16 'just put it into r Case Else 'not allowed.. c="" End Select Case "-" 'only for decimals, ok If NumSys=10 Then Select Case CurX Case 1 Case InStr(r, "E")+1 Case Else c="" End Select Else c="" End If Case "+" 'will be ignored by Val(..), ok If NumSys=10 Then Select Case CurX Case 1 Case InStr(r, "E")+1 Case Else c="" End Select Else c="" End If Case Else If InStr(Left(SysChar, NumSys), c)=0 Then c="" End Select EndIf If Ins Then 'finally add the char, wherever the cursor is.. r=Left(r, CurX-1) &c &Mid(r, CurX) Else 'overwrite it.. If CurX>Len(r) Then 'or not.. CurX=Len(r) 'this is the 'errorposition', c it as follows:you cannot overwrite beyond the end of a string :D '..so press INS and the show goes on ;) Else r[CurX-1]=Asc(c) End If End If CurX+=Abs(c<>"") End If Loop Until c=Cr Color CurFG, CurBG Return "Error" End Function