EditStringSCR() - für ScreenStringGadget

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

EditStringSCR() - für ScreenStringGadget

Beitrag 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
Zuletzt geändert von STARGÅTE am 09.06.2007 00:00, insgesamt 2-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag 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)
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
RiSiNG
Beiträge: 92
Registriert: 18.06.2006 10:31
Kontaktdaten:

Beitrag von RiSiNG »

Danke für's teilen! :mrgreen:
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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 :?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag 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?

:?
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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:
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten