Ablaufprobleme

Für allgemeine Fragen zur Programmierung mit PureBasic.
Guido
Beiträge: 7
Registriert: 02.11.2004 17:36
Wohnort: Niedersachsen

Ablaufprobleme

Beitrag von Guido »

Hallo,

ich bin neu in PB und habe die ersten Probleme, ich habe ein Programm
geschrieben in der Zeitabläufe eine Rolle spielen. Bisher habe ich dieses über
delay (1000) oder so gelöst. Leider ist dies wohl nicht ganz glücklich denn
das Programm reagiert sehr stockend.
Das Ampelübeprog. PB 3.30

Code: Alles auswählen

; Purebasic Ver. 3.30
;
; Öffnet ein Wenster 
; WindowID = OpenWindow(#Window, x, y, InnereBreite, InnereHöhe, Flags, Titel$) 
; Mögliche Flags sind: 
; #PB_Window_SystemMenu     : Schaltet das System-Menü in der Fenster-Titelzeile ein. 
; #PB_Window_MinimizeGadget : Fügt das Minimieren-Gadget der Fenster-Titelzeile hinzu. #PB_Window_System wird automatisch hinzugefügt. 
; #PB_Window_MaximizeGadget : Fügt das Maximieren-Gadget der Fenster-Titelzeile hinzu. #PB_Window_System wird automatisch hinzugefügt. 
; #PB_Window_SizeGadget     : Fügt das Größenänderungs-Gadget zum Fenster hinzu. 
; #PB_Window_Invisible      : Erstellt ein Fenster, zeigt es aber nicht an. Wird nicht unter AmigaOS unterstützt. 
; #PB_Window_TitleBar       : Erstellt ein Fenster mit einer Titelzeile. 
; #PB_Window_BorderLess     : Erstellt ein Fenster ohne jegliche Ränder. 



If OpenWindow(0, 100, 300, 300, 360, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget, "Ampel")

  ; This is the 'event loop'. All the user actions are processed here.
  ; It's very easy to understand: when an action occurs, the EventID
  ; isn't 0 and we just have to see what have happened...
  ;
  Raus:
    If CreateGadgetList(WindowID())
      ButtonGadget(1,20,20,100,20,"Start");Knopf erstellen
      ButtonGadget(2,130,20,110,20,"Stoppen");Knopf erstellen
    EndIf
   

  
  
  Repeat ;wiederhole bis Until Quit=1
    EventID.l = WaitWindowEvent() ; Macht aus EventID.l long und übergibt den Wert aus WaitWindowEvent()
  ;Wartet bis ein Ereignis auftritt. Es ist die selbe Funktion wie WindowEvent(), 
  ;hält aber die Programmausführung an, was sehr wichtig in einer Multitasking 
  ;Umgebung ist. Eine Applikation sollte möglichst immer diesen Befehl anstelle von 
  ;WindowEvent()benutzen. Für weitere Informationen, sehen Sie die Dokumentation zu WindowEvent()
   
    If EventID = #PB_Event_CloseWindow  ; Die Windows schließen Variable wird abgefragt 
      Quit = 1                          ; wenn ja dann Quit=1 sonst nichts
    EndIf
     
     If EventID = #PB_Event_Gadget Or zahl=1 Or zahl=2
                  
                   If EventGadgetID()=1 ; wurde gadget 1 angeklickt ?
                      Zahl.l=1
                   EndIf    
                    
                   If EventGadgetID()=2 ; wurde gadget 1 angeklickt ?
                      Zahl=2
                   EndIf 
                   
                   If Zahl=1
                       Delay(2000)
                       Gosub gruen
                       Delay(2000)
                       Gosub rot
                   EndIf 
                   
                   If Zahl=2
                       Delay(2000)
                       Gosub gelb
                       Delay(2000)
                       Gosub grau
                   EndIf 
                   
             
           
         
      EndIf
       
       
     
  Until Quit = 1                       ; Schleife oben wird beendet wenn Quit=1
  
EndIf                                  ; endif des Fensterbefehles

End   ; All the opened windows are closed automatically by PureBasic
  
gruen:
  StartDrawing(WindowOutput())
  
  Box(50,63,50,142, RGB(0,2,0))  ; eine schwarze Box(x, y, Breite, Höhe [, Farbe])
  Circle(75,176,20,RGB(0,155,0))  ; Circle(x, y, Radius [, Farbe]) ein grüner Kreis
  Circle(75,132,20,RGB(155,155,155))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis 
  Circle(75,90,20,RGB(155,155,155))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis
  StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !

Return  
rot:
  StartDrawing(WindowOutput())
  
  Box(50,63,50,142, RGB(0,2,0))  ; eine schwarze Box(x, y, Breite, Höhe [, Farbe])
  Circle(75,176,20,RGB(155,155,155))  ; Circle(x, y, Radius [, Farbe]) ein grüner Kreis
  Circle(75,132,20,RGB(155,155,155))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis 
  Circle(75,90,20,RGB(255,0,0))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis
  StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !

Return  
rot_gelb:
  StartDrawing(WindowOutput())
  
  Box(50,63,50,142, RGB(0,2,0))  ; eine schwarze Box(x, y, Breite, Höhe [, Farbe])
  Circle(75,176,20,RGB(155,155,155))  ; Circle(x, y, Radius [, Farbe]) ein grüner Kreis
  Circle(75,132,20,RGB(255,255,0))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis 
  Circle(75,90,20,RGB(255,0,0))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis
  StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !

Return  
gelb:
  StartDrawing(WindowOutput())
  
  Box(50,63,50,142, RGB(0,2,0))  ; eine schwarze Box(x, y, Breite, Höhe [, Farbe])
  Circle(75,176,20,RGB(155,155,155))  ; Circle(x, y, Radius [, Farbe]) ein grüner Kreis
  Circle(75,132,20,RGB(255,255,0))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis 
  Circle(75,90,20,RGB(155,155,155))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis
  StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !

Return  
grau:
  StartDrawing(WindowOutput())
  
  Box(50,63,50,142, RGB(0,2,0))  ; eine schwarze Box(x, y, Breite, Höhe [, Farbe])
  Circle(75,176,20,RGB(155,155,155))  ; Circle(x, y, Radius [, Farbe]) ein grüner Kreis
  Circle(75,132,20,RGB(155,155,155))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis 
  Circle(75,90,20,RGB(155,155,155))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis
  StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !

Return  
Ich hoffe Ihr könntet mir mit einfachem code weiterhelfen gettikcount_()
habe ich nicht begriffen, oder wüßte nicht wie ich es einfügen sollte.

Gruß
Guido
glubschi90
Beiträge: 274
Registriert: 04.09.2004 01:43
Wohnort: Würzburg

Beitrag von glubschi90 »

Ich weiß ja nicht, ob dir das hilft, aber ich habe die Hauptschleife mal etwas übersichtlicher gemacht... :)

