Seite 1 von 1

EditStringSCR() - für ScreenStringGadget

Verfasst: 07.06.2007 19:44
von STARGÅTE
Tachchen,

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 :wink:

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
Hier ein Beispielcode

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)
UPDATES:

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

Verfasst: 08.06.2007 08:26
von Xaby
- Das Euro-Zeichen wird nicht korrekt dargestellt!
- Wenn man die [Alt-Gr]-Taste gedrückt hält, kann man nicht einfach nur Q drücken, um mehrere @ einzufügen
- Der Cursor geht über das "Gadget" hinaus.

scheint sehr langsam zu sein


- Umschalten zwischen Überschreiben und Einfügen mit Einfg-Taste

Features:

- Bearbeiten Rückgängig beim Löschen der gesamten Zeile
mit ALT + BackSpace oder Strg + Z

>> Markieren, Kopieren, Einfügen
Mit Umschalt + Richtungstaste oder Pos1 Ende
Mit STRG+Einf oder STRG+V einfügen


Aber deine Funktion funktioniert auch in der Console, das ehrt dich.
So sollte es sein :allright:

Code: Alles auswählen

OpenConsole()
EnableGraphicalConsole(1)

String$ = "TestString" 
EditStringSCR\Position = Len(String$) 

Repeat 
  
  
  String$ = EditStringSCR(String$) 
  Print("type: 'exit' to exit")
  ConsoleLocate(10,10)
  Print(String$)
  ConsoleLocate(EditStringSCR\Position+10,11)
  Print("~")
  Delay(100) 
  ClearConsole()
  
  
  ;(12+EditStringPositionSCR(String$),12,0,16,RGB(64,64,64)) 
  
  
Until FindString(String$,"exit",1)

Verfasst: 08.06.2007 08:51
von RiSiNG
Danke für's teilen! :mrgreen:

Verfasst: 08.06.2007 13:21
von STARGÅTE
>- Das Euro-Zeichen wird nicht korrekt dargestellt!
Das liegt dann an der Schrift, nicht alle Schriften haben das € scon drin, musst mal mit Arial testen

>- Wenn man die [Alt-Gr]-Taste gedrückt hält, kann man nicht einfach nur Q drücken, um mehrere @ einzufügen
Jo diese API die ich benutze ist etwas seltsam, weil sie die Events nicht nur von meinem Programm speichert sondern von allen, deswegen ist die Procedure bei manchen PCs etwas unzuverlässig

>- Der Cursor geht über das "Gadget" hinaus.
Jo, weil das hier noch kein Gadget ist, die fertige Screen- Gadget/Window (wo man dann auch Texte mit der Maus selectieren kann) kommt noch, die ist schon in Arbeit, das hier war ja nur ein Test der Eingabe


>scheint sehr langsam zu sein
hmm wie "langsam", das die Tasten nicht immer Reagieren oder wie?


>- Umschalten zwischen Überschreiben und Einfügen mit Einfg-Taste
JO baue ich ein, muss dann nur noch herausfinden wie ich den aktuellen Status heraus bekomme, genauso wie mit der Feststelltaste.


Features:

>- Bearbeiten Rückgängig beim Löschen der gesamten Zeile
mit ALT + BackSpace oder Strg + Z
ok

>- Markieren, Kopieren, Einfügen, Mit Umschalt + Richtungstaste oder Pos1 Ende, Mit STRG+Einf oder STRG+V einfügen
Jup baue ich dann in meine Fetige Include ein.


>Aber deine Funktion funktioniert auch in der Console, das ehrt dich.
Jup, denn sie selbst braucht kein InitKeyboard()

EDIT:

Ich werde das ganze noch mal komplett mit KeyboardPushed() schreiben denn mir scheind, das das dann besser läuft, allerdings muss dann immer ExamineKeyboard() mit vor der Procedure, aber sollte ja nicht so schlimm sein :?

Verfasst: 08.06.2007 14:16
von STARGÅTE
Hmm sry wegen dem DP aber mit KeyboardPushed habe ich die gleichen Probleme das nicht jeder Tastedruck "erkannt" wird, seltsam, ich werde mich noch damit befassen

Verfasst: 08.06.2007 22:51
von Xaby
>>
Ich werde das ganze noch mal komplett mit KeyboardPushed() schreiben denn mir scheind, das das dann besser läuft, allerdings muss dann immer ExamineKeyboard() mit vor der Procedure, aber sollte ja nicht so schlimm sein
<<

Geht das dann nicht nur im OpenScreen()?

Dann wird es nicht mehr mit der Console gehen.

Denn ExamineKeyBoard benutzt Direct X, oder Linux / MacOS analoge Dinge, soweit ich weiß.

Gibt es nicht schon Screen-Gadgets?

:?

Verfasst: 08.06.2007 23:33
von STARGÅTE
ja schon aber die die es gibt, sind etwas langsam (bei mir kam beim Beispiel 16FPS ^^)

Die die ich machen sind da etwas besser (denke ich).
1. man kann selber Texturen machen und diese dann als Fenster oder Button benutzen
2. es sollte schneller sein, da ich nur veränderungen Anzeigen lasse und die auf einem Sprite (das Window) Speicher.

zur Zeit befasse ich mich mit den verschiedenen GadgetTypen, sodas sie möglichst, den echten nahe kommen.

PS: habe etwas übersehen :
Wenn man Shift gedrück hält (für großschreiben) dann war das Key 160, aber dieser Key wurde in der For To schleife noch mal abgefragt, das dazu führte das der echte Burchstabe der davor kam, igoriert wurde


Teste mal bitte ob es jetzt besser funzt :allright: