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