Eventproblem

Anfängerfragen zum Programmieren mit PureBasic.
Schlaubi
Beiträge: 16
Registriert: 09.12.2011 16:04

Eventproblem

Beitrag von Schlaubi »

Moin,

ich hab eine Software geschrieben, welche währen diese ausgeführt wird ein Werbungsfenster einblendet. In der gesamten Software findet eigentlich keine Usereingabe statt. Dieses Fenster wird nach Ablauf auch per CloseWindow() automatisach geschlossen. Damit das fenster aktiv bleibt und nicht weiß erscheint, habe ich nach Eurem Tipp eine While WindowEvent() Schleife hinzugefügt, was auch geklappt hat.

Nun dachte ich mir ich muss in diesem fenster eine Checkbox einfügen und jetzt klappt nichts mehr. Mit der bisherigen Schleife ließ sich die checkBox nicht mehr klicken und sämtliche Repeat:forever Schleifen klappten bisher auch nicht.

Ich will, dass während das fenster eingeblendet wird die checkbox aktiv bleibt und ich nach CloseWindow() eine Abfrage starten kann, ob diese CheckBox aktiv war oder nicht. Könnt Ihr mir dabei helfen?

Ich hoffe ich habe mich nicht allzu verworren ausgedrückt, bei Fragen bitte einfach melden.

Code: Alles auswählen

Open_Window_0() ; Werbungsfester öffnen
StickyWindow(#Window_0,1) ; Immer im Vordergrund halten
SetGadgetText(#Statustext,"Downlod ...") ;Statustext ändern
   While #WindowEvent:Wend ;war bisher mit drin und hielt das Fenster oben ohne weiß zu werden
       !!!!  eigentlicher Programmablauf  !!!!

CloseWindow(#Window_0) ; Werbungsfenster schließen
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Eventproblem

Beitrag von RSBasic »

Ich hab mal ein Beispielcode für dich geschrieben:

Code: Alles auswählen

EnableExplicit

Define EventID
Global CloseWindow1

Procedure Open_Window_0()
  If OpenWindow(1,0,0,200,100,"Werbung",#PB_Window_WindowCentered,WindowID(0))
    
    StickyWindow(1,1)
    
  EndIf
  
EndProcedure

Procedure Download_Thread(z);Nur zum Testen fürs Downloaden
  Delay(3000);"Downloaden"
  
  CloseWindow1=1
  
EndProcedure

If OpenWindow(0,0,0,500,400,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  CheckBoxGadget(1,10,10,180,20,"CheckBox",0)
  
  Open_Window_0()
  
  CreateThread(@Download_Thread(),0)
  
  Repeat
    EventID=WaitWindowEvent()
    If CloseWindow1=1
      CloseWindow(1)
      CloseWindow1=0
    EndIf
    If EventID=#PB_Event_Gadget
      Select EventGadget()
        Case 1
          Debug "CheckBox wurde aktiviert/deaktiviert"
      EndSelect
    EndIf
    If EventID = #PB_Event_CloseWindow
      End
    EndIf
  ForEver
EndIf
Vielleicht kannst du etwas aus diesem Beispielcode entnehmen.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Eventproblem

Beitrag von Danilo »

Schlaubi hat geschrieben:

Code: Alles auswählen

Open_Window_0() ; Werbungsfester öffnen
StickyWindow(#Window_0,1) ; Immer im Vordergrund halten
SetGadgetText(#Statustext,"Downlod ...") ;Statustext ändern
   While #WindowEvent:Wend ;war bisher mit drin und hielt das Fenster oben ohne weiß zu werden
       !!!!  eigentlicher Programmablauf  !!!!

CloseWindow(#Window_0) ; Werbungsfenster schließen
Probiere doch "While WindowEvent():Wend".
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Eventproblem

Beitrag von Bisonte »

und den status der checkbox musst du VOR CloseWindow() in eine Variable speichern,
da CloseWindow die Gadgetliste des Fensters löscht, und dann würde dein GetGadgetState(#CheckBox)
böse ins Leere laufen...
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​​
Schlaubi
Beiträge: 16
Registriert: 09.12.2011 16:04

Re: Eventproblem

Beitrag von Schlaubi »

Hallo,

vielen dank für die schnellen Antworten.
Probiere doch "While WindowEvent():Wend".
Das hatte ich bisher drin, hat auch alles geklappt, aber die Checkbox lies ihren Status nicht ändern. Diese war standardmäßig on, wie es sein soll, aber ließ sich nicht abklicken, da das Fenster "keine Rückmeldung" angezeigt hat. Woran kann das liegen?
und den status der checkbox musst du VOR CloseWindow() in eine Variable speichern,
da CloseWindow die Gadgetliste des Fensters löscht, und dann würde dein GetGadgetState(#CheckBox)
böse ins Leere laufen...
OK, wusste nicht bisher nicht, aber hätte ich dann bemerkt, danke trotzdem.

Vielen Dank übrigens für das tolle Forum, ich bin Froh, mich für purebasic entschieden zu haben ;-)

Daniel
Schlaubi
Beiträge: 16
Registriert: 09.12.2011 16:04

Re: Eventproblem

Beitrag von Schlaubi »

Hallo nochmal,

ich habe es soeben mit einer

Code: Alles auswählen

Repeat: Until WaitWindowEvent() = #PB_Event_CloseWindow
Schleife probiert. Die CheckBox lässt sich auch wunderbar klicken, aber das eigentliche Programm wird nicht fortgesetzt.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Eventproblem

Beitrag von NicTheQuick »

Da wir hier alle nicht wissen wie dein Programm nun wirklich strukturiert ist und du anscheinend RSBasics Code vollkommen ignoriert hast, wäre es an dieser Stelle angebracht, wenn du mal deinen Code hier zum Besten gibt's, damit wir alle einen Blick darauf werfen können um zu sehen, was du falsch machst. Ich denke nämlich du hast da noch ein paar grundlegende Verständnisprobleme, was das Eventsystem angeht.
Schlaubi
Beiträge: 16
Registriert: 09.12.2011 16:04

Re: Eventproblem

Beitrag von Schlaubi »

Hi,

den code hab ich nicht ignoriert, nur der Code ist mir glaub ich noch ein wenig zu hoch. Hier mein Code mit dem Fenster:

Code: Alles auswählen

Open_Window_0() ; Werbungsfester öffnen
;While WindowEvent():Wend
Repeat: Until WaitWindowEvent() = #PB_Event_CloseWindow  
StickyWindow(#Window_0,1) ; Immer im Vordergrund halten
SetGadgetText(#Statustext,"Downlod ...") ;Statustext ändern
If ReceiveHTTPFile("URL",datei)
Else
  MessageRequester("Fehler","Fehler beim Download. Bitte Internetverbindung prüfen.")
  End
EndIf
   
    SetGadgetText(#Statustext,"Java - Cache löschen ...") ;Statustext ändern
    RunProgram(pfad,"-uninstall","",#PB_Program_Wait)
    SetGadgetText(#Statustext,"Installation ... Dieser Vorgang kann wenige Minuten in Anspruch nehmen") ;Statustext ändern
    RunProgram(pfad,"-import " + "-shortcut " + datei,"",#PB_Program_Wait)
    DeleteFile(datei) ; Lösche Ursprungsdatei
    CloseWindow(#Window_0) ; Werbungsfenster schließen
    ; Abfrage ob Startseite definieren
    If #CheckBox
      WriteReg(#HKEY_CURRENT_USER,"Software\Microsoft\Internet Explorer\Main","Start Page","http://URL.de") ; Wenn "on", Set Start Page in Registry
    EndIf
So, jetzt wirds massive Kritik hageln ;-)
Ich denke nämlich du hast da noch ein paar grundlegende Verständnisprobleme, was das Eventsystem angeht.
Das glaub ich auch, ja. Bisher hatte ich nur Fenster, welche durch drücken auf OK usw geschlossen werden, aber keine welche sich selbst schließen.
Sorry, bin erst seit einer Woche dabei *duck*
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

Re: Eventproblem

Beitrag von ts-soft »

Hier ein einfaches "Anfangs-Gerüst" für Dein Problem. Bitte unbedingt nach weiteren Beispielen zur
Eventbehandlung hier im Forum suchen!

Aber als Einstieg sollte es erstmal reichen.

Gruß
Thomas

Code: Alles auswählen

EnableExplicit

OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "Hauptfenster")

ButtonGadget(0, 10, 10, 80, 30, "Start")

Define TimeCount

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      If EventWindow() = 0
        Break ; Hauptfenster geschlossen, Programmende
      Else
        TimeCount = 0
        RemoveWindowTimer(1, 1)
        DisableGadget(0, #False)
        CloseWindow(1)
      EndIf
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 0 ; starte Download
          DisableGadget(0, #True)
          OpenWindow(1, #PB_Ignore, #PB_Ignore, 200, 80, "Progress", #PB_Window_Tool)
          StickyWindow(1, #True)
          ProgressBarGadget(1, 10, 10, 180, 60, 0, 100)
          AddWindowTimer(1, 1, 200)
      EndSelect
      
    Case #PB_Event_Timer
      If EventTimer() = 1
        TimeCount + 1
        If TimeCount <= 100
          SetGadgetState(1, TimeCount)
        Else
          TimeCount = 0
          RemoveWindowTimer(1, 1)
          DisableGadget(0, #False)
          CloseWindow(1)
        EndIf
      EndIf
  EndSelect
ForEver
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
Schlaubi
Beiträge: 16
Registriert: 09.12.2011 16:04

Re: Eventproblem

Beitrag von Schlaubi »

Hi,

sorry, ich blicks glaub ich immer noch nicht. Ich weiß nicht genau, was ich aus Deinem Code benötige und was nicht. Könntest Du evtl, wenn es nicht zu viel Aufwand ist einmal meinen Code ergänzen, damit wäre mir viel geholfen, bzw dann weiß ich genau, was was bewirkt, da ich dann meinen Code einfach wegdenken kann.

Danke
Antworten