Mehr zeilige Eingabe: Cursor an falsche Position [erledigt]

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Florian

Betreff: Mehr zeilige Eingabe: Cursor an falsche Position [erledigt]

BeitragFr, Feb 03, 2006 22:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Für den Chat schreibe ich eine mehrzeilige Eingabe-Funktion.
Dabei sollen Wörter die nicht mehr in die Zeile passen die die nächste Zeile umgebrochen werden.

Leider wird der Cursor an der falschen Position angezeicht.

Dies geschiet immer da, wenn das Wort noch grade in die Zeile passt.

Der Cursor zeigt immer auf die Position ,die mit der länge des letzten wort gleich ist.

Fehler behoben



Code: [AUSKLAPPEN]

Global ChatText$
Global ChatCursor
Timer=CreateTimer(20)

Graphics 640,480,0,1
Global ChatSchrift=LoadFont("Courier New",18)
SetFont ChatSchrift

SetBuffer BackBuffer()




Repeat
 Cls
 ChatEingabe
 WaitTimer Timer
 Flip
Forever

Function ChatEingabe()

 If KeyHit( 28)=True Or KeyHit( 156)=True Then Enter=True   
 If KeyDown(29)=True Or KeyDown(157)=True Then Strg=True
 If KeyDown(42)=True Or KeyDown( 54)=True Then Shift=True
 If KeyDown(56)=True Or KeyDown(184)=True Then Alt=True


 If KeyHit(205)=True Then Rechts=True
 If KeyHit(203)=True Then Links=True
 If KeyHit(199)=True Then Pos1=True
 If KeyHit(207)=True Then Ende=True

 If KeyHit(28)=True Or KeyHit(156) Then Enter=True
 
 If KeyHit(14)=True Then Backspace=True
 If KeyHit(211)=True Then Entf=True
 If KeyHit(210)=True Then Einfg=True


 If Shift=False And Alt=False And Strg=False Then

  ;Nummernblock
  If KeyHit( 79)=True Then Key$="1"
  If KeyHit( 80)=True Then Key$="2"
  If KeyHit( 81)=True Then Key$="3"
  If KeyHit( 75)=True Then Key$="4"
  If KeyHit( 76)=True Then Key$="5"
  If KeyHit( 77)=True Then Key$="6"
  If KeyHit( 71)=True Then Key$="7"
  If KeyHit( 72)=True Then Key$="8"
  If KeyHit( 73)=True Then Key$="9"
  If KeyHit( 82)=True Then Key$="0"
  If KeyHit(181)=True Then Key$="/"
  If KeyHit( 55)=True Then Key$="*"
  If KeyHit( 74)=True Then Key$="-"
  If KeyHit( 78)=True Then Key$="+"
  If KeyHit( 78)=True Then Key$=","

  If KeyHit(  2)=True Then Key$="1"
  If KeyHit(  3)=True Then Key$="2"
  If KeyHit(  4)=True Then Key$="3"
  If KeyHit(  5)=True Then Key$="4"
  If KeyHit(  6)=True Then Key$="5"
  If KeyHit(  7)=True Then Key$="6"
  If KeyHit(  8)=True Then Key$="7"
  If KeyHit(  9)=True Then Key$="8"
  If KeyHit( 10)=True Then Key$="9"
  If KeyHit( 11)=True Then Key$="0"

  If KeyHit( 30)=True Then Key$="a"
  If KeyHit( 48)=True Then Key$="b"
  If KeyHit( 46)=True Then Key$="c"
  If KeyHit( 32)=True Then Key$="d"
  If KeyHit( 18)=True Then Key$="e" 
  If KeyHit( 33)=True Then Key$="f"
  If KeyHit( 34)=True Then Key$="g"
  If KeyHit( 35)=True Then Key$="h"
  If KeyHit( 23)=True Then Key$="i"
  If KeyHit( 36)=True Then Key$="j"
  If KeyHit( 37)=True Then Key$="k"
  If KeyHit( 38)=True Then Key$="l"
  If KeyHit( 50)=True Then Key$="m" 
  If KeyHit( 49)=True Then Key$="n"   
  If KeyHit( 24)=True Then Key$="o"
  If KeyHit( 25)=True Then Key$="p"
  If KeyHit( 16)=True Then Key$="q"   
  If KeyHit( 19)=True Then Key$="r"
  If KeyHit( 31)=True Then Key$="s"
  If KeyHit( 20)=True Then Key$="t"

 

  If KeyHit( 22)=True Then Key$="u"
  If KeyHit( 47)=True Then Key$="v"
  If KeyHit( 17)=True Then Key$="w"
  If KeyHit( 45)=True Then Key$="x"
  If KeyHit( 44)=True Then Key$="y"
  If KeyHit( 21)=True Then Key$="z" 
  If KeyHit( 40)=True Then Key$="ä"
  If KeyHit( 39)=True Then Key$="ö"
  If KeyHit( 26)=True Then Key$="ü"
  If KeyHit( 12)=True Then Key$="ß"
  If KeyHit( 57)=True Then Key$=" "

  If KeyHit( 27)=True Then Key$="+"
  If KeyHit( 43)=True Then Key$="#"
  If KeyHit( 53)=True Then Key$="-"
  If KeyHit( 52)=True Then Key$="."
  If KeyHit( 51)=True Then Key$=","
  If KeyHit( 86)=True Then Key$="<"
  If KeyHit( 41)=True Then Key$="^"
  If KeyHit( 13)=True Then Key$="´"

 ElseIf Alt=True And Strg=True Then

  If KeyHit(  3)=True Then Key$="²"
  If KeyHit(  4)=True Then Key$="³"
  If KeyHit(  5)=True Then Key$=""
  If KeyHit(  8)=True Then Key$="{"
  If KeyHit(  9)=True Then Key$="["
  If KeyHit( 10)=True Then Key$="]"
  If KeyHit( 11)=True Then Key$="}"

  If KeyHit( 18)=True Then Key$="€";Euro
  If KeyHit( 50)=True Then Key$="µ"
  If KeyHit( 16)=True Then Key$="@" 
  If KeyHit( 12)=True Then Key$="\"

  If KeyHit( 27)=True Then Key$="~"
  If KeyHit( 86)=True Then Key$="|"

 Else

  If KeyHit(  2)=True Then Key$="!"
  If KeyHit(  3)=True Then Key$=Chr$(34)
  If KeyHit(  4)=True Then Key$="§"
  If KeyHit(  5)=True Then Key$="$"
  If KeyHit(  6)=True Then Key$="%"
  If KeyHit(  7)=True Then Key$="&"
  If KeyHit(  8)=True Then Key$="/"
  If KeyHit(  9)=True Then Key$="("
  If KeyHit( 10)=True Then Key$=")"
  If KeyHit( 11)=True Then Key$="="
 
  If KeyHit( 30)=True Then Key$="A"
  If KeyHit( 48)=True Then Key$="B"
  If KeyHit( 46)=True Then Key$="C"
  If KeyHit( 32)=True Then Key$="D"
  If KeyHit( 18)=True Then Key$="E"
  If KeyHit( 33)=True Then Key$="F"
  If KeyHit( 34)=True Then Key$="G"
  If KeyHit( 35)=True Then Key$="H"
  If KeyHit( 23)=True Then Key$="I"
  If KeyHit( 36)=True Then Key$="J"   
  If KeyHit( 37)=True Then Key$="K"
  If KeyHit( 38)=True Then Key$="L"
  If KeyHit( 50)=True Then Key$="M"
  If KeyHit( 49)=True Then Key$="N"
  If KeyHit( 24)=True Then Key$="O"
  If KeyHit( 25)=True Then Key$="P"
  If KeyHit( 16)=True Then Key$="Q" 
  If KeyHit( 19)=True Then Key$="R"
  If KeyHit( 31)=True Then Key$="S"

  If KeyHit( 20)=True Then Key$="T"

  If KeyHit( 22)=True Then Key$="U"
  If KeyHit( 47)=True Then Key$="V"
  If KeyHit( 17)=True Then Key$="W"
  If KeyHit( 45)=True Then Key$="X"
  If KeyHit( 44)=True Then Key$="Y"
  If KeyHit( 21)=True Then Key$="Z"
  If KeyHit( 40)=True Then Key$="Ä"
  If KeyHit( 39)=True Then Key$="Ö"
  If KeyHit( 26)=True Then Key$="Ü"
  If KeyHit( 12)=True Then Key$="?"

  If KeyHit( 27)=True Then Key$="*"
  If KeyHit( 43)=True Then Key$="'"
  If KeyHit( 53)=True Then Key$="_"
  If KeyHit( 52)=True Then Key$=":"
  If KeyHit( 51)=True Then Key$=";"
  If KeyHit( 86)=True Then Key$=">"
  If KeyHit( 41)=True Then Key$="°"
  If KeyHit( 13)=True Then Key$="`"

  If KeyHit( 30)=True Then Strg_A=True
  If KeyHit( 46)=True Then Strg_C=True 
  If KeyHit( 47)=True Then Strg_V=True
  If KeyHit( 45)=True Then Strg_X=True

 EndIf
 
 If Len(Key$)>0 Then
  ChatText$=Left$(ChatText$,ChatCursor)+Key$+Mid$(ChatText$,ChatCursor+1)
  ChatCursor=ChatCursor+1
 ElseIf Enter=True Then
 ElseIf Einfg=True Then
 ElseIf Ende=True And Shift=True And Strg=True Then
 ElseIf Pos1=True And Shift=True And Strg=True Then
 ElseIf Ende=True And Strg=True Then
  ChatCursor=Len(ChatText$)
 ElseIf Pos1=True And Strg=True Then
  ChatCursor=0 
 ElseIf Ende=True And Shift=True Then
 ElseIf Pos1=True And Shift=True Then
 ElseIf Pos1=True Then
 ElseIf Ende=True Then
  ;ZeilenEnde(Text$,UmBruch,ZeilenNr)
 ElseIf Backspace=True Then
  If ChatCursor>0 Then
   ChatText$=Left$(ChatText$,ChatCursor-1)+Mid$(ChatText$,ChatCursor+1)
   ChatCursor=ChatCursor-1
  EndIf
 ElseIf Entf=True Then 
   ChatText$=Left$(ChatText$,ChatCursor)+Mid$(ChatText$,ChatCursor+2)
 ElseIf Strg_A=True Then
 ElseIf Strg_C=True Then
 ElseIf Strg_V=True Then
 ElseIf Strg_X=True Then
 ElseIf Rechts=True And Strg=True And Shift=True Then
 ElseIf Links= True And Strg=True And Shift=True Then
 ElseIf Rechts=True And Strg=True Then
 ElseIf Links= True And Strg=True Then
 ElseIf Rechts=True And Shift=True Then
 ElseIf Links =True And Shift=True Then
 ElseIf Rechts=True Then
  If Len(ChatText$)>ChatCursor Then
   ChatCursor=ChatCursor+1
  EndIf 
 ElseIf Links=True  Then
  If ChatCursor>0 Then
   ChatCursor=ChatCursor-1
  EndIf 
 EndIf


 Color 255,255,255
 SetFont ChatSchrift

 SuperText ChatText$,50,0,0

 Zeilen=SuperTextZeilen(Left$(ChatText$,ChatCursor)+"|"+Mid$(ChatText$,ChatCursor+1),50)

 CursorZeile=ZeichenInZeile(ChatText$,50,ChatCursor)
 CursorSpalte=ZeichenInSpalte(ChatText$,50,ChatCursor)
 
 If CursorZeile>Zeilen Then CursorSpalte=1

 Color 255,0,255
 Rect StringWidth("a")*(CursorSpalte-1),FontHeight()*(CursorZeile-1),1,FontHeight()


 
 Text 100,100,CursorZeile
 Text 100,150,CursorSpalte
 Text 100,200,Zeilen
