Anfängerprobleme beim ersten Programm

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Anfängerprobleme beim ersten Programm

Beitrag von Bisonte »

Damit wird zumindest ein Großteil der Sonderzeichen zurückgeliefert; allerdings mit
einer sehr befremdlichen Nummerierung.
esc => 27 = ascii
F1 => 112 = kein scanCode kein ascii
...
Dafür gibt es die Konstanten #PB_ShortCut_ ...

Kleines Beispiel :

Code: Alles auswählen

If EventType() = #PB_EventType_KeyUp
  PressedKey = GetGadgetAttribute(#cv001, #PB_Canvas_Key)
  Select PressedKey
    Case #PB_Shortcut_F1
      ; Mach was bei F1
    Case #PB_Shortcut_Escape
      ; Mach was bei Escape usw...
  EndSelect
EndIf
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: Anfängerprobleme beim ersten Programm

Beitrag von Diogenes »

Hallo,

@Bisonte

ach so, das sind ainfach die Nummern der PB_shortcuts. ok aber die sind nicht genormt oder so,
die haben sich die Entwickler von PB einfach ausgedacht. Na gut. Muss man halt aufschreiben.

Noch eine Frage:

wie kriege ich PB dazu ein Programm icon einzubinden, so daß im Explorer und in der taskleiste
das spezielle Programmicon angezeigt wird

Danke im voraus.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Anfängerprobleme beim ersten Programm

Beitrag von Bisonte »

in den Compileroptionen.

Menu -> Compiler -> Compiler-Optionen...
Dann im erscheinenden Fenster einen Haken bei "Benutze Icon" und das Icon auswählen
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: Anfängerprobleme beim ersten Programm

Beitrag von Diogenes »

Hallo;

@Bisonte

Danke Dir; Du warst 3 Minuten schneller.
Ich wollte gerde schreiben, dass ich es mit der Hilfe selber herausgefunden habe.
Lesen bildet halt.

Danke
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: Anfängerprobleme beim ersten Programm

Beitrag von Diogenes »

Hallo,

HILFE !!!!
ich habe ein ganz merkwuerdiges Problem.
Ich bin dabei, ein altes Programm in mein in diesem Thread erstelltes Gerüst einzuhängen.
Das klappt eigentlich auch gut, aber:

Code: Alles auswählen

AG_ANFANG:
ZE_HIGRU()
MELDAUTOR(titel$,autor$)
MELDUNTEN("Gib den Schwierigkeitsgrad ein 1 bis 9")
tas=0:gg(1)=0:wert=0
tas=Waitstring()
If tas>48 And tas<58:wert=tas-48:EndIf
gg(11)=wert
If gg(11)=0 :gg(11)=4:EndIf
MELDULOESCH()
MELDUNTEN("Schwierigkeitsgrad "+Str(gg(11))+"; Spiel wird erstellt ")
Delay(1200)
MELDULOESCH()
Delay(500)
;BAUSPIEL()
;bis hierher klappt alles absolut problemlos

MELDUNTEN("Bauspiel Ende <TAste>")
Delay(1500)
;das Delay habe ich eingefügt, um zu schauen ob 
:meldunten() ausgeführt wird. Das klappt.
WAITKEY()
;klappt nicht, !!!!!!!!!!!!!!!!!!!!!!!!!!!!
; das heisst er springt direkt zum naechsten
;Meldunten(" jetzt geht's los")
;dazwischen ist ja alles ausgeremt
; --------------------------
AF_WIEDERHOLUNG:
; --------------------------

; ZE_ROHBILD()
; MELDAUTOR(titel$,autor$)
; ZE_BILD()
; ZE_ZUGNUM()
; ZE_CURSOR()
dipend=0:gg(8)=0
MELDUNTEN("Jetzt geht's los <Taste druecken>")
WAITKEY()
; hier klappt waitkey() absolut einwandfrei  !!!!!!!!!!!!!!!!!!!!!!!!!!!!
;gestern hat's in dem Gerüst ja auch geklappt.
;die waitkey() habe ich überhaupt nicht mehr verändert
;compi wartet brav auf eine Tastatureingabe
;ich habe die Tastatur garantiert nicht mehr angefasst
;seit dem letzten Waitstring oben bei der Abfrage nach
; dem Schwierigkeitsgrad
; Kann man den Tastaturpuffer vorher irgendwie löschen,
;wenn da noch was drinstehen sollte; wieso auch immer.

MELDULOESCH()

Danke für Eure Hilfe !
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: Anfängerprobleme beim ersten Programm

Beitrag von Diogenes »

Hallo,

Ergänzung:
ich habe jetzt hinter das erste Meldunten ():Waitkey() noch 4 weitere gesetzt
=> nur das erste !!!! waitkey wird nicht richtig ausgeführt.
Alle weiteren funktionieren einwandfrei.

wie kann sowas sein ?
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Anfängerprobleme beim ersten Programm

Beitrag von Bisonte »

du kannst deine WAITKEY() Prozedur mal in folgendes ändern

Code: Alles auswählen

Procedure WAITKEY()
  quit=0 
  Debug "-------------WAITKEY START"
  Repeat
    Event = WaitWindowEvent()
    If Event = #PB_Event_Gadget
      Debug "Ein Gadget hat ausgelöst! PB Nr." + Str(EventGadget())
      If EventGadget()=#cv001
        Debug "Es ist das Canvas"
        If EventType()=#PB_EventType_Input
          Debug "Es war das EventType_Input"
          Debug "Es war das Zeichen Ascii Code (" + Str(GetGadgetAttribute(#cv001, #PB_Canvas_Input)) + ")"
          Quit = 1
        EndIf
      EndIf
    EndIf
    If event=#PB_Event_CloseWindow
      quit=1:gg(1)=10
    EndIf
  Until quit>0
  Debug "-------------WAITKEY ENDE"
EndProcedure
Ich habe hier Debug Zeilen eingefügt, die einem Hinweise geben könnten, was genau da passiert.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: Anfängerprobleme beim ersten Programm

Beitrag von Diogenes »

@Bisonte

Hallo,

ich habe den Code abgeändert
Tastendrücke nach dem Spielstart
n => keine Information gewünscht
6 => Schwierigkeitsgrad 6 =ascii 54
Debug meldet nach dem ersten Aufruf:
canvas
Event
ascii 54 also ist die 6 noch im Tastaturpuffer wie ich vermutete
canvas
canvas
keine Taste gedrückt; nach dem Delay kommt sofort Aufruf 2
--------
zweiter Aufruf:
space gedrückt
canvas
canvas
event
asci 32
canvas
--------
dritter Aufruf:
canvas
canvas
event
ascii32 => space gedrückt
canvas
canvas
-------------
vierter Aufruf
canvas
canvas
event
asci32 => space gedrückt
canvas
-------------

Also liest er noch das zeichen von der vorherigen Eingabe aus.
wieso gibt er in manchen Fällen 2* canvas aus
in anderen aber nur einmal

Danke für Deine Hilfe; immerhin weiss ich jetzt schon mal,
dass er den letzten Tastendruck noch aus dem Puffer auswertet.
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: Anfängerprobleme beim ersten Programm

Beitrag von Diogenes »

Ergänzung:
da er offensichtlich noch die 6 aus der vorherigen Waitstring-Abfrage im
Puffer hat; diese Abfrage bezieht sich auf keydown, da ich die Taste ja
schon längst wieder losgelassen habe, hat der vielleicht das event
keyup im Puffer? ich werde damit mal ein wenig experimentieren.
Ich melde mich wieder!

Yep; das war`s allem Anschein nach.

Ich habe in waitString die Abfrage von Keydown auf keyup gesetzt.
und jetzt scheint es zu funktionieren.
Ich werde weiterbasteln und mich wieder melden.

Frage bleibt bestehen: Kann man irgendwie vorsorglich den Tastaturpuffer leeren ?
in DarkBasicPro war das clear entry buffer aber wie das realisiert wurde
weiss ich leider nicht.
Diogenes
Beiträge: 91
Registriert: 05.06.2014 10:52

Re: Anfängerprobleme beim ersten Programm

Beitrag von Diogenes »

Hallo,

die Tastatursteuerung unter PB ist ein Katastrophe - oder ich bin zu doof dafür -
Gibt es keine Möglichkeit die Scancodes der tastatur abzufragen und die Modifier
so in der art:
if shiftkey dann modifier=1
if ctrlkey dann modifier=2
if altkey dann modifier=4
if shiftkey und ctrlkey dann modifier=3
if shiftkey und altkey dann modifier =5
taste= keystate(35)
wenn modifier=0 und keystate(35)=1 dann kommt h
wenn modifier=1 und keystate(35)=1 dann handelt es sich um ein H
wenn modifier=5 dann wurde <shift><alt><h> gedrückt
wenn modifier=1 und keystate(199) dann wurde <shift> und <Pos1 über dem Cursorblock> gedrückt
anschließend sollte man den Tastaturpuffer zurücksetzen können so dass eine neue saubere abfrage möglich ist

ich habe schon versucht, das mit AddKeyboardShortcut(0,#PB_Shortcut_Shift|#PB_Shortcut_Up, #kb001)
hinzubekommen, aber das klappt nie.
im wesentlichen geht es mir im Augenblick um <shift><up>;<shift><ri>;<shift><dn>,<shift><le>
<up>,<dn>,<le>,<ri> lssen sich ja problemlos abfragen
wenn ich das in meiner Waitstring abfrage und anzeigen lasse, kommt zuerst 37 und dann 16 aber wie kann ich die 16
also die shifttaste abfragen. als taste wird immer nur 37 ausgegeben im Programm
ich hab's auch schon versucht mit modif=((GetGadgetAttribute(#cv001,#PB_Canvas_Shift)))
komme da aber auch nicht weiter

Wäre es hilfreicher direkt auf windowscreen-Programmierung umzusteigen und dort mit keyboardinkey
zu arbeiten. Irgendwann muss ich das sowieso, da ich in einigen Programmen Sprites benutze.

was ist denn daran schwieriger, das ich mich mit dem Canvas-Gadget abplage.
Sorry, im Augenblick bin ich gefrustet, weil ich die Tastatursteuerung hier einfach nicht verstehe.
Ansonsten funktioniert doch alles recht gut.
Danke für Eure Hilfe.
Antworten