Tastendruck im Stringgadget?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Tastendruck im Stringgadget?

Beitrag von Kukulkan »

Hallo,

Ich setze einen Text mit SetGadgetText() in ein Stringgadget. Dabei wird auch der Event #PB_EventType_Change ausgelöst.

Ich möchte nun aber wissen, ob der User in diesem Textfeld einen Buchstaben eingegeben oder gelöscht/geändert hat. Ich möchte nicht den Text vergleichen, sondern wissen ob er was eingetippt hat. Unter VB gibt es dafür den Event KeyPress(). Ich finde so etwas in PB nicht. Wie kann ich das erreichen?

Grüsse,

Volker
Hanniball
Beiträge: 55
Registriert: 21.03.2005 17:40
Wohnort: Oranienbaum
Kontaktdaten:

Beitrag von Hanniball »

Frag einfach die EventGadgetID() ab, bei jeder Eingabe in dein Textfeld wird die GadgetID deines Textfeldes angegeben.

Code: Alles auswählen

; Fenster usw
#wg=11
StringGadget(#wg,10,10,300,20,"Hallo")

Repeat
Event=WaitWindowEvent()

If Event=#PB_EventGadget

Debug  EventGadgetID(); Hier auswerten wenn die ID Deines Textfeldes (im Beispiel 11) kommt
EndIf


Until Event=#PB_Event_CloseWindow
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Beitrag von Kukulkan »

Hallo Hannibal,

Danke. Das gibt aber auch Events beim anklicken und wenn das Programm mit SetGadgetText() den Inhalt ändert. Ich will aber wissen ob der USER etwas getippt hat. So erhalte ich Events die ich nicht unterscheiden kann (geklickt, getippt oder SetGadgetText()).

So Einfach ist es dann doch nicht (sonst hätte ich sicher nicht das Forum bemüht). /:->

Grüsse,

Volker
Hanniball
Beiträge: 55
Registriert: 21.03.2005 17:40
Wohnort: Oranienbaum
Kontaktdaten:

Beitrag von Hanniball »

Hi,

also wenn das Programm den Inhalt ändert, musst Du das halt durch Deine Programmstruktur abfangen.
Wenn es Dir um das Ausschließen des Mausklicks geht, dann vergleich doch den Text - siehe unten oder beschreib Dein Problem noch mal genauer. Viele Grüße Hanniball

Code: Alles auswählen

#win=0:#sg=1
Global textalt$
OpenWindow(#win,0, 0, 800, 500, #PB_Window_SystemMenu, "ROMAHN - VERLAG")
CreateGadgetList(WindowID(#win))
StringGadget(#sg,10,10,300,20,"Hallo")

textalt$=GetGadgetText(#sg)

Repeat
Event=WaitWindowEvent()

If EventGadgetID()=#sg
textneu$=GetGadgetText(#sg)
If textneu$<>textalt$
Debug "getippt"
textalt$=textneu$
EndIf
EndIf


Until Event=#PB_Event_CloseWindow 
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Beitrag von jear »

@Volker Schmid

Versuch doch mal mit

Code: Alles auswählen

EventType()
Man ist nie zu alt zum lernen, auch wenn man dabei manchmal alt aussieht!
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Beitrag von Kukulkan »

@Hannibal:

Danke. Aber wie im ersten Post schon geschrieben:
Ich möchte nicht den Text vergleichen, sondern wissen ob er was eingetippt hat.
Die Idee hatte ich auch schon, aber ich finde es höchst seltsam, wenn ich in verschiedenen Prozeduren den Text wechsle und dann mit einer globalen Variablen für jedes Feld prüfen muss ob sich was geändert hat.

@Jear:

Danke, das liegt nahe, nicht wahr :lol:. Aber EventTyp() hat keine Unterscheidung für Tastendrücke. Guckst Du in Hilfe:
#PB_EventType_LeftClick : Klick mit der linken Maustaste
#PB_EventType_RightClick : Klick mit der rechten Maustaste
#PB_EventType_LeftDoubleClick : Doppelklick mit der linken Maustaste
#PB_EventType_RightDoubleClick : Doppelklick mit der rechten Maustaste
#PB_EventType_Focus : Fokus erhalten
#PB_EventType_LostFocus : Fokus verloren
#PB_EventType_Change : Inhalt hat sich geändert.
Und wie im ersten Post schon geschrieben, liefert ein SetGadgetText() ebenfalls ein #PB_EventType_Change. Ich kann einen Tastendruck nicht vom Klick oder SetGadgetText() unterscheiden. Gibt es denn keinen Event für einen Tastendruck in einem Gadget?

Und irgendwie bekomme ich das Gefühl, dass hier keiner meine Frage im ersten Post richtig gelesen hat... :shock: Alle bis jetzt vorgeschlagenen Tipps habe ich in meinem ersten Posting bereits ausgeschlossen. So weit war ich bei Fragestellung auch.:cry:

Volker
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Beitrag von Kukulkan »

@alle:

Ok, helft mir einen Hook zu setzen. Das Text-Steuerelement von Windows hat auf jeden Fall diesen Event. Nur PB reicht den eben nicht durch. Kurz einen Hinweis wie man den Hook auf ein Steuerelement legt? Evtl. gibts ja schon einen Codeschnipsel dafür. Ich guck aber auch noch in die PureArea...

Volker
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

Volker Schmid hat geschrieben:@alle:
Ok, helft mir einen Hook zu setzen. Das Text-Steuerelement von Windows hat auf jeden Fall diesen Event. Nur PB reicht den eben nicht durch. Kurz einen Hinweis wie man den Hook auf ein Steuerelement legt? Evtl. gibts ja schon einen Codeschnipsel dafür. Ich guck aber auch noch in die PureArea...
Schau doch mal in den Bereich 'Allgemein' diesen Beitrag an:
http://forums.purebasic.com/german/viewtopic.php?t=2518

Da wurde erst gestern etwas gezeigt was Dir dabei helfen könnte.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Beitrag von Kukulkan »

@danilo:

Danke!

Sowas in der Art habe ich als Antwort erwartet. Das sollte ich locker hinbekommen...

Grüsse,

Volker
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Beitrag von Kukulkan »

Hallo,

Ich habe mir nun ein paar Hook-Routinen gebastelt und kann die ja hier reinstellen. So klappt es bei mir Wunderbar!

Code: Alles auswählen

Structure Hook
  hWnd.l
  OriginalAdress.l
EndStructure

; Liste für die gesetzten Hooks anlegen
NewList Hooks.Hook()

; ####### HookProzedur #######
Procedure KeyHookProc(hWnd, Msg, wParam, lParam) 
  ; Beispiel für das auffangen eines Tastedrucks
  If Msg = #WM_KEYDOWN
    ; Tasten wurden gedrückt!
    Debug "Tastendruck!"
  EndIf
  ; Mit Original-Prozedur weitermachen...
  ForEach Hooks()
    If Hooks()\hWnd = hWnd
      ; Original-Einsprungpunkt übergeben
      Weiter.l = CallWindowProc_(Hooks()\OriginalAdress, hWnd, Msg, wParam, lParam) 
      Break
    EndIf
  Next
  ProcedureReturn Weiter.l
EndProcedure 

; ####### Start eines Hooks auf ein Gadget #######
Procedure.l StartHookOnGadget(hWnd, ProcAdress.l)
  ; ProcAdress erhält man mit @SubRoutineName()
  AddElement(Hooks())
  Hooks()\hWnd = hWnd
  Hooks()\OriginalAdress = SetWindowLong_(hWnd, #GWL_WNDPROC, ProcAdress.l) 
  ProcedureReturn Hooks()\OriginalAdress
EndProcedure

; ####### Stoppen eines Hooks auf ein Gadget #######
Procedure StopHookOnGadget(hWnd)
  ; Benötigt den Handle des gehookten Gadgets (zB mit GadgetID())
  ForEach Hooks()
    If Hooks()\hWnd = hWnd
      SetWindowLong_(hWnd, #GWL_WNDPROC, Hooks()\OriginalAdress)
      DeleteElement(Hooks())
      Break
    EndIf
  Next
EndProcedure

; ####### Alle Hooks entfernen #######
Procedure StopHookOnAllGadgets()
  ForEach Hooks()
    SetWindowLong_(Hooks()\hWnd, #GWL_WNDPROC, Hooks()\OriginalAdress)
  Next
  ClearList(Hooks())
EndProcedure
Anlegen kann man dann einzelne Hooks einfach so:

Code: Alles auswählen

StartHookOnGadget(GadgetID(#txtRuleNameProc), @KeyHookProc())
StartHookOnGadget(GadgetID(#txtRuleNameWin), @KeyHookProc())
StartHookOnGadget(GadgetID(#txtWindowTitle), @KeyHookProc())
StartHookOnGadget(GadgetID(#txtProcessName), @KeyHookProc())
Beenden eines Hooks dann so:

Code: Alles auswählen

StopHookOnGadget(GadgetID(#txtRuleNameProc))
Beenden aller Hooks geht dann so:

Code: Alles auswählen

StopHookOnAllGadgets()
Vielleicht kann es ja mal jemand brauchen! <)

Grüsse,

Volker
Antworten