Tastenabfragen in PB4

Anfängerfragen zum Programmieren mit PureBasic.
Exabot
Beiträge: 63
Registriert: 10.12.2004 09:50

Tastenabfragen in PB4

Beitrag von Exabot »

Hallo,

ich brauche für eine Anwendung die Returntaste.
In StringGadgets kann ich das weitergeben mit dem Parameter #ES_Multiline erzwingen,
leider wird dabei ein Sound abgespielt, den ich gerne unterdrücken würde.
(Lautsprecher abschalten geht natürlich, ist aber keine Option ;-) )

Bei ButtonGadgets gelang es mir bis jetzt nicht Return durchzugeben.

Gibt es eine Möglichkeit das Verhalten der Gadgets anzupassen?
(Ich meine jetzt nicht über zuweisen mit ShortCut als Menu-Ereignis,
sondern so, dass einfach jede gedrückte Taste ein Event auslöst.
Das ganze möglichst ohne CallBack.)

mfg

Spider

PS: Ich bin für jede Anregung dankbar!

Code: Alles auswählen


#WindowWidth  = 390
#WindowHeight = 350

If OpenWindow(0, 100, 200, #WindowWidth, #WindowHeight, "PureBasic - Gadget Test", #PB_Window_MinimizeGadget)

  If CreateGadgetList(WindowID(0))

    Top = 10
    GadgetHeight = 24
   
    StringGadget(0,  20, Top, 200, GadgetHeight,"",#PB_Text_Center|#ES_MULTILINE)
    StringGadget(1,  20, Top+GadgetHeight+2, 200, GadgetHeight, " ", #PB_Text_Right|#ES_MULTILINE)
    StringGadget(2,  20, Top+(2*(GadgetHeight+2)), 200, GadgetHeight, "", #ES_MULTILINE)
    StringGadget(3,  20, Top+(3*(GadgetHeight+2)), 200, GadgetHeight, "", #ES_MULTILINE)
    
    GadgetToolTip(3, "Normale Texteingabe")
    GadgetToolTip(2, "Normale Texteingabe")
    GadgetToolTip(1, "Rechtsbündige Texteingabe")
    GadgetToolTip(0, "Zentrierte Texteingabe")
    
    ButtonGadget(10,  20, Top+(4*(GadgetHeight+2)), 40, GadgetHeight, "OK")
    SetActiveGadget(0)
  EndIf
  
 
  Repeat
    EventID = WaitWindowEvent()
    
    GadgetEvent.l = EventType()
    Select GadgetEvent
      Case #PB_EventType_Change
        Debug "change"
        Debug GetActiveGadget()
      Case #PB_EventType_Focus
        Debug "Get Focus"
        Debug GetActiveGadget()
      Case #PB_EventType_LostFocus
        Debug "Lost Focus"
        Debug GetActiveGadget()
      Case #PB_EventType_LeftClick
        Debug "LeftClick"
        Debug GetActiveGadget()
      Case #PB_EventType_RightClick
        Debug "RightClick"
        Debug GetActiveGadget()
      Case #PB_EventType_ReturnKey
        Debug "Return"
        Debug GetActiveGadget()
      Default
        If GadgetEvent > 0
          Debug GadgetEvent    
          Debug GetActiveGadget()
        EndIf
        
      EndSelect
  
     
  Until EventID = #PB_Event_CloseWindow

EndIf

End 
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Tastenabfragen in PB4

Beitrag von Kiffi »

> PS: Ich bin für jede Anregung dankbar!

dann rege ich hiermit doch mal an, dass Du Dir das neue Event-Include
von srod anschaust. Ist herrlich einfach zu programmieren, löst genau Dein
Problem und von dem Callback bekommste nix mit. :-)

Code: Alles auswählen

Procedure.l KeyPress(*sender.PB_Sender)
  Protected result
;Remove beep on pressing the return key.
  If *sender\wParam = #VK_RETURN
    result = 0 ;This ensures the character is ignored.
  Else
    result = #PB_ProcessPureBasicEvents
  EndIf
  ProcedureReturn result
EndProcedure
http://www.purebasic.fr/english/viewtopic.php?t=20929

Grüße ... Kiffi
a²+b²=mc²
Exabot
Beiträge: 63
Registriert: 10.12.2004 09:50

Beitrag von Exabot »

@Kiffi

Danke für die Anregung!
Der BEEP ist zwar weg, leider aber auch die Returntaste!

Was muss ich welchem Parameter zuweisen, um ein Eventzu erzeugen,
auf das ich reagieren kann?

Ansonsten: Super Teil

Grüsse
Spider
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Der BEEP ist zwar weg, leider aber auch die Returntaste!

mhhh, wenn ich dich richtig verstanden habe, möchtest Du also mit der
Returntaste den Dialog 'quittieren', oder?

// wenn ja:

Code: Alles auswählen

ProcedureDLL ClickButton(Window,ButtonGadget)
  handle=GadgetID(ButtonGadget)
  Buffer.s=Space(255)
  GetClassName_(handle,@Buffer,Len(Buffer))
  PostMessage_(WindowID(Window),#WM_COMMAND,#PB_EventType_LeftClick<<16,handle)
EndProcedure

[...]

Procedure.l KeyPress(*sender.PB_Sender)
  Protected result
;Remove beep on pressing the return key.
  If *sender\wParam = #VK_RETURN
    result = 0 ;This ensures the character is ignored.
    ClickButton(DeinFenster,DeinButtonGadget)
  Else
    result = #PB_ProcessPureBasicEvents
  EndIf
  ProcedureReturn result
EndProcedure
(ungetestet)
a²+b²=mc²
Exabot
Beiträge: 63
Registriert: 10.12.2004 09:50

Beitrag von Exabot »

Hey Kiffi,

Jein, eigentlich habe ich etwas ähnliches vor wie srod.
Kennst Du noch Clipper und seine gets?
vor allem die Eingabemasken?
z.B. "@###,###.00" usw.?
und das Anhängen von Prozeduren an Gets?
Ich hatte das unter PB 3.x angefangen, aber aufgegeben als ich auf quad und doubles zugreifen hätte müssen (C-ISAM- und SQL-Datenbank).
Ich will mit [Return] entweder simpel weiterschalten (analog zu [TAB]) oder in bestimmten Fällen einen externen Dialog aufrufen.

Grüsse
Spider
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Kennst Du noch Clipper und seine gets?

nöh, kenne ich (leider?) nicht.

> Ich will mit [Return] entweder simpel weiterschalten (analog zu [TAB])
> oder in bestimmten Fällen einen externen Dialog aufrufen.

na, dann dürfte folgendes passen:

Bei Return springst Du von StringGadget zu StringGadget. Im letzten
StringGadget öffnet sich bei Return dann ein "Dialog" ;-)

Code: Alles auswählen

XIncludeFile "EasyVENT.pbi"

Enumeration
  #frmMain
  #StringGadget1
  #StringGadget2
  #StringGadget3
  #StringGadget4
  #ButtonGadget
EndEnumeration

Define.l top
Define.l GadgetHeight
Define.l EventID

Declare.l  StringGadget1_OnKeyPress(*sender.PB_Sender)
Declare.l  StringGadget2_OnKeyPress(*sender.PB_Sender)
Declare.l  StringGadget3_OnKeyPress(*sender.PB_Sender)
Declare.l  StringGadget4_OnKeyPress(*sender.PB_Sender)

If OpenWindow(#frmMain, 100, 200, 300, 200, "PureBasic - Gadget Test", #PB_Window_MinimizeGadget)
  
  InitEasyVent(WindowID(#frmMain))
  
  If CreateGadgetList(WindowID(#frmMain))
    
    top = 10
    GadgetHeight = 24
    
    StringGadget(#StringGadget1, 20, top, 200, GadgetHeight,"",#PB_Text_Center|#ES_MULTILINE)
    StringGadget(#StringGadget2, 20, top+GadgetHeight+2, 200, GadgetHeight, " ", #PB_Text_Right|#ES_MULTILINE)
    StringGadget(#StringGadget3, 20, top+(2*(GadgetHeight+2)), 200, GadgetHeight, "", #ES_MULTILINE)
    StringGadget(#StringGadget4, 20, top+(3*(GadgetHeight+2)), 200, GadgetHeight, "", #ES_MULTILINE)
    
    GadgetToolTip(#StringGadget4, "Normale Texteingabe")
    GadgetToolTip(#StringGadget3, "Normale Texteingabe")
    GadgetToolTip(#StringGadget2, "Rechtsbündige Texteingabe")
    GadgetToolTip(#StringGadget1, "Zentrierte Texteingabe")
    
    ButtonGadget(#ButtonGadget,  20, top+(4*(GadgetHeight+2)), 40, GadgetHeight, "OK")
    
    SetActiveGadget(#StringGadget1)
    
    SetEventHandler(GadgetID(#StringGadget1), #OnKeyPress, @StringGadget1_OnKeyPress())
    SetEventHandler(GadgetID(#StringGadget2), #OnKeyPress, @StringGadget2_OnKeyPress())
    SetEventHandler(GadgetID(#StringGadget3), #OnKeyPress, @StringGadget3_OnKeyPress())
    SetEventHandler(GadgetID(#StringGadget4), #OnKeyPress, @StringGadget4_OnKeyPress())
    
  EndIf
  
  Repeat
    EventID = WaitWindowEvent()
  Until EventID = #PB_Event_CloseWindow
  
EndIf 

Procedure OpenDialog()
  MessageRequester("Hallo", "Dies könnte ein Dialog sein, wenn der Programmautor nicht so furchtbar faul wäre ;-)")
EndProcedure

Procedure.l StringGadget1_OnKeyPress(*sender.PB_Sender)
  Protected result
  ;Remove beep on pressing the return key.
  If *sender\wParam = #VK_RETURN
    SetActiveGadget(#StringGadget2)
    result = 0 ;This ensures the character is ignored.
  Else
    result = #PB_ProcessPureBasicEvents
  EndIf
  ProcedureReturn result 
EndProcedure

Procedure.l StringGadget2_OnKeyPress(*sender.PB_Sender)
  Protected result
  ;Remove beep on pressing the return key.
  If *sender\wParam = #VK_RETURN
    SetActiveGadget(#StringGadget3)
    result = 0 ;This ensures the character is ignored.
  Else
    result = #PB_ProcessPureBasicEvents
  EndIf
  ProcedureReturn result 
EndProcedure

Procedure.l StringGadget3_OnKeyPress(*sender.PB_Sender)
  Protected result
  ;Remove beep on pressing the return key.
  If *sender\wParam = #VK_RETURN
    SetActiveGadget(#StringGadget4)
    result = 0 ;This ensures the character is ignored.
  Else
    result = #PB_ProcessPureBasicEvents
  EndIf
  ProcedureReturn result 
EndProcedure

Procedure.l StringGadget4_OnKeyPress(*sender.PB_Sender)
  Protected result
  ;Remove beep on pressing the return key.
  If *sender\wParam = #VK_RETURN
    OpenDialog()
    result = 0 ;This ensures the character is ignored.
  Else
    result = #PB_ProcessPureBasicEvents
  EndIf
  ProcedureReturn result 
EndProcedure
Grüße ... Kiffi
a²+b²=mc²
Exabot
Beiträge: 63
Registriert: 10.12.2004 09:50

Beitrag von Exabot »

Guten Morgen Kiffi,

vielen Dank für Deinen Vorschlag.
Den letzten konnte ich anhand Deines Edits ableiten :-)

Leider verfolgte ich bis jetzt einen vollkommen anderen Ansatz.
Ich erkenne natürlich den Vorteil dieser Erwetweiterung, muss
jetzt aber erstmal überdenken, ob sich mein Projekt darauf umstellen lässt.
Bis jetzt hätte ich eigentlich nur ein Ereignis je Taste gebraucht.

mfg
Spider

PS: In Anbetracht Deiner Bemühungen werde ich Dir gerne nachsehen, dass Du zu faul warst den externen Dialog zu komplettieren! :lol:
Antworten