Code: Alles auswählen

Repeat

event=WaitWindowEvent()

Select event

 Case #PB_EventGadget

  Select EventGadgetID()

   Case 1
     Delay(2000) 
     Gosub gruen 
     Delay(2000) 
     Gosub rot 

    Case 2
      Delay(2000) 
      Gosub gelb 
      Delay(2000) 
      Gosub grau 

  EndSelect

 Case #PB_Event_CloseWindow
  quit=1
 EndSelect

Until quit=1

End
Hab' ichjetzt mal so aus dem Kopf heraus geschrieben... :roll: :D
Zuletzt geändert von glubschi90 am 02.11.2004 18:26, insgesamt 1-mal geändert.
PureBasic 4.30
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Die Hauptschleife etwa so (ganz schnell geproggt!):

Code: Alles auswählen

ZeitAbstand = 2000  ;in Millisekunden
  typ = 0
  status = 1
  Gosub grau
  Repeat 
    
    event=WaitWindowEvent() 
    
    Select event 
      Case #PB_EventGadget 
        Select EventGadgetID() 
          
          Case 1 
            typ = 1
            time = ElapsedMilliseconds() - ZeitAbstand
            
          Case 2 
            typ = 2
            time = ElapsedMilliseconds() - ZeitAbstand
            
        EndSelect 
      Case #PB_Event_CloseWindow 
        quit=1 
    EndSelect 
    
    If typ And ElapsedMilliseconds() - time > ZeitAbstand
      If typ = 1
        If status = 1
          Gosub gruen
          status = 2
        ElseIf status = 2
          Gosub rot
          status = 1
          typ = 0
        EndIf
      ElseIf typ = 2
        If status = 1
          Gosub gelb
          status = 2
        ElseIf status = 2
          Gosub grau
          status = 1
          typ = 0
        EndIf
      EndIf
      
      time = ElapsedMilliseconds()
    EndIf
    
  Until quit=1 
  
  End
Guido
Beiträge: 7
Registriert: 02.11.2004 17:36
Wohnort: Niedersachsen

hat nicht ganz geklappt

Beitrag von Guido »

Hallo, erst einmal danke das Ihr euch des Problems angenommen habt.

Bei "glubschi90" s code ist das Problem das die Ampel den jeweiligen
code nur 1x durchlläuft, wenn ich nichts falsch gemacht habe.
Ich kenne mich da nicht so aus, aber ich habe die Vermutung das meine
komische Ifkonstruktion mit dem

Code: Alles auswählen

If EventID = #PB_Event_Gadget Or zahl=1 Or zahl=2 ; hier !!!!
                 
                   If EventGadgetID()=1 ; wurde gadget 1 angeklickt ?
                      Zahl.l=1
                   EndIf   
                   
                   If EventGadgetID()=2 ; wurde gadget 2 angeklickt ?
                      Zahl=2
                   EndIf 
an dieser Stelle nötig ist um nicht erneut auf den Startknopf zu drücken,
vielleicht habe ich das auch nicht richtig vorher gesagt.

Das Problem bei "Remis" code ist wohl das PB Version 3.30 die
Funktion

Code: Alles auswählen

ElapsedMilliseconds() 
wohl nicht, oder noch nicht kennt.
Gruß
Guido
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
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

Beitrag von NicTheQuick »

[c]GetTickCount_() = ElapsedMilliseconds()[/c]
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Dann ersetz ElapsedMilliseconds() mit timeGetTime_() oder GetTickCount_() :wink:
Ich hab übrigens die Schleife von glubschi genommen, ohne zu überprüfen, ob sie richtig funktioniert.

greetz
remi
Edit: Mist!
Guido
Beiträge: 7
Registriert: 02.11.2004 17:36
Wohnort: Niedersachsen

teilweise i.o.

Beitrag von Guido »

Hallo, danke noch einmal für die Tips. Ich habe nun die
ElapsedMilliseconds() durch gettickcount_() ersetzt u. auch versucht
eine eigene Primitivschleife ( goto ) aufzubauen die, die Ampelsteuerung zum
Dauerläufer machen soll.
Leider habe ich die gettickcount_() Prozedur mit Ihren Variablen wohl nicht
ganz verstanden . So scheint die Goto-Schleife zwar durchlaufen zu werden
nur stehen vermutlich die Variablen für die Zeit falsch.

Es wäre nett wenn Ihr mir die Zeitprozedur genauer erklären könntet.
Oder vielleicht ist es möglich die so umzufunktionieren das sich alle 2000
Millisekunden eine Variable von 0 auf 1 u. umgekehrt setzt diese ließe
sich dann vielleicht einfacher abfragen.

also noch einmal meine jetzige Hauptschleife:

