Seite 1 von 2
Frage zum String Gadget
Verfasst: 15.09.2007 18:13
von Aspirant
Hallo,
kann mir mal bitte jemand erklären warum mein String Gadget nicht geleert wird?
Code: Alles auswählen
OpenWindow(0, 100, 100, 300, 100, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
StringGadget(0, 8, 10, 306, 20, "", #PB_String_UpperCase)
Repeat
ereignis.l = WaitWindowEvent()
If ereignis.l = #WM_KEYDOWN
Select EventwParam()
Case #VK_ADD
SetGadgetText(0,"")
Case #VK_SUBTRACT
SetGadgetText(0,"")
Case #VK_A
SetGadgetText(0,"")
Case #VK_1
SetGadgetText(0,"")
EndSelect
EndIf
Until ereignis.l = #PB_Event_CloseWindow
Danke
Verfasst: 15.09.2007 18:20
von Kaeru Gaman
1. dein stringgadget ist leer
2. wenn ich beim erstellen einen text einfüge, wird es beim druck auf die tasten geleert,
wenn der cursor nicht auf dem gadget steht.
3. und das ist wohl dein problem:
wenn der cursor auf dem gadget steht, wird das zeichen, dass du zum leeren drückst, wieder eingefügt.
anscheinend wird das "zeichen einfügen"-event erst nach dem "SetGadgetText"-event verarbeitet.
das mag daran liegen, dass du ein Systemnahes "tastendruck"-event benutzt.
anscheinend wird es erst später vom system in ein "Gadget bearbeiten"-event umgesetzt.
Verfasst: 15.09.2007 18:44
von Aspirant
OK das kann ich nach vollzihen was mich dann aber zu einen Neuen Problem
ich frage die Tasten ja um in eine Procedure zu Springen nach der Rückich gerne ein Leere Gadget hätte.
Bleibt also wie kann Ich die Taste abfange und das gadget leeren wenn nicht so?
hast du für auch eine Idee?
ein Sleep wird mich da ja nicht weiter Bringen das Habe ich schon versucht
und wie ich ein "del" ind den tastatur Puffer bekomme habe ich noch nicht gefunden
Verfasst: 15.09.2007 19:45
von Aspirant
Habe es jetzt so gelöst!
Code: Alles auswählen
Procedure offen(warten)
Sleep_(warten)
SetGadgetText(0,"")
EndProcedure
OpenWindow(0, 100, 100, 300, 100, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
StringGadget(0, 8, 10, 306, 20, "", #PB_String_UpperCase)
Repeat
ereignis.l = WaitWindowEvent()
If ereignis.l = #WM_KEYDOWN
Select EventwParam()
Case #VK_ADD
Sleep_(100)
CreateThread(@offen(),1)
SetGadgetText(0,"")
Case #VK_SUBTRACT
Sleep_(200)
SetGadgetText(0,"")
Case #VK_A
Sleep_(300)
SetGadgetText(0,"")
Sleep_(400)
Case #VK_1
SetGadgetText(0,"")
EndSelect
EndIf
Until ereignis.l = #PB_Event_CloseWindow
beemdet sicher der Thread mit beenden der Prozedure selbst und gibt die Resoursen wie der frei oder ist es besser ein kill auf zu rufen?
Verfasst: 15.09.2007 20:48
von FGK
@Aspirant
Also das mit dem Thread ist meiner Meinung schon etwas "unkonventionell".
Ich habs mal mit nem Callback versucht.
Funktioniert zwar, hat aber den Schönheitsfehler daß das
Zeichen der auszulösenden Taste kurz noch im StringGadget
zu lesen ist.
Vielleicht kanns einer noch verbessern.
Gruß FGK
Code: Alles auswählen
Procedure SetCallbackEx(hwnd.l, Proc.l)
Protected OldProc = SetWindowLong_(hwnd, #GWL_WNDPROC, Proc)
If OldProc
SetWindowLong_(hwnd, #GWL_USERDATA, OldProc)
EndIf
ProcedureReturn OldProc
EndProcedure
Procedure Callback(hwnd,msg,wParam,lParam)
Protected OldProc = GetWindowLong_(hwnd, #GWL_USERDATA)
result = #PB_ProcessPureBasicEvents
If #WM_KEYUP= msg
Select wParam
Case #VK_ADD
SetGadgetText(0,"")
ProcedureReturn result
Case #VK_SUBTRACT
SetGadgetText(0,"")
ProcedureReturn result
Case #VK_A
SetGadgetText(0,"")
ProcedureReturn result
Case #VK_1
SetGadgetText(0,"")
ProcedureReturn result
EndSelect
EndIf
ProcedureReturn CallWindowProc_(OldProc, hwnd, msg, wParam, lParam)
EndProcedure
OpenWindow(0, 100, 100, 300, 100, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
StringGadget(0, 8, 10, 306, 20, "", #PB_String_UpperCase)
SetCallbackEx(GadgetID(0), @Callback())
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Verfasst: 15.09.2007 21:07
von edel
@FGK
Windows kennt die Konstante #PB_ProcessPureBasicEvents nicht.
AUf MSDN findest du immer den Wert der erwartet wird. In diesem
Fall (WM_KEYUP)
An application should return zero if it processes this message.
Also eine 0.
Verfasst: 15.09.2007 22:50
von FGK
@Edel
Ok - dank deinem Hinweis senden wir nun mit einer "0"
den richtigen Verarbeitungscode.
Trotzdem bleibt der Schönheitsfehler daß das eingegebne
Zeichen noch kurz zu sehen ist.
Hast du dazu noch ne Idee? Damit wir Aspirant ne zufrieden
stellende Lösung bieten können.
Gruß FGK
Verfasst: 15.09.2007 23:37
von Aspirant
Hallo den schönheits Fehler habe ich auch nach meiner Idee
habe jetzt aber AddKeyboardShortcut(#Window, Shortcut, Event) in verbindung mit EventMenu() macht es genau was ich will.
Verfasst: 15.09.2007 23:52
von Aspirant
HEHE zur früh gefreut
nun mach ich es so ist denke ich besser und hat nicht das Problem des String Gadget
Code: Alles auswählen
#hallo =10
OpenWindow(0, 100, 100, 300, 100, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
StringGadget(#hallo, 8, 10, 306, 20, "", #PB_String_UpperCase)
AddKeyboardShortcut(0, #PB_Shortcut_Add, 12)
AddKeyboardShortcut(0, #PB_Shortcut_A, 20)
AddKeyboardShortcut(0, #PB_Shortcut_1, 40)
AddKeyboardShortcut(0, #PB_Shortcut_Pad1, 40)
AddKeyboardShortcut(0, #PB_Shortcut_Subtract, 11)
Repeat
ereignis.l = WaitWindowEvent()
;If ereignis.l = #WM_KEYDOWN
Debug EventMenu()
Select EventMenu()
Case 12
Debug "Plus"
Case 11
Debug "Minus"
Case 20
Debug "A A A A A A"
Case 40
Debug "1 1 1 1 1 1"
EndSelect
;EndIf
Until ereignis.l = #PB_Event_CloseWindow
doch dafür kannich die Taste nicht einmal abfragen weil EventMenü seine Status nicht ändert was nun ein neues Problem ist.
hat da vieleicht einer ne Idee?
Verfasst: 16.09.2007 00:30
von Kaeru Gaman
du musst erstmal per Select Event : Case #PB_Event_Menu checken, ob es überhaupt ein menuevent ist.
danach erst kannst du Select EventMenu() ausführen.
PS:
probier mal bei deiner ursprünglichen lösung, ob es mit WM_KEYUP besser funktioniert als mit KEYDOWN