End Function



Function ZeilenEnde(Text$,UmBruch,ZeilenNr)
 Text$=Text$+String(" ",UmBruch*20)
 LenText=Len(Text$)
 Umbruch=Umbruch+1
 Mal=Ceil#(LenText/Umbruch)+1 
 For xMal=1 To Mal
  bis=InStr2(Text$," ",Umbruch)
  If String(" ",Bis-1)<>Mid$(Text$,1,Bis-1) Then
   If Mid$(Text$,1,Bis-1)<>"" Then
    ZeichenPos=ZeichenPos+Bis
    Zeile=Zeile+1
    If ZeilenNr=Zeile Then
     TextZeile$=(Mid$(Text$,1,Bis-1))
     TextZeileLang=Len(TextZeile$)
     For P=1 To TextZeileLang
      If Mid$(TextZeile$,P,1)<>" " Then
       TextZeile$=Mid$(TextZeile$,P)
       TextZeileLang=TextZeileLang+1-P
       Exit
      EndIf 
     Next
     For P=TextZeileLang To 1 Step-1
      If Mid$(TextZeile$,P,1)<>" " Then
       TextZeile$=Mid$(TextZeile$,1,P)
       Exit     
      EndIf
     Next
     Return Len(TextZeile$)
    EndIf
   EndIf
  End If
  If InStr3(Text$," ",Umbruch)=-1 Then 
   Text$=Mid$(Text$,Bis+1)
  Else
   Text$=Mid$(Text$,Bis)
  End If
 Next
End Function

Function ZeichenInSpalte(Text$,UmBruch,ZeichenNr)
 Text$=Text$+String(" ",UmBruch*20)
 LenText=Len(Text$)
 Umbruch=Umbruch+1

 Mal=Ceil#(LenText/Umbruch)+1 
 For xMal=1 To Mal
  bis=InStr2(Text$," ",Umbruch)

  If String(" ",Bis-1)<>Mid$(Text$,1,Bis-1) Then
   If Mid$(Text$,1,Bis-1)<>"" Then
    ZeichenPos=ZeichenPos+Bis
    Zeilelang=Len(Mid$(Text$,1,Bis-1))
    If ZeichenPos>ZeichenNr Then
     Return Bis-(ZeichenPos-ZeichenNr)+1
    EndIf
    Zeile=Zeile+1
   EndIf
  End If

  If InStr3(Text$," ",Umbruch)=-1 Then 
   Text$=Mid$(Text$,Bis+1)
  Else
   Text$=Mid$(Text$,Bis)
  End If
 Next
 Return 1
End Function


Function ZeichenInZeile(Text$,UmBruch,ZeichenNr)
 Text$=Text$+String(" ",UmBruch*20)
 LenText=Len(Text$)
 Umbruch=Umbruch+1

 Mal=Ceil#(LenText/Umbruch)+1 
 For xMal=1 To Mal
  bis=InStr2(Text$," ",Umbruch)

  If String(" ",Bis-1)<>Mid$(Text$,1,Bis-1) Then
   If Mid$(Text$,1,Bis-1)<>"" Then
    Zeile=Zeile+1
    ZeichenPos=ZeichenPos+Bis
    Zeilelang=Len(Mid$(Text$,1,Bis-1))
    If ZeichenPos>ZeichenNr Then
     Return Zeile
    EndIf
   EndIf
  End If

  If InStr3(Text$," ",Umbruch)=-1 Then 
   Text$=Mid$(Text$,Bis+1)
  Else
   Text$=Mid$(Text$,Bis)
  End If
 Next
 Return Zeile+1
End Function


Function ZeichenInZeile2(Text$,UmBruch,ZeichenNr)
 Text$=Text$+String(" ",UmBruch*20)
 LenText=Len(Text$)
 Umbruch=Umbruch+1
 Mal=Ceil#(LenText/Umbruch)+1 
 For xMal=1 To Mal
  bis=InStr2(Text$," ",Umbruch)

  If String(" ",Bis-1)<>Mid$(Text$,1,Bis-1) Then
   If Mid$(Text$,1,Bis-1)<>"" Then
   
    ZeichenPos=ZeichenPos+Bis
    Zeile=Zeile+1

    If ZeichenPos-Zeile=>ZeichenNr-2 Then
     Return Zeile
    EndIf
   EndIf
  End If

  If InStr3(Text$," ",Umbruch)=-1 Then 
   Text$=Mid$(Text$,Bis+1)
  Else
   Text$=Mid$(Text$,Bis)
  End If

 Next
 Return Zeile+1
End Function


Function SuperTextZeilen(Text$,UmBruch)
 Text$=Text$+String(" ",UmBruch*20)
 LenText=Len(Text$)
 Umbruch=Umbruch+1
 Mal=Ceil#(LenText/Umbruch)+1 
 For xMal=1 To Mal
  bis=InStr2(Text$," ",Umbruch)

  If String(" ",Bis-1)<>Mid$(Text$,1,Bis-1) Then
    If Mid$(Text$,1,Bis-1)<>"" Then Zeile=Zeile+1
  End If

  If InStr3(Text$," ",Umbruch)=-1 Then 
    Text$=Mid$(Text$,Bis+1)
   Else
    Text$=Mid$(Text$,Bis)
  End If
 Next
 Return Zeile
End Function

Function SuperText(Text$,UmBruch,X,Y)
 Text$=Text$+String(" ",UmBruch*20)
 LenText=Len(Text$)
 Umbruch=Umbruch+1
 Mal=Ceil#(LenText/Umbruch)+1
 For xMal=1 To Mal
  bis=InStr2(Text$," ",Umbruch)

  If String(" ",Bis-1)<>Mid$(Text$,1,Bis-1) Then
    Text x,y,Mid$(Text$,1,Bis-1)
    Y=y+ FontHeight ()
  End If

  If InStr3(Text$," ",Umbruch)=-1 Then 
    Text$=Mid$(Text$,Bis+1)
   Else
    Text$=Mid$(Text$,Bis)
  End If
 Next
End Function

Function InStr2(S$,F$,Ende)
 For X=Ende To 1 Step -1
  If Mid$(S$,X,1)=F$ Then
   Return X
  End If 
 Next
 Return Ende
End Function

Function InStr3(S$,F$,Ende)
 For X=Ende To 1 Step -1
   If Mid$(S$,X,1)=F$ Then
    Return -1
   End If 
  Next
  Return 0
End Function

  • Zuletzt bearbeitet von Florian am Sa, Feb 04, 2006 16:39, insgesamt einmal bearbeitet

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Feb 04, 2006 0:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Bevor du noch weitere Zeilen zur Abfrage einzelner Tasten benutzt würde ich mir erst mal noch GetKey anschauen... Eventuell kann dieser nicht alle Codes abfangen, da kann man das eine oder andere weiterhin per KeyHit machen. Aber einen enormen Zeileneinschub würde es sicherlich bringen...Code: [AUSKLAPPEN]
Graphics 400,400,0,2
SetBuffer FrontBuffer()

a%=0
b$=""
Print "Taste drücken!"


While Not KeyHit(1)

 a=GetKey()

 If a>0
  If a=8
   b=Left(b,Len(b)-1)
  Else
   b=b+Chr$(a)
  End If
  Cls
  Text 0,0,b+"|"
 End If

Wend
End

Um den Cursor dahin zu bekommen, wo du ihn haben willst, würde ich den Cursor als auch ein Bestandteil zum letzten Wort machen. Dann würde zumindest nicht der Cursor alleine da unten stehen... Oder du machst die Eingrenzung mit Cursor einen Schritt weiter als ohne Cursor...

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group