Code: Alles auswählen

  
  ZeitAbstand = 100  ;in Millisekunden 
  typ = 0 
  status = 1 
  Gosub grau 
  Repeat 
    rein:
    event=WaitWindowEvent() 
    
    Select event 
      Case #PB_EventGadget 
        Select EventGadgetID() 
          
          Case 1 
            typ = 1 
            time = gettickcount_( ) - ZeitAbstand  ; wieso braucht man hier 2 Fälle ?
                                                                   
          Case 2 
            typ = 2 
            time = gettickcount_( ) - ZeitAbstand 
            
        EndSelect 
      Case #PB_Event_CloseWindow 
        quit=1 
    EndSelect 
    
    If typ And gettickcount_( ) - time > ZeitAbstand 
      If typ = 1 
        If status = 1 
          Gosub gruen 
          status = 2 
        ElseIf status = 2 
          Gosub rot 
          status = 1 
          typ = 0 
        EndIf 
      ElseIf typ = 2 
        If status = 1 
          Gosub gelb 
          status = 2 
        ElseIf status = 2 
          Gosub grau 
          status = 1 
          typ = 0 
        EndIf 
      EndIf 
      
      time = gettickcount_( ) 
    EndIf 
    If quit<>1                   ; eignene Primitivschleife
        Goto rein                ; wo ist mein Denkfehler 
    EndIf 
  Until quit=1 
Ihr müßt meine dumme Fragerei entschuldigen aber meine ersten
Basicschritte liefen unter 10 /20 u.s.w. auf GW-Basic von Eventgesteuerten
Programmen war man dort weit entfernt geschweige denn von Windows.
Ich hoffe also auf Euer Mitgefühl :oops:

Gruß
Guido
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Also GetTickCount_() gibt die Anzahl Millisekunden seit dem Start des PC's zurück. Man rechnet also mit Differenzen:

Code: Alles auswählen

a = GetTickCount_()
; Tuetwas
diff = GetTickCount_() - a  ;Nun ist in diff die Anzahl Millisekunden die das Tuetwas beansprucht
Wenn man nun alle 2 Sekunden etwas machen will:

Code: Alles auswählen

sTime = GetTickCount_()
Repeat
  if GetTickCount_() - stime > 2000  ;wenn die Differenz zw. jetzt und vorher > 2 Sek
    ; Tuetwas
    sTime = GetTickCount_()
  endif
until irgendwas
Guido
Beiträge: 7
Registriert: 02.11.2004 17:36
Wohnort: Niedersachsen

Ich glaub ich hab es.

Beitrag von Guido »

Hallo,

soweit läuft das Prog. jetzt, leider reagiert es auf Knopfdrücke nicht sehr gut.
die Delays(15) sind nötig um ein wenig das flimmern aus den Ampeln zu
bekommen.
Gibt es auch eine Möglichkeit das Prog. leichter auf Knopfdrücke reagieren
zu lassen ( bitte gut kommentieren ). Ich kann mir nur vorstellen das es klappt,
wenn man in den Schleifen noch einmal windowsevent abfragt, oder ?

Hier noch einmal der komische Code.

Code: Alles auswählen

; Purebasic Ver. 3.30
;
; Öffnet ein Windowsfenster 
; WindowID = OpenWindow(#Window, x, y, InnereBreite, InnereHöhe, Flags, Titel$) 
; Mögliche Flags sind: 
; #PB_Window_SystemMenu     : Schaltet das System-Menü in der Fenster-Titelzeile ein. 
; #PB_Window_MinimizeGadget : Fügt das Minimieren-Gadget der Fenster-Titelzeile hinzu. #PB_Window_System wird automatisch hinzugefügt. 
; #PB_Window_MaximizeGadget : Fügt das Maximieren-Gadget der Fenster-Titelzeile hinzu. #PB_Window_System wird automatisch hinzugefügt. 
; #PB_Window_SizeGadget     : Fügt das Größenänderungs-Gadget zum Fenster hinzu. 
; #PB_Window_Invisible      : Erstellt ein Fenster, zeigt es aber nicht an. Wird nicht unter AmigaOS unterstützt. 
; #PB_Window_TitleBar       : Erstellt ein Fenster mit einer Titelzeile. 
; #PB_Window_BorderLess     : Erstellt ein Fenster ohne jegliche Ränder. 



If OpenWindow(0, 100, 300, 300, 360, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget, "Ampel")
 
    If CreateGadgetList(WindowID())
      ButtonGadget(1,20,20,100,20,"Start");Knopf erstellen
      ButtonGadget(2,130,20,110,20,"Stoppen");Knopf erstellen
    EndIf
  
  typ = 0     ; Entscheidungsschalter leeren
  Gosub grau ; leere Ampel
  Repeat 
      event=WaitWindowEvent() 
    
        Select event 
           Case #PB_EventGadget 
             Select EventGadgetID() 
          
               Case 1 
                 typ = 1 
            
               Case 2 
                 typ = 2 
            
             EndSelect 
               Case #PB_Event_CloseWindow 
                 quit=1
        EndSelect 
    
        If typ=1                      ;Schalter 1
            sTime = GetTickCount_()               ;Zeit erfassen
            Repeat                               ;Schleife anfangen
               Gosub gruen                       ;Sprung abarbeiten,  HIER in den 
                                                        ;Schleifen vielleicht noch einmal 
                                                        ;abfragen ??? Wenn ja wie am besten ?
               Delay(15)                          ;Rechner beruhigen 
            Until GetTickCount_() - stime > 2000 ;wenn die Differenz zw. Zeit erfassen u.jetzt > 2 Sek dann raus
            sTime = GetTickCount_()               ;und siehe oben.
            Repeat 
               Gosub rot
               Delay(15)
            Until GetTickCount_() - stime > 2000
        EndIf
    
        If typ=2                      ;Schalter 2
            sTime = GetTickCount_() 
            Repeat 
               Gosub gelb
               Delay(15)
            Until GetTickCount_() - stime > 2000  ;wenn die Differenz zw. jetzt und vorher > 2 Sek
            sTime = GetTickCount_() 
            Repeat 
              Gosub grau
              Delay(15)
            Until GetTickCount_() - stime > 2000
         EndIf
     
  Until quit=1 
  
EndIf                       ; endif des Fensterbefehles

End   ; All the opened windows are closed automatically by PureBasic
  
gruen:
  StartDrawing(WindowOutput())
  
  Box(50,63,50,142, RGB(0,2,0))  ; eine schwarze Box(x, y, Breite, Höhe [, Farbe])
  Circle(75,176,20,RGB(0,155,0))  ; Circle(x, y, Radius [, Farbe]) ein grüner Kreis
  Circle(75,132,20,RGB(155,155,155))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis 
  Circle(75,90,20,RGB(155,155,155))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis
  StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !

Return  
rot:
  StartDrawing(WindowOutput())
  
  Box(50,63,50,142, RGB(0,2,0))  ; eine schwarze Box(x, y, Breite, Höhe [, Farbe])
  Circle(75,176,20,RGB(155,155,155))  ; Circle(x, y, Radius [, Farbe]) ein grüner Kreis
  Circle(75,132,20,RGB(155,155,155))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis 
  Circle(75,90,20,RGB(255,0,0))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis
  StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !

Return  
rot_gelb:
  StartDrawing(WindowOutput())
  
  Box(50,63,50,142, RGB(0,2,0))  ; eine schwarze Box(x, y, Breite, Höhe [, Farbe])
  Circle(75,176,20,RGB(155,155,155))  ; Circle(x, y, Radius [, Farbe]) ein grüner Kreis
  Circle(75,132,20,RGB(255,255,0))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis 
  Circle(75,90,20,RGB(255,0,0))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis
  StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !

Return  
gelb:
  StartDrawing(WindowOutput())
  
  Box(50,63,50,142, RGB(0,2,0))  ; eine schwarze Box(x, y, Breite, Höhe [, Farbe])
  Circle(75,176,20,RGB(155,155,155))  ; Circle(x, y, Radius [, Farbe]) ein grüner Kreis
  Circle(75,132,20,RGB(255,255,0))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis 
  Circle(75,90,20,RGB(155,155,155))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis
  StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !

Return  
grau:
  StartDrawing(WindowOutput())
  
  Box(50,63,50,142, RGB(0,2,0))  ; eine schwarze Box(x, y, Breite, Höhe [, Farbe])
  Circle(75,176,20,RGB(155,155,155))  ; Circle(x, y, Radius [, Farbe]) ein grüner Kreis
  Circle(75,132,20,RGB(155,155,155))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis 
  Circle(75,90,20,RGB(155,155,155))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis
  StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !

Return  
Also nicht nöselig werden, ich versuch ja nur daraus zu lernen das, das
Prog. keinen größeren geistigen Nährwert hat, sehe ich auch :wink:
Und wenn ich nerve, früh genug Bescheid sagen

Gruß
Guido
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Ich glaub ich hab es.

Beitrag von Danilo »

Guido hat geschrieben:soweit läuft das Prog. jetzt, leider reagiert es auf Knopfdrücke nicht sehr gut.
Du hattest eine Verzögerung von 2 x 2 Sekunden drin, d.h.
zwischen jedem einzelnen Event gab es eine Verzögerung
von 4 Sekunden.
Guido hat geschrieben:die Delays(15) sind nötig um ein wenig das flimmern aus
den Ampeln zu bekommen.
Man sollte mit PB's WindowOutput() so gut wie nie auf ein
Fenster zeichnen (Ausnahmen gibt's immer).
Du kannst hier ganz leicht ein ImageGadget nehmen.
Guido hat geschrieben:Also nicht nöselig werden, ich versuch ja nur daraus zu
lernen das, das Prog. keinen größeren geistigen Nährwert
hat, sehe ich auch :wink:
OK. Ich habe es Dir jetzt mal ein bissl umgestellt, so daß es
mit ImageGadget läuft und wirklich nur alle 2 Sekunden neu
gezeichnet wird (und gleich nachdem ein Button gedrückt wurde).

Es funktioniert noch genauso wie Dein letzter Code. Wenn
die Ampel einen Sinn ergeben soll, müßte ich erst wissen
wie Du es genau haben willst, und was die 2 Buttons dabei
machen sollen.
Aber ich denke mal das bekommst Du jetzt auch selbst hin:

Code: Alles auswählen

Procedure Ampelgrundgeruest()
  ; zeichnet eine Ampel mit 3 grauen Kreisen
  Box(0,63,50,142, RGB(0,2,0))        ; eine schwarze Box(x, y, Breite, Höhe [, Farbe])
  Circle(25, 27,20,RGB(155,155,155))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis
  Circle(25, 69,20,RGB(155,155,155))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis
  Circle(25,113,20,RGB(155,155,155))  ; Circle(x, y, Radius [, Farbe]) ein grner Kreis
EndProcedure

Procedure Gruen()
  StartDrawing(ImageOutput())
    Ampelgrundgeruest()
    Circle(25,113,20,RGB(0,155,0))  ; Circle(x, y, Radius [, Farbe]) ein grner Kreis
  StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !
  SetGadgetState(0,UseImage(0))
EndProcedure

Procedure Rot()
  StartDrawing(ImageOutput())
    Ampelgrundgeruest()
    Circle(25,27,20,RGB(255,0,0))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis
  StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !
  SetGadgetState(0,UseImage(0))
EndProcedure

Procedure Rot_Gelb()
  StartDrawing(ImageOutput())
    Ampelgrundgeruest()
    Circle(25,27,20,RGB(255,0,0))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis
    Circle(25,69,20,RGB(255,255,0))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis
  StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !
  SetGadgetState(0,UseImage(0))
EndProcedure

Procedure Gelb()
  StartDrawing(ImageOutput())
    Ampelgrundgeruest()
    Circle(25,69,20,RGB(255,255,0))  ; Circle(x, y, Radius [, Farbe]) ein grauer Kreis
  StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !
  SetGadgetState(0,UseImage(0))
EndProcedure

Procedure Grau()
  StartDrawing(ImageOutput())
    Ampelgrundgeruest()
  StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !
  SetGadgetState(0,UseImage(0))
EndProcedure




; Purebasic Ver. 3.30
; öffnet ein Windowsfenster
; WindowID = OpenWindow(#Window, x, y, InnereBreite, InnereHöhe, Flags, Titel$)
; Mögliche Flags sind:
; #PB_Window_SystemMenu     : Schaltet das System-Men in der Fenster-Titelzeile ein.
; #PB_Window_MinimizeGadget : Fügt das Minimieren-Gadget der Fenster-Titelzeile hinzu. #PB_Window_System wird automatisch hinzugefügt.
; #PB_Window_MaximizeGadget : Fügt das Maximieren-Gadget der Fenster-Titelzeile hinzu. #PB_Window_System wird automatisch hinzugefügt.
; #PB_Window_SizeGadget     : Fügt das Größenänderungs-Gadget zum Fenster hinzu.
; #PB_Window_Invisible      : Erstellt ein Fenster, zeigt es aber nicht an. Wird nicht unter AmigaOS unterstützt.
; #PB_Window_TitleBar       : Erstellt ein Fenster mit einer Titelzeile.
; #PB_Window_BorderLess     : Erstellt ein Fenster ohne jegliche Ränder.


#ROT   = 1
#GELB  = 2
#GRUEN = 4
#GRAU  = 8

If CreateImage(0,50,142)

  If OpenWindow(0, 100, 300, 300, 360, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget, "Ampel")
 
    If CreateGadgetList(WindowID())
      ImageGadget(0,50,63,50,142,UseImage(0))
      ButtonGadget(1,20,20,100,20,"Start");Knopf erstellen
      ButtonGadget(2,130,20,110,20,"Stoppen");Knopf erstellen
    EndIf
 
    typ = 0     ; Entscheidungsschalter leeren
    Grau()      ; leere Ampel

    Repeat
      Select WindowEvent()
        Case #PB_Event_CloseWindow
          quit = 1
        Case #PB_EventGadget
          Select EventGadgetID()
         
            Case 1
              typ = 1 : updaten = #TRUE
        
            Case 2
              typ = 2 : updaten = #TRUE
           
          EndSelect
        Case 0 ; kein Event
          Delay(20)
      EndSelect

      sTime = GetTickCount_()

      If (sTime >= oldTime + 2000) Or updaten ; wenn 2 sekunden verstrichen
                                              ; oder button gedrückt wurde
        oldTime = sTime
        
        Beep_(800,50) ; nur zur überprüfung

        If typ=1                    ;Schalter 1
          If alteAnzeige = #ROT
            Gruen()                   ; Ampel auf grün stellen
            alteAnzeige  = #GRUEN
          Else
            Rot()
            alteAnzeige  = #ROT
          EndIf
        ElseIf typ=2                ;Schalter 2
          If alteAnzeige = #GRAU
            Gelb()                   ; Ampel auf gelb stellen
            alteAnzeige  = #GELB
          Else
            Grau()
            alteAnzeige  = #GRAU
          EndIf
        EndIf
        updaten = #FALSE
      EndIf
     
    Until quit=1
    
  EndIf
 
EndIf                       ; endif des Fensterbefehles

End   ; All the opened windows are closed automatically by PureBasic
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten