Schleifen Fehler glaube ich zumindest

Anfängerfragen zum Programmieren mit PureBasic.
Aspirant
Beiträge: 101
Registriert: 19.10.2006 12:19

Schleifen Fehler glaube ich zumindest

Beitrag 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]
Ich würde mich ja gerne geistig mit dir duellieren, aber wie ich sehe bist du unbewaffnet.
================================
WinXP Pro, W2k3, Eisfair
-----------------------------
PB 4.40 auf WinXPpro kauf
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag 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 ;) )
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Aspirant
Beiträge: 101
Registriert: 19.10.2006 12:19

Beitrag 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
Ich würde mich ja gerne geistig mit dir duellieren, aber wie ich sehe bist du unbewaffnet.
================================
WinXP Pro, W2k3, Eisfair
-----------------------------
PB 4.40 auf WinXPpro kauf
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag 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
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag 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...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag 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 !
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Code: Alles auswählen

Parameter = GetGadgetState(0)
Das muss da nicht stehen, das kann man da abrufen wo man es braucht.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag 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
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten