da ich immer wieder probleme hatte mit dem Eintragen von HighScore-einträgen oder Speicherständen in einem Screen habe ich mir mal n nette Procedure gebaut (die noch erweiter wird) und dem StringGadget immer näher zu kommen:
Was EditStringSCR() alles kann :
- Jedes Zeichen der deutsch Tastatur kann eingegeben werden
- auch spezielle Sonderzeichen wie ó oder Ê können eingegeben werden wie im StringGadget
- genauso wie @ oder µ mit hilfe von AltGr
- Jedes ASCII-Zeichen ist einfügbar mit ALT+#ASCII auf dem NummernPad
- Beim schreiben kann jeder Zeit die Position verändert werden: nach links, nach rechts, Pos1, Ende
- Löschen mit Entf oder <-- kann auch an jeder Position durchgeführt werden
- außerdem kann man mit EditStringPositionSCR(String$) die Position des | ermitteln
Ich hoffe der Code hier Hilft vielen weiter um ihre Programme/Spiele zu verbessern

Code: Alles auswählen
Structure SCR_StringEdit
SAVE_STR.l
SAVE_STR$
POSITION.l
ALT.l
NR$
EndStructure
Global EditStringSCR.SCR_StringEdit
;Dim SCR_Zeichen.s(255) ; 3.3
;Dim SCR_ZeichenDruckZeit.l(255)
Global Dim SCR_Zeichen.s(255) ; 4.1
Global Dim SCR_ZeichenDruckZeit.l(255)
For n = 0 To 255 : SCR_Zeichen(n) = "" : Next n
SCR_Zeichen(32) = " "
For n = 48 To 57
SCR_Zeichen(n) = Chr(n)+Chr(n-16)
Next n
SCR_Zeichen(51) = "3§"
SCR_Zeichen(55) = "7/"
SCR_Zeichen(48) = "0="
SCR_Zeichen(50) + "²"
SCR_Zeichen(51) + "³"
SCR_Zeichen(55) + "{"
SCR_Zeichen(56) + "["
SCR_Zeichen(57) + "]"
SCR_Zeichen(48) + "}"
For n = 65 To 90
SCR_Zeichen(n) = Chr(n+32)+Chr(n)
Next n
SCR_Zeichen(69) + "€"
SCR_Zeichen(77) + "µ"
SCR_Zeichen(81) + "@"
SCR_Zeichen(220) = "^°"
SCR_Zeichen(219) = "ß?\"
SCR_Zeichen(221) = "´`"
SCR_Zeichen(186) = "üÜ"
SCR_Zeichen(187) = "+*~"
SCR_Zeichen(192) = "öÖ"
SCR_Zeichen(222) = "äÄ"
SCR_Zeichen(191) = "#'"
SCR_Zeichen(188) = ",;"
SCR_Zeichen(190) = ".:"
SCR_Zeichen(189) = "-_"
SCR_Zeichen(226) = "<>|"
For n = 96 To 105
SCR_Zeichen(n) = Str(n-96)
Next n
SCR_Zeichen(110) = ","
SCR_Zeichen(111) = "//"
SCR_Zeichen(106) = "**"
SCR_Zeichen(109) = "--"
SCR_Zeichen(107) = "++"
Procedure.l GetMyAsyncKeyState(Key)
Event = GetAsyncKeyState_(Key)
If Event :
SCR_ZeichenDruckZeit(Key) + 1
DruckZeit = SCR_ZeichenDruckZeit(Key)
If DruckZeit = 1 : Wert = 1 : EndIf
If DruckZeit > 30 And Int(DruckZeit/2) = DruckZeit/2 : Wert = 1 : EndIf
Else
SCR_ZeichenDruckZeit(Key) = 0
EndIf
ProcedureReturn Wert
EndProcedure
Procedure.s EditStringSCR(String$)
Str$ = ""
If GetAsyncKeyState_(#VK_LSHIFT) Or GetAsyncKeyState_(#VK_RSHIFT) :
SCR_SHIFT = 1
EndIf
If GetAsyncKeyState_(#VK_RMENU) :
SCR_ALTGR = 2
EndIf
If GetAsyncKeyState_(#VK_LMENU) :
EditStringSCR\ALT = 1
ElseIf EditStringSCR\ALT = 1
EditStringSCR\ALT = -1
Else
EditStringSCR\ALT = 0
EndIf
If GetMyAsyncKeyState(8) :
String$ = Mid(String$,1,EditStringSCR\POSITION-1)+Mid(String$,EditStringSCR\POSITION+1,Len(String$))
If EditStringSCR\POSITION > 0 : EditStringSCR\POSITION-1 : EndIf
EndIf
If GetMyAsyncKeyState(46) :
String$ = Mid(String$,1,EditStringSCR\POSITION)+Mid(String$,EditStringSCR\POSITION+2,Len(String$))
EndIf
If GetMyAsyncKeyState(36) :
EditStringSCR\POSITION = 0
EndIf
If GetMyAsyncKeyState(35) :
EditStringSCR\POSITION = Len(String$)
EndIf
If GetMyAsyncKeyState(37) :
If EditStringSCR\POSITION > 0 : EditStringSCR\POSITION-1 : EndIf
EndIf
If GetMyAsyncKeyState(39) :
If EditStringSCR\POSITION < Len(String$) : EditStringSCR\POSITION+1 : EndIf
EndIf
If GetMyAsyncKeyState(32) :
KeyID = 32
EndIf
For n=48 To 159
If GetMyAsyncKeyState(n) :
KeyID = n
EndIf
Next n
For n=166 To 255
If GetMyAsyncKeyState(n) :
KeyID = n
EndIf
Next n
If EditStringSCR\ALT And KeyID >= 96 And KeyID <= 105
EditStringSCR\NR$ + Str(KeyID-96)
KeyID = 0
EndIf
If KeyID
Wert = SCR_SHIFT+SCR_ALTGR
Str$ = Mid(SCR_Zeichen(KeyID),Wert+1,1)
If EditStringSCR\SAVE_STR
Select KeyID
Case 65 : Str$ = Chr(223+EditStringSCR\SAVE_STR-32*SCR_SHIFT)
Case 69 : Str$ = Chr(231+EditStringSCR\SAVE_STR-32*SCR_SHIFT)
Case 73 : Str$ = Chr(235+EditStringSCR\SAVE_STR-32*SCR_SHIFT)
Case 79 : Str$ = Chr(241+EditStringSCR\SAVE_STR-32*SCR_SHIFT)
Case 85 : Str$ = Chr(248+EditStringSCR\SAVE_STR-32*SCR_SHIFT)
Default : Str$ = EditStringSCR\SAVE_STR$+Str$
EndSelect
EditStringSCR\SAVE_STR = 0
Else
If KeyID = 220 Or KeyID = 221 :
Select Str$
Case "`" : EditStringSCR\SAVE_STR = 1
Case "´" : EditStringSCR\SAVE_STR = 2
Case "^" : EditStringSCR\SAVE_STR = 3
EndSelect
EditStringSCR\SAVE_STR$ = Str$
Str$ = ""
EndIf
EndIf
EndIf
If EditStringSCR\ALT = -1 And EditStringSCR\NR$ :
Str$ = Chr(Val(EditStringSCR\NR$))
EditStringSCR\NR$ = ""
EndIf
String$ = Mid(String$,1,EditStringSCR\POSITION)+Str$+Mid(String$,EditStringSCR\POSITION+1,Len(String$)+Len(Str$))
EditStringSCR\POSITION + Len(Str$)
ProcedureReturn String$
EndProcedure
Procedure.l EditStringPositionSCR(String$)
; ProcedureReturn TextLength(Mid(String$,1,EditStringSCR\POSITION)) ; 3.3
ProcedureReturn TextWidth(Mid(String$,1,EditStringSCR\POSITION)) ; 4.1
EndProcedure
Code: Alles auswählen
InitSprite()
InitKeyboard()
OpenScreen(1024,768,32,"")
String$ = "TestString"
EditStringSCR\POSITION = Len(String$)
Repeat
Delay(1)
Kreis + 1
String$ = EditStringSCR(String$)
; ClearScreen(0,0,0) ;3.3
ClearScreen(0) ;4.1
StartDrawing(ScreenOutput())
Box(10,10,380,20,RGB(255,255,255))
DrawingMode(1)
; FrontColor(0,0,0) ;3.3
FrontColor(0) ;4.1
; Locate(12,10) : DrawText(String$) ; 3.3
DrawText(12, 10, String$) ; 4.1
If Sin(Kreis*0.1) > 0
Line(12+EditStringPositionSCR(String$),12,0,16,RGB(64,64,64))
EndIf
StopDrawing()
FlipBuffers()
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
GetAsyncKeyState_ hat nicht bei allen PCs die erwünschten ergibnisse gebracht. Wenn eine Andere anwendung zwischendrin GetAsynckeystate aufruft, bekommt das eige Programm nicht mehr -32767 (AnschlagZeichen).
Desegen habe ich eine Ersatzprocedure eingebaut GetMyAsyncKeyState(Key). Sollte jetzt überall funzen.
kleiner "nicht reagiert BUG" wurde entfernt