Seite 1 von 1

Return- oder Enter-Taste einbinden

Verfasst: 25.10.2005 23:37
von PB42
Hallo,

wenn ich versuche, mich in der Hilfe oder über Forenbeiträge und Codes schlau zu machen, wie man die Return- oder Enter-Tatse oder überhaupt Tastenbefehle in Anwendungen einbindet, die mit "OpenWindow()" beginnen, wird mir immer schwindeliger und das scheint ja ne Wissenschaft für sich zu sein. Da tauchen dann sogar Begriffe auf, die nichtmal in der Hilfe stehen: "Getfocus", "EventwParam()" usw., aber unmöglich schwer kann es nun auch wieder nicht sein, Tastenbefehle einzubinden, wenngleich es schon ganz schön seltsam ist, daß zwar Befehle wie TAB oder SPACE standardmäßig von Windows unterstützt werden und ausgerechnet RETURN oder ENTER nicht. Ich schicke hier nun einen Code, in welchem Rechenaufgaben erzeugt werden, dessen Lösung in einem StringGadget eingetragen werden sollen. Das Programm prüft dann auf "Richtig" oder "Falsch" und weiter geht's. Frage: Wie wird der OK-Button mit RETURN oder ENTER kombiniert? Alles herumprobieren brachte mich bisher nicht auf die Lösung. Danke für Hilfe.

PB42

Code: Alles auswählen

OpenWindow(0,300,300,500,250,#PB_Window_SystemMenu|#PB_Window_screencentered,"") And CreateGadgetList(WindowID(0)) 
A: 
arial=LoadFont(#PB_any, "Arial", 20, #PB_Font_Highquality) 

x = Random(10) + 1 
y = Random(10) + 1 
z = Random(3) + 1 

xyg1 = x+y 
xyg2 = x-y 
xyg3 = x*y 
xyg4 = x/y 

ag = 0 
fls = 0 

If z = 2 
If x-y < 0 
x=y 
y=x 
EndIf 
EndIf 

If z = 4 
zs = x * y 
x = zs 
EndIf 

C: 
OpenWindow(0,300,300,500,250,#PB_Window_SystemMenu|#PB_Window_screencentered,"") And CreateGadgetList(WindowID(0)) 
arial=LoadFont(#PB_any,"Arial",20, #PB_Font_Highquality) 

If LoadFont(0,"Arial",16) 
      SetGadgetFont(#PB_Default,FontID()) 
      EndIf 
      
fls = fls + 1 
If fls=3 And g=1 

StringGadget(1,245,80,60,30,"") 
ActivateGadget(1) 

arial=LoadFont(#PB_any, "Arial", 20, #PB_Font_Highquality) 
StartDrawing(WindowOutput()) 
FrontColor(0,0,200) 
DrawingMode(1) 
Locate(85,80) 
DrawingFont(UseFont(arial)) 
DrawText(Str(x) + "   +   " + Str(y)) 
Locate(210,80) 
DrawText("=") 
StopDrawing() 
Delay(3000) 
Goto A 
EndIf      
      
StringGadget(1,245,80,60,30,"") 
ButtonGadget(2,325,80,50,30,"OK") 
ButtonGadget(3,325,118,50,30,"Neu") 
ActivateGadget(1) 

StartDrawing(WindowOutput()) 
FrontColor(0,0,200) 
DrawingMode(1) 
Locate(50,10) 
DrawingFont(UseFont(arial)) 
DrawText("") 

Select z 
Case 1 
g=1 
Locate(90,80) 
DrawText(Str(x) + "   +   " + Str(y)) 
Locate(210,80) 
DrawText("=") 
Case 2 
g=2 
Locate(90,80) 
DrawText(Str(x) + "   -   " + Str(y)) 
Locate(210,80) 
DrawText("=") 
Case 3 
g=3 
Locate(90,80) 
DrawText(Str(x) + "   x   " + Str(y)) 
Locate(210,80) 
DrawText("=") 
Case 4 
g=4 
Locate(90,80) 
DrawText(Str(x) + "   /  " + Str(y)) 
Locate(210,80) 
DrawText("=") 
EndSelect 
StopDrawing() 

Repeat 
  EventID = WaitWindowEvent() 
  GadgetID = EventGadgetID()  
  
  Select GadgetID          
  Case 2 
                
  If Val(GetGadgetText(1)) = x + y And g=1 
  Goto B 
  EndIf  
    
  If Val(GetGadgetText(1)) = x - y And g=2 
  Goto B 
  EndIf 
  
If Val(GetGadgetText(1)) = x * y And g=3 
Goto B 
EndIf 
  
If Val(GetGadgetText(1)) = x / y And g=4  
  
  B: 
  StartDrawing(WindowOutput()) 
  DrawingMode(2) 
  FrontColor(0,0,200) 
  Locate(390,78) 
  DrawingFont(UseFont(arial))    
  DrawText("Richtig!") 
  StopDrawing() 
  F = 0 
  Pruef = 1 
    
  Else 
  StartDrawing(WindowOutput()) 
  DrawingMode(4) 
  FrontColor(0,0,200) 
  Locate(390,78) 
  DrawingFont(UseFont(arial)) 
  DrawText("Falsch")        
  StopDrawing() 
  F = 1 
  Pruef = 1 
  EndIf    
  
 Case 3 
 If EventGadgetID()=3 And Pruef = 1 
 Pruef = 0 
Goto A 
EndIf 
EndSelect 
  
Until EventID = #PB_Eventclosewindow

Verfasst: 26.10.2005 07:20
von PAMKKKKK
hmmmm.... Ein normales Return hat in vielen Gadgets ja schon eine Aufgabe.

Beim Textgadded z.B. beendet es die Texteingabe....
Deshalb sollte man vielleicht Strg+Enter nehmen oder so, ist besser.

Du soltes deshalb bei einem Enter abfragen ob die OK Taste den Focus hat (Aktiv ist). Sonnst geht bei jedem Enter der OK knopf los!!!!

Der Befehl den du sucht ist : AddKeyboardShortcut
Dieser weisst einem Gadget die Taste zu.
Die Taste die du da suchst ist die #PB_Shortcut_Return Taste (siehe Hilfe zu AddKeyboardShortcut).

Es wird dann dasselbe eriegnis (event) ausgelöst als wenn der User den Knopf gedrückt hätte.

Du braucht also nur einen Event-Behandlungscode.

Code: Alles auswählen

  ButtonGadget(2,325,80,50,30,"OK")
  AddKeyboardShortcut(0, #PB_Shortcut_Return, 2)
; Fensternummer = 0, TastaturTaste, Gadged dasmit der Taste verknüpft wird = 2
mein Code sieht so aus:

Code: Alles auswählen

  MenuTitle("Edit")
  MenuItem( #EDIT_UNDO0_0, "Undo" + Chr(9) + "Ctrl+Z") 
  MenuItem( #EDIT_REDO0_0, "Redo" + Chr(9) + "Ctrl+Y") 
  MenuItem(#EDIT_CUT0_0, "Cut" + Chr(9) + "Ctrl+X") 
  MenuItem(#EDIT_COPY0_0, "Copy" + Chr(9) + "Ctrl+C") 
  MenuItem(#EDIT_PASTE0_0, "Paste" + Chr(9) + "Ctrl+V") 
  MenuBar()
  MenuItem(#EDIT_FIND0_0, "Find" + Chr(9) + "Ctrl+F")
  AddKeyboardShortcut(#Main_Window0, #PB_Shortcut_Control | #PB_Shortcut_F, #EDIT_FIND0_0)
  MenuItem(#EDIT_REPLACE0_0, "Replace" + Chr(9) + "Ctrl+F")
  MenuItem(#EDIT_FINDNEXT0_0, "Find next" + Chr(9) + "F3")
  AddKeyboardShortcut(#Main_Window0, #PB_Shortcut_F3, #EDIT_FINDNEXT0_0)
  MenuItem(#EDIT_REPLACE_D0_0, "Replace directly")
  MenuBar()
  MenuItem(#EDIT_SelectAll0_0, "Select All" + Chr(9) + "Ctrl+A")

Verfasst: 26.10.2005 09:30
von MVXA
> ; Fensternummer = 0, TastaturTaste, Gadged dasmit der Taste verknüpft wird = 2
Die Funktion verknüpft aber keine Taste mit einem Gadget. Man kann da
auch einen willkürlichen Wert hinsetzen. Und die Funktion löst erst recht
kein [c]#PB_Event_Gadget[/c] Event aus sondern ein [c]#PB_Event_Menu[/c] Event.

Verfasst: 26.10.2005 09:33
von PB42
Vielen Dank, PamKKKKK. Ich habe das ausprobiert und das funktioniert. Große Erleichterung! Mit AddKeyboardshortcut() hatte ich schon selber herumprobiert, aber erstens hatte ich nicht gewußt, wo genau im Programm der Befehl hingehört und zweitens wußte ich immer nicht, was ich da als letztes in die Klammern schreiben muß: Ganz einfach die Gadgetnummer. Man muß es eben nur wissen. In der Hilfe steht stattdessen "Menuereignis". Das ist so ähnlich, als wenn man statt Hausnummer "Straßenzeilenereignis" sagt. :mrgreen:

Danke nochmals. :)

PB42

Verfasst: 27.10.2005 07:44
von PAMKKKKK
MVXA hat geschrieben:> ; Fensternummer = 0, TastaturTaste, Gadged dasmit der Taste verknüpft wird = 2
Die Funktion verknüpft aber keine Taste mit einem Gadget. Man kann da
auch einen willkürlichen Wert hinsetzen. Und die Funktion löst erst recht
kein [c]#PB_Event_Gadget[/c] Event aus sondern ein [c]#PB_Event_Menu[/c] Event.
Ich habe da wohl aus dummheit einen Bug gefunden !? :?

Das mit dem Menue-Event steht so in der Hilfe. Da hast du natürlich recht!

Aber wenn Fred einen hellen moment gehabt hat, Funktioniert der AddKeyboardShortcut genauso, wie ich es mir vorgestellt habe.
Der AddKeyboardShortcut erzeugt das Event von dem Gadged das man da einträgt.

Scheint ja auch so zu Funktionieren.
(Da ist wohl die Hilfe falsch..??)


Aber wenn du sagst, das man da ein zufälligen Wert eintragen kann (auch Gadged-Nummern von Gadgeds die es garnicht gibt ??):?
Dann bestätigt das nur meine Theorie!
AddKeyboardShortcut erzeugt ein Event des Eingetragenen Gadgets!!
Wenn es das Gadget noch nicht gibt, ist ja AddKeyboardShortcut das Gadged (stellvertretend)!!!

Es Funktioniert doch auch mit Buttons!!

Ich glaube Fred hat den Befehl so gebaut, das er einfach nur Events erzeugt, die die eingetragene Gadgetnummer senden.

Wär ja auch das universellste!

Verfasst: 27.10.2005 09:58
von Tafkadasom2k5
PB42 hat geschrieben:Vielen Dank, PamKKKKK. Ich habe das ausprobiert und das funktioniert. Große Erleichterung! Mit AddKeyboardshortcut() hatte ich schon selber herumprobiert, aber erstens hatte ich nicht gewußt, wo genau im Programm der Befehl hingehört und zweitens wußte ich immer nicht, was ich da als letztes in die Klammern schreiben muß: Ganz einfach die Gadgetnummer. Man muß es eben nur wissen. In der Hilfe steht stattdessen "Menuereignis". Das ist so ähnlich, als wenn man statt Hausnummer "Straßenzeilenereignis" sagt. :mrgreen:

Danke nochmals. :)

PB42
Das hat aber schon seinen Sinn das so zu schreiben:
Im Ursprung, kann man diese Funktion auch ohne ein Gadget benutzen-also damit könnte man eine Taste abfragen, die ein Event-Auslöst - das aber NICHT gleichzeitig mit einem Button funktioniert.
Ich denke mal, dass Fred sich Gedacht hat, ( :lol: ) dass man diese beiden Begriffe nicht unter einen Hut stecken sollte, da AddKeyboardShortcut ja "MenuID" manipuliert und nicht die "EventID". Das man die "EventID" aber mit der"MenuID" manipulieren kann ist ja logisch.
Sonst könnte man falsch verstehen, dass AddKeyboardShortcut() DIREKT an der "EventID" manipuliert-und das wollte er warscheinlich verhindern.

Hoffe man kann meinen Text irgendwie nachvollziehen,
Gr33tz
DerMarc :freak: