Kontrolle über Windows

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Kontrolle über Windows

Beitrag von marcelx »

Hallo zusammen

Ich habe eine Haupt-Windows und mit START wird eine zweite Windows aufgebaut.
Ich möchte die event in jeden Windows haben. Geht leider nicht.
Wenn ich mit START den zweite Windows aufbaut, kann ich die Button in Window_1 nicht verwenden: es sei dem ich kopier es wie in
Case #ButtonStart:Debug "START 2"

Gibt es da ein bessere Lösung als so?

Code: Alles auswählen

Enumeration
  #Window_0
  #Window_1
EndEnumeration

Enumeration
  ; window_0
  #ButtonStart
  #ButtonStop
  ; window_1
  #ButtonOK
EndEnumeration

Procedure window1()
  OpenWindow(#Window_1, 0, 0, 470, 210, "Win 0", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ButtonGadget(#ButtonOK, 180, 30, 80, 30, "OK")
  Repeat
    Event = WaitWindowEvent()
  
    Select event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case #ButtonOK:Debug "OK"
            
          ;main (Kopie windoe_0 
          Case #ButtonStart:Debug "START 2"  
        EndSelect
    EndSelect
  Until Event = #PB_Event_CloseWindow   
  CloseWindow(#Window_1) 
EndProcedure

OpenWindow(#Window_0, 0, 0, 470, 210, "Win 0", #PB_Window_SystemMenu)
ButtonGadget(#ButtonStart, 180, 30, 80, 30, "START")
ButtonGadget(#ButtonStop, 180, 110, 80, 30, "STOP")

Repeat
  Event = WaitWindowEvent()

  Select event
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #ButtonStart:Debug "START"
          window1()
        Case #ButtonStop:Debug "STOP"
          If IsWindow(#Window_1)
            CloseWindow(#Window_1) 
          EndIf
      EndSelect
  EndSelect
Until Event = #PB_Event_CloseWindow  
Gruß
MarcelX

EDIT

Code: Alles auswählen

Enumeration
  #Window_0
  #Window_1
EndEnumeration

Enumeration
  ; window_0
  #ButtonStart
  #ButtonStop
  ; window_1
  #ButtonOK
EndEnumeration

Procedure window1()
  OpenWindow(#Window_1, 0, 0, 470, 210, "Win 0", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ButtonGadget(#ButtonOK, 180, 30, 80, 30, "OK")
EndProcedure

OpenWindow(#Window_0, 0, 0, 470, 210, "Win 0", #PB_Window_SystemMenu)
ButtonGadget(#ButtonStart, 180, 30, 80, 30, "START")
ButtonGadget(#ButtonStop, 180, 110, 80, 30, "STOP")

Repeat
  Event = WaitWindowEvent()

  Select event
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #ButtonStart:Debug "START"
          window1()
        Case #ButtonStop:Debug "STOP"
          If IsWindow(#Window_1)
            CloseWindow(#Window_1) 
          EndIf
          
         ; case Window_1
        Case #ButtonOK:Debug "OK"
      EndSelect
  EndSelect
Until Event = #PB_Event_CloseWindow  
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
Olafmagne
Beiträge: 130
Registriert: 07.12.2017 17:30
Wohnort: Sete/Frankreich

Re: Kontrolle über Windows

Beitrag von Olafmagne »

Dein Erster Code Hat folgendes Problem:

Du rufst Waitwindowevent auf, gehst in der repeat-Schleife in eine Procedure und rufst waitwindowevent nochmal auf!
Das geht nicht,weil Windows-OS ALLE events ALLER Fenster und Gadgets in einen EventQueue schreibt, du must dann mit "EventSource()" das Fenster/Gadget abfragen und kannst dann auf das Event reagieren,
'Es kann nur einen geben' , Nur Eine EventSchleife! Es gibt keine Möglichkeit, ein WaitEvent nur für EIN Fenster Abzufragen.
Ergo ist es unmöglich, dass jedes Fenster eine eigene EventSchleife hat.

Was du machen kannst, ist ein BindEvent() für JEDES Fenster, und dort alles, was in diesem Fenster geschehen könnte,
abhandeln.
Trotzdem, es gibt nur eine EventSchleife!
In der PB-Hilfe ist BindEvent() Nachzulesen

Hoffe, das hat geholfen

Olaf
Unsinnige Anweisungen von Seiten des Chef's lösen grundsätzlich ein "Syntax Error" bei mir aus
OS=Windows 11
PB=5.31/5.73/6 <> BlitzPlus/Blitz3D <> FreeBasic
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Kontrolle über Windows

Beitrag von marcelx »

Danke für deine Rückmeldung.
Es ist mir später bewusst geworden, dass nur ein WaitWindowEvent() vorkommen sollte (siehe meine 2. source - Procedure window1())
Ich schaue mich BindEvent() an - Danke
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
Olafmagne
Beiträge: 130
Registriert: 07.12.2017 17:30
Wohnort: Sete/Frankreich

Re: Kontrolle über Windows

Beitrag von Olafmagne »

Zum besseren Verständniss:
Window verwaltet alle Gadgets,(Fenster sind auch nur Gadgets) in Klassen.
Jede Klasse hat eine Funktion, die als EventHandler fungiert.
Mit Api-Functionen ist es möglich, die Adresse dieser Funktion auf eine eigene Funktion "umzubiegen",
es muss aber vor verlassen der eigenen Function der Zeiger wieder zurückgesetzt werden!!

BindEvent macht Eigentlich das Gleiche, nur dass du dich nicht um Adressen/Zeiger kümmern musst.
Du kannst sowohl Fenster, als auch Gadgets und sogar Menu's mit BindEvent verknüpfen.

Genaueres siehe die jeweilige Hilfs-Datei

Olaf
Unsinnige Anweisungen von Seiten des Chef's lösen grundsätzlich ein "Syntax Error" bei mir aus
OS=Windows 11
PB=5.31/5.73/6 <> BlitzPlus/Blitz3D <> FreeBasic
Antworten