Seite 1 von 2

Schleifen Fehler glaube ich zumindest

Verfasst: 11.07.2008 03:00
von Aspirant
Hallo,
Ich habe da ein problem ich muss immer 2mal Klicken und die gewünschte Funktion der schleife zu bekommen. Ich versteh nur nicht warum.

Wäre nett wenn da mal jemand drüber schaut und mich auf den Fehler schuppst.

Code: Alles auswählen

Repeat
         wevent =WaitWindowEvent()
         para = GetGadgetState(#lbouton1)
               Select wevent
                  Case #WM_LBUTTONDOWN
                      Select EventGadget()
                        Case #kbouton1
                          ClearGadgetItemList(#lbouton1)         
                          laden()
                        Case #kbouton2
                          EndTimer(#uhr)
                          einstellung()
                          StartTimer(#uhr, 900, @uhr())
                      EndSelect
                  Case #WM_LBUTTONDBLCLK
                    
                    If ipplan(para)\ipname = "Neu" Or ipplan(para)\ipname = ""
                      ipplan(para)\ipport=InputRequester("Port ändern","Neuer Prot wenn nötig Eingeben",ipplan(para)\ipport)
                      ipplan(para)\ippass=InputRequester("Passwort ändern","Neues Prasswort wenn nötig Eingeben",ipplan(para)\ippass)
                    EndIf
                    radmin(" /noinput")
                  Case #WM_RBUTTONDOWN
                    Quit = 0
                    DisplayPopupMenu(8,WindowID(#hfenster))  ; stelle jetzt das Popup-Menü dar
                  Case #PB_Event_Menu
                       Select EventMenu()      ; ermittle den angeklickten Menü-Eintrag...
                        Case 1 :  admin(" /file") 
                          Debug "File"
                          Quit = 1
                        Case 2 :  admin(" /telnet")
                          Debug "telnet"
                          Quit = 1 
                        Case 3 :  admin(" /shutdown")
                          Debug "FullKontroll"
                          Quit = 1
                        Case 4 :  If MessageRequester("WARNUNG", "Achtung Remotesteuerung", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
                                   admin("")
                                  EndIf
                          Quit = 1
                        Case 5 :  MessageRequester("Info", "Das Putty passwort ist >"+ipplan(para)\ippass+"<", #PB_MessageRequester_Ok)
                          putty()
                          Quit = 1
                        Case 6 :  winscp()
                          Quit = 1
                        Case 7 :  SetClipboardText(ipplan(para)\ipip)
                          MessageRequester("Info", "Die IP >"+ipplan(para)\ipip+"< wurde"+Chr(13)+"in die Zwischenablage Kopiert", #PB_MessageRequester_Ok)
                          Quit = 1
                        Case 8
                          whois()
                      EndSelect
               EndSelect
         Until wevent=#PB_Event_CloseWindow
Danke für eure Mühe[/code]

Verfasst: 11.07.2008 07:19
von Bisonte
was ist denn die gewünschte Funktion ?

1 Klick auf was ? und welchen Ausgangswert hat #lbouton1 ? 0 oder 1 ?

Die Fensterdefinition zu der Schleife wär da nicht schlecht...

Aber vielleicht wird auch nur ein WindowEvent verschluckt und es würde reichen aus
dem WaitWindowEvent() im Kopf der Schleife ein WindowEvent() zu machen
und ein Delay(1) kurz vor Until am Ende der Schleife...
(die Wahrsagekugel putz ;) )

Verfasst: 11.07.2008 08:46
von Aspirant
Da zum Beispiel beim Rechtsklick sofort das Popup Menü aufgeht oder Sofort auf den Doppel Klick Reagiert. Ebenso ist es gewünscht das bei einen Klick
auf #kbouton1 oder #kbouton2 auch sofort reagiert wird. Es ist jedoch immer Nötig das jede funktion 2mal an geklickt werden muss. Dabei ist es esegal ob es ein Links-, Rechts- oder Doppel-Klick ist

MFG Aspi

Verfasst: 11.07.2008 08:58
von Bisonte
schon mit WindowEvent und dem Delay probiert ?

Mir fehlen die Prozeduren die da aufgerufen werden zum ausprobieren.
Und die Fensterdef.... schnitz doch einfach mal (die prozeduren nicht unbedingt=kann man ja mit debug simulieren ;) ) die fensterdef zusammen, also konstanten und die gadgetliste der benutzen Gadgets in der schleife

Verfasst: 11.07.2008 09:22
von ts-soft
> schon mit WindowEvent und dem Delay probiert ?
Willste es schlimmer machen? Immer WaitWindowEvent (notfalls mit timeout)

@Aspirant
Dein Code ist nicht testbar, der entscheidende, den fehlerenhaltene Codeteil
fehlt anscheinend gänzlich. Bitte vollständig testbaren Code zur Verfügung
stellen, es gibt hier keine Hellseher.

Was macht die Timerproc? Was steht in den anderen Proc usw.

Gruß
Thomas

Verfasst: 11.07.2008 09:31
von Bisonte
ts-soft hat geschrieben:> schon mit WindowEvent und dem Delay probiert ?
Willste es schlimmer machen? Immer WaitWindowEvent (notfalls mit timeout)
[...]
Gruß
Thomas

/:-> Ja nee, es geht jetzt bloss um den Test...

Verfasst: 11.07.2008 10:41
von Bisonte
In etwa

Code: Alles auswählen

If OpenWindow(0,0,0,640,480,"Test Klicks",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)

    If CreateGadgetList(WindowID(0))
  
    ListIconGadget(0,10,10,100,100,"#lbouton1",80,#PB_ListIcon_GridLines)
    ButtonGadget  (1,200,10,100,20,"KBouton1")
    ButtonGadget  (2,200,40,100,20,"KBouton2")
    
    For i=0 To 10
      AddGadgetItem(0,i,"Da ist Nr. "+Str(i))
    Next i
    
  EndIf
EndIf

Repeat

Event     = WaitWindowEvent()
GadgetID  = EventGadget()

Parameter = GetGadgetState(0)

Select Event

  Case #PB_Event_Gadget
    
    If GadgetID = 1
      Debug "Links 1"
    ElseIf GadgetID = 2
      Debug "Links 2"
    EndIf
    
  Case #WM_RBUTTONDOWN
    
      Debug "PopUpMenu"
  
  Case #WM_LBUTTONDBLCLK
  
    Debug "Doppelklick"
  
EndSelect
  

Until Event = #PB_Event_CloseWindow
Ich hoffe ich liege mit diesem Beispiel richtig...

Also erst dauf gadgets prüfen mit #PB_Event_Gadget und dann auf die Mausknöppe.

Du solltest, um keinen Absturz zu kriegen wegen Fehlermeldung, prüfen ob in deinem Gadget #lbouton1 auch was angewählt ist !

Also in etwa : If para>-1 weil du ein Array benutzt, daß mit dem Wert gefüttert wird, und ein Hallo(-1) ist da wohl ungünstig !

Verfasst: 11.07.2008 10:49
von edel

Code: Alles auswählen

Parameter = GetGadgetState(0)
Das muss da nicht stehen, das kann man da abrufen wo man es braucht.

Verfasst: 11.07.2008 11:07
von Bisonte
Ist klar, aber wir wissen ja nicht, wo das vielleicht noch gebraucht wird...

aber hier ein funktionierendes ding mit Aspirant's Schleife und meinem komischen dazugedenke ;)

Code: Alles auswählen

Repeat
        
  wevent =WaitWindowEvent()
  para = GetGadgetState(#lbouton1) ; Oder wie edel sagt : weg damit...und dann aber unten anpassen
  
  Select wevent
    ;##### Gadgets
    Case #PB_Event_Gadget    
      Select EventGadget()        
        Case #kbouton1
          ClearGadgetItemList(#lbouton1)         
          laden()          
        Case #kbouton2
          EndTimer(#uhr)
          einstellung()
          StartTimer(#uhr, 900, @uhr())
      EndSelect
    ;##### Doppelklick
    Case #WM_LBUTTONDBLCLK
      Debug "DoppelKlick"
      If para>-1 ; oder hier dann ein If GetGadgetState(#lbouton1)>-1
        If ipplan(para)\ipname = "Neu" Or ipplan(para)\ipname = ""
          ipplan(para)\ipport=InputRequester("Port ändern","Neuer Prot wenn nötig Eingeben",ipplan(para)\ipport)
          ipplan(para)\ippass=InputRequester("Passwort ändern","Neues Prasswort wenn nötig Eingeben",ipplan(para)\ippass)
        EndIf
        radmin(" /noinput")
      EndIf
    ;##### Rechtklick
    Case #WM_RBUTTONDOWN    
      Quit = 0
      Debug "Popup";DisplayPopupMenu(8,WindowID(#hfenster))  ; stelle jetzt das Popup-Menü dar
    ;##### Menu
    Case #PB_Event_Menu    
      Select EventMenu()      ; ermittle den angeklickten Menü-Eintrag...
        Case 1 : admin(" /file")
          Debug "File"
          Quit = 1          
        Case 2 :  admin(" /telnet")          
          Debug "telnet"
          Quit = 1          
        Case 3 :  admin(" /shutdown")          
          Debug "FullKontroll"
          Quit = 1        
        Case 4           
          If MessageRequester("WARNUNG", "Achtung Remotesteuerung", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
            admin("")
          EndIf
          Quit = 1          
        Case 5 :  MessageRequester("Info", "Das Putty passwort ist >"+ipplan(para)\ippass+"<", #PB_MessageRequester_Ok)          
          putty()
          Quit = 1        
        Case 6            
          winscp()
          Quit = 1               
        Case 7          
          SetClipboardText(ipplan(para)\ipip)
          MessageRequester("Info", "Die IP >"+ipplan(para)\ipip+"< wurde"+Chr(13)+"in die Zwischenablage Kopiert", #PB_MessageRequester_Ok)
          Quit = 1          
        Case 8          
          whois()      
      EndSelect  
  EndSelect
Until wevent=#PB_Event_CloseWindow

Verfasst: 16.07.2008 12:51
von Kaeru Gaman
ein zweimal-klicken-müssen weißt oft darauf hin,
dass mehrfach (Wait)WindowEvent verwendet wird.
man könnte also mutmaßen, dass Aspirant in irgendeiner
der Routinen die er aufruft noch einen EventCatch drin hat.

da der Code aber völlig unvollständig ist,
wie ts ganz richtig anmerkte,
lässt sich nix testen und ist das alles nur rumgerate...