Seite 1 von 2

eingabefeld für ein lizenz schlüssel [Gelöst]

Verfasst: 18.02.2011 10:55
von jpd
Hallo,

ich versuche (vergeblich) ein Eingabefeld für ein lizenz schlüssel zu basteln,

der lizenz schlüssel sieht folgendermaßen aus

xxxxx-yyyyy-xxxxx-yyyyy-xxxxx

ich habe fünf textgadget generiert die jeweils max 5 Zeichen annehmen.
das Problem ist, falls ich ein Zeichen falsch eingebe dann kann ich keine Änderung mehr am vorherigen Feld vornehmen.

hatte mir vorgestellt mir der taste "#PB_Shortcut_Back" zurück zu springen aber.. ich habe ja eine Begrenzung auf 5 Zeichen gesetzt und dadurch springt mein Cursor nicht zurück.

kann jemand weiterhelfen?

Code: Alles auswählen


Enumeration
    #Window_Lic
EndEnumeration


Enumeration
    #Lic_1
    #Lic_2
    #Lic_3
    #Lic_4
    #Lic_5
    #Btn_Lic
    #Btn_lic_abbr
    #Menu_Back    
EndEnumeration




Procedure Open_Window_Lic()
    If OpenWindow(#Window_Lic, 425, 277, 478, 192, "Lizenz Assistent",  #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered |#PB_Window_SystemMenu)
        SetWindowColor(#Window_Lic,#White)
        StringGadget(#Lic_1, 40, 100, 70, 20, "")
        StringGadget(#Lic_2, 120, 100, 70, 20, "")
        StringGadget(#Lic_3, 200, 100, 70, 20, "")
        StringGadget(#Lic_4, 280, 100, 70, 20, "")
        StringGadget(#Lic_5, 360, 100, 70, 20, "")
        ButtonGadget(#Btn_Lic, 40, 140, 85, 30, "Fertig stellen")
        ButtonGadget(#Btn_lic_abbr, 140, 140, 85, 30, "Abbrechen")
        AddKeyboardShortcut(#Window_lic, #PB_Shortcut_Back,#Menu_Back)
    EndIf
EndProcedure


Open_Window_Lic()

Repeat ; Start of the event loop
    
    Event = WaitWindowEvent() ; This line waits until an event is received from Windows
    
    WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
    
    GadgetID = EventGadget() ; Is it a gadget event?
    
    EventType = EventType() ; The event type
    
    ;You can place code here, and use the result as parameters for the procedures
    
    Select event
        Case #PB_Event_Menu 
            Select EventMenu() 
                Case #Menu_Back
                    Debug "?"
                    
                    If GetActiveGadget() >#lic_1
                        If Len(GetGadgetText(GetActiveGadget()))=0
                            SetActiveGadget(GetActiveGadget() - 1)
                            
                        ElseIf Len(GetGadgetText(GetActiveGadget())) > 0
                            nr=Len(GetGadgetText(GetActiveGadget()))
                            SetGadgetText(GetActiveGadget(), Mid(GetGadgetText(GetActiveGadget()),1,nr-1))
                        EndIf
                        
                    EndIf
            EndSelect
    EndSelect
    If Event = #PB_Event_Gadget
        
        
        If GadgetID = #Lic_1
            If Len(GetGadgetText(#Lic_1))=5
                
                SetActiveGadget(#lic_2)
                
            EndIf
            
        ElseIf GadgetID = #Lic_2
            If Len(GetGadgetText(#Lic_2))=5
                SetActiveGadget(#lic_3)
            EndIf
        ElseIf GadgetID = #Lic_3
            If Len(GetGadgetText(#Lic_3))=5
                SetActiveGadget(#lic_4)
            EndIf
        ElseIf GadgetID = #Lic_4
            If Len(GetGadgetText(#Lic_4))=5
                SetActiveGadget(#lic_5)
                
            EndIf
        ElseIf GadgetID = #Lic_5
            If Len(GetGadgetText(#Lic_5))=5
                SetActiveGadget(#Btn_Lic)
            EndIf
        ElseIf GadgetID = #Btn_Lic
            
            
        ElseIf GadgetID = #Btn_lic_abbr
            End
        EndIf
        
    EndIf
    
Until Event = #PB_Event_CloseWindow ; End of the event loop

End



Re: eingabefeld für ein lizenz schlüssel

Verfasst: 18.02.2011 11:17
von c4s
Einfach die Textlimitierung direkt setzen und nicht nur simulieren (funktioniert aber nur auf Windows):

Code: Alles auswählen

Macro StringGadgetTextLength(GadgetNr, Length)
	SendMessage_(GadgetID(GadgetNr), #EM_LIMITTEXT, Length, 0)
EndMacro

Re: eingabefeld für ein lizenz schlüssel

Verfasst: 18.02.2011 11:47
von SebastianJu2
Oder einfach nur ein großes Texteld machen und der User muss die Striche selbst reinschreiben. Ist auch üblich. Bzw gibt es während des Schreibens ein Event mit dem du nach je 5 Zeichen automatisch ein - setzen kannst? Dann müsstest du aber auch den Löschen-Key abfangen damit, falls ein - gelöscht wird es nicht sofort neu geschrieben wird. Oder die Anzahl Zeichen tracken.

Re: eingabefeld für ein lizenz schlüssel

Verfasst: 18.02.2011 11:51
von jpd
Hallo c4s,

erstmal vielen Dank für deine Hilfe,
habe dein macro so eingesetzt:

Code: Alles auswählen

If GadgetID = #Lic_1
            StringGadgetTextLength(#lic_1,5)
        ElseIf GadgetID = #Lic_2
            StringGadgetTextLength(#lic_2,5)
        ElseIf GadgetID = #Lic_3
            StringGadgetTextLength(#lic_3,5)
        ElseIf GadgetID = #Lic_4
            StringGadgetTextLength(#lic_4,5)
        ElseIf GadgetID = #Lic_5
            StringGadgetTextLength(#lic_5,5)
        ElseIf GadgetID = #Btn_Lic
            
            
        ElseIf GadgetID = #Btn_lic_abbr
            End
        EndIf
somit wird der text genau auf 5 Zeichen begrenzt aber springt nicht zum nächsten gadget..
leider habe ich keine Erfahrung mit "macro" :oops:
wo kann ich mein setactivegadget platzieren damit der Cursor automatisch zum nächsten Feld springt?

Re: eingabefeld für ein lizenz schlüssel

Verfasst: 18.02.2011 12:35
von c4s
Ein Macro ist nichts weiter als eine Art von Procedure, die direkt im Code platziert wird. Mehr Informationen dazu findest du in der Hilfe.
Du musst diese nur einmal aufrufen, nachdem das jeweilige StringGadget() erstellt wurde.

Bei mir hatte ich das ungefähr so gelöst. Du musst den Code halt entsprechend anpassen:

Code: Alles auswählen

[...]

Select WaitWindowEvent()
	Case #PB_Event_Gadget
		Select EventGadget()
			Case #RegistrationCodePart1 To #RegistrationCodePart3
				GadgetNr = EventGadget()
				If Len(GetGadgetText(GadgetNr)) = 4
					Select GadgetNr
						Case #RegistrationCodePart1 : GadgetNr = #RegistrationCodePart2
						Case #RegistrationCodePart2 : GadgetNr = #RegistrationCodePart3
						Case #RegistrationCodePart3 : GadgetNr = #RegistrationCodePart4
					EndSelect
					SetActiveGadget(GadgetNr)
				EndIf

[...]
P.S.
Findest du nicht, dass eine 25-stellige Registrierungsnummer etwas lang ist? 16 sollten genügen und erspart den Benutzer einiges an Tipp-Arbeit und wohlmöglich Ärger...

Re: eingabefeld für ein lizenz schlüssel

Verfasst: 18.02.2011 12:58
von jpd
so wie ich verstehe ist die Implementierung der macro in meinen Beispiel falsch! :-)
Du musst diese nur einmal aufrufen, nachdem das jeweilige StringGadget() erstellt wurde.
wo genau? sorry aber ich glaube ich bin "wochenendreif.." und kapiere das nicht :(
Findest du nicht, dass eine 25-stellige Registrierungsnummer etwas lang ist?
ja definitiv! das kann ich aber nicht beeinflussen da es sich um eine Anwendung von Dritthersteller handelt.

vielen Dank

Re: eingabefeld für ein lizenz schlüssel

Verfasst: 18.02.2011 14:27
von kapege
Hi jpd,

erst wird das Gadget erstellt, danach per WinApi-Befehl auf 5 Stellen begrenzt und das bei allen 5 Gadget's.

Code: Alles auswählen


Procedure Open_Window_Lic()
    If OpenWindow(#Window_Lic, 425, 277, 478, 192, "Lizenz Assistent",  #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered |#PB_Window_SystemMenu)
        SetWindowColor(#Window_Lic,#White)

        StringGadget(#Lic_1, 40, 100, 70, 20, "")
        StringGadgetTextLength(#lic_1,5)            ; hier wird das Macro aufgerufen

        StringGadget(#Lic_2, 120, 100, 70, 20, "")
        StringGadgetTextLength(#lic_2,5)            ; der Compiler ersetzt diese Zeile 

        StringGadget(#Lic_3, 200, 100, 70, 20, "")
        StringGadgetTextLength(#lic_3,5)            ; SendMessage_(GadgetID(#Lic_3), #EM_LIMITTEXT, 5, 0)

        StringGadget(#Lic_4, 280, 100, 70, 20, "")
        StringGadgetTextLength(#lic_4,5)

        StringGadget(#Lic_5, 360, 100, 70, 20, "")
        StringGadgetTextLength(#lic_5,5)

        ButtonGadget(#Btn_Lic, 40, 140, 85, 30, "Fertig stellen")
        ButtonGadget(#Btn_lic_abbr, 140, 140, 85, 30, "Abbrechen")
        AddKeyboardShortcut(#Window_lic, #PB_Shortcut_Back,#Menu_Back)
    EndIf
EndProcedure



Re: eingabefeld für ein lizenz schlüssel

Verfasst: 18.02.2011 14:47
von jpd
Hallo Kapege,

Danke für die anpassung der procedur.

hatte scho mein code so geändert aber hilft nicht.
das problem ist das auch mit dieser variante nicht mehr möglich am stringgadget was zu verändern.

Code: Alles auswählen


Enumeration
    #Window_Lic
EndEnumeration


Enumeration
    #Lic_1
    #Lic_2
    #Lic_3
    #Lic_4
    #Lic_5
    #Btn_Lic
    #Btn_lic_abbr
    #Menu_Back    
EndEnumeration


Macro StringGadgetTextLength(GadgetNr, Length)
    SendMessage_(GadgetID(GadgetNr), #EM_LIMITTEXT, Length, 0)
EndMacro

Procedure Open_Window_Lic()
    If OpenWindow(#Window_Lic, 425, 277, 478, 192, "Lizenz Assistent",  #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered |#PB_Window_SystemMenu)
        SetWindowColor(#Window_Lic,#White)
        StringGadget(#Lic_1, 40, 100, 70, 20, "")
        StringGadget(#Lic_2, 120, 100, 70, 20, "")
        StringGadget(#Lic_3, 200, 100, 70, 20, "")
        StringGadget(#Lic_4, 280, 100, 70, 20, "")
        StringGadget(#Lic_5, 360, 100, 70, 20, "")
        ButtonGadget(#Btn_Lic, 40, 140, 85, 30, "Fertig stellen")
        ButtonGadget(#Btn_lic_abbr, 140, 140, 85, 30, "Abbrechen")
        StringGadgetTextLength(#lic_1,5)
        StringGadgetTextLength(#lic_2,5)
        StringGadgetTextLength(#lic_3,5)
        StringGadgetTextLength(#lic_4,5)
        StringGadgetTextLength(#lic_5,5)
        AddKeyboardShortcut(#Window_lic, #PB_Shortcut_Back,#Menu_Back)
    EndIf
EndProcedure




Open_Window_Lic()

Repeat
    Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
            Quit = #True
        
        Case #PB_Event_Gadget
            Select EventGadget()
                Case #Lic_1 To #Lic_5
                    GadgetNr = EventGadget()
                    
                    If Len(GetGadgetText(GadgetNr)) = 5
                        Select GadgetNr
                            Case #Lic_1 : GadgetNr = #Lic_2
                            Case #Lic_2 : GadgetNr = #Lic_3
                            Case #Lic_3 : GadgetNr = #Lic_4
                            Case #Lic_4 : GadgetNr = #Lic_5    
                        EndSelect
                        SetActiveGadget(GadgetNr)
                    EndIf   
                    
                    
                Case  #Btn_Lic
                    go=0
                    mykey.s=""
                    For x= 0 To 4
                        If  Len(GetGadgetText(#Lic_1+x)) =5
                            Debug "ok"
                            go=1
                            mykey=mykey+GetGadgetText(#lic_1+x)+"-"
                        Else
                            Debug "gadget :" +Str(#lic_1+x) 
                            go=0
                            mykey=""
                            Break
                            
                        EndIf
                    Next    
                    If go= 1    
                        Debug RTrim(mykey,"-")
                    EndIf
                Case#Btn_lic_abbr
                    End     
            EndSelect
    EndSelect
Until Quit


End
;


Re: eingabefeld für ein lizenz schlüssel

Verfasst: 18.02.2011 15:30
von c4s
Da hast du Recht. Naja hauste halt noch folgendes drum herum:

Code: Alles auswählen

                Case #Lic_1 To #Lic_4
                    If EventType() = #PB_EventType_Change
                      GadgetNr = EventGadget()
                   
                      If Len(GetGadgetText(GadgetNr)) = 5
                          Select GadgetNr
                              Case #Lic_1 : GadgetNr = #Lic_2
                              Case #Lic_2 : GadgetNr = #Lic_3
                              Case #Lic_3 : GadgetNr = #Lic_4
                              Case #Lic_4 : GadgetNr = #Lic_5   
                          EndSelect
                          SetActiveGadget(GadgetNr)
                      EndIf
                    EndIf

Re: eingabefeld für ein lizenz schlüssel

Verfasst: 18.02.2011 15:54
von Vera
Hallo,

danke für diese herausfordernde Aufgabe und die Tips :)

Da der Code durch das empfohlene Makro nur noch win-tauglich ist, habe ich versucht für den Ausgangscode auch eine Lösung zu finden. Geht vermutlich noch eleganter, doch es funktioniert erstmal wie gewünscht ;)

Grüße ~ Vera

Code: Alles auswählen

Enumeration
  #Window_Lic
EndEnumeration

Enumeration
  #Lic_1
  #Lic_2
  #Lic_3
  #Lic_4
  #Lic_5
  #Btn_Lic
  #Btn_lic_abbr
  #Btn_lic_clear
  #Menu_Back   
EndEnumeration

Procedure Open_Window_Lic()
  If OpenWindow(#Window_Lic, 425, 277, 478, 192, "Lizenz Assistent",  #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered |#PB_Window_SystemMenu)
    SetWindowColor(#Window_Lic,$ffffff)
    StringGadget(#Lic_1, 40, 100, 70, 20, "")
    StringGadget(#Lic_2, 120, 100, 70, 20, "")
    StringGadget(#Lic_3, 200, 100, 70, 20, "")
    StringGadget(#Lic_4, 280, 100, 70, 20, "")
    StringGadget(#Lic_5, 360, 100, 70, 20, "")
    ButtonGadget(#Btn_Lic, 40, 140, 85, 30, "Fertig stellen")
    ButtonGadget(#Btn_lic_abbr, 140, 140, 85, 30, "Abbrechen")
    ButtonGadget(#Btn_lic_clear, 240, 140, 85, 30, "Leeren")
    AddKeyboardShortcut(#Window_lic, #PB_Shortcut_Back,#Menu_Back)
    SetActiveGadget(#Lic_1)
  EndIf
EndProcedure

Open_Window_Lic()

Repeat 
  
  wwe = WaitWindowEvent()
  
  Select wwe
    Case #PB_Event_Menu
      Select EventMenu()
        Case #Menu_Back
          ;  Debug "?"
          If GetActiveGadget() >= #lic_1 And GetActiveGadget() <= #lic_5
            If Len(GetGadgetText(GetActiveGadget()))=0
              If GetActiveGadget() > #lic_1
                SetActiveGadget(GetActiveGadget() - 1)
              EndIf
              
            ElseIf Len(GetGadgetText(GetActiveGadget()))=5
              nr2 = GetActiveGadget()
              text.s = Left(GetGadgetText(nr2), 4)
              SetGadgetText(GetActiveGadget(), text)
              
            ElseIf Len(GetGadgetText(GetActiveGadget())) > 0
              nr=Len(GetGadgetText(GetActiveGadget()))
              SetGadgetText(GetActiveGadget(), Mid(GetGadgetText(GetActiveGadget()),1,nr-1))
            EndIf
          EndIf
          
      EndSelect
      
    Case #PB_Event_Gadget
      Select EventGadget()
          
        Case #lic_1 To #lic_5
          If EventType() = #PB_EventType_Change
            GadgetNr = EventGadget()
            If Len(GetGadgetText(GadgetNr)) >= 5
              SetGadgetText(GadgetNr, Left(GetGadgetText(GadgetNr), 5))
              Select GadgetNr
                Case #lic_1 : GadgetNr = #lic_2
                Case #lic_2 : GadgetNr = #lic_3
                Case #lic_3 : GadgetNr = #lic_4
                Case #lic_4 : GadgetNr = #lic_5
                Case #lic_5 : GadgetNr = #Btn_Lic
              EndSelect
              SetActiveGadget(GadgetNr)
            EndIf
          EndIf
          
        Case #Btn_Lic
          Debug "hui"
        Case #Btn_lic_abbr
          quit=1
          
        Case #Btn_lic_clear
          SetGadgetText(#lic_1, "")
          SetGadgetText(#lic_2, "")
          SetGadgetText(#lic_3, "")
          SetGadgetText(#lic_4, "")
          SetGadgetText(#lic_5, "")
          SetActiveGadget(#Lic_1)
      EndSelect
      
      
  EndSelect
  
  
  ;   If Event = #PB_Event_Gadget
  ;     
  ;     If GadgetID = #Lic_1
  ;       If Len(GetGadgetText(#Lic_1))=5
  ;         SetActiveGadget(#lic_2)
  ;       EndIf
  ;     ElseIf GadgetID = #Lic_2
  ;       If Len(GetGadgetText(#Lic_2))=5
  ;         SetActiveGadget(#lic_3)
  ;       EndIf
  ;     ElseIf GadgetID = #Lic_3
  ;       If Len(GetGadgetText(#Lic_3))=5
  ;         SetActiveGadget(#lic_4)
  ;       EndIf
  ;     ElseIf GadgetID = #Lic_4
  ;       If Len(GetGadgetText(#Lic_4))=5
  ;         SetActiveGadget(#lic_5)
  ;       EndIf
  ;     ElseIf GadgetID = #Lic_5
  ;       If Len(GetGadgetText(#Lic_5))=5
  ;         SetActiveGadget(#Btn_Lic)
  ;       EndIf
  ;
  ;     ElseIf GadgetID = #Btn_Lic
  ;       
  ;     ElseIf GadgetID = #Btn_lic_abbr
  ;       End
  ;     EndIf
  ;     
  ;   EndIf
  
Until wwe = #PB_Event_CloseWindow Or quit=1

End