LED-Lauflicht

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
irobot
Beiträge: 162
Registriert: 16.10.2005 09:22
Kontaktdaten:

LED-Lauflicht

Beitrag von irobot »

Guten Tag allerseits,

ich bin nun dabei die Version 6.0 von http://www.der-prozess.de zu schreiben. Eine Simulation der auf dem Bildschirm dargestellten Anlage. Mit Messgeräten die etwas anzeigen, Pumpen, die man schalten kann und Ventile, an denen man stellen kann.

Nun wollte ich, solange der Simulationsmodus läuft, rechts oben eine kleine Reihe gemalte LEDs wechselweise blinken lassen.

Ich krieg's nicht hin :^(

Um überhaupt mal zu sehen, wie das aussieht, habe ich versucht über

Code: Alles auswählen

ButtonImageGadget(100, x, y, breite, hoehe, ImageID(10)
Delay(100)
ButtonImageGadget(100, x, y, breite, hoehe, ImageID(11)
Delay(100)
ButtonImageGadget(100, x, y, breite, hoehe, ImageID(12)
...
mit den vorher eingelesenen ImageID(X) was darzustellen. Das einzige, was passierte, der Button war weg.

Es mag sein, dass sich der eine oder andere über meine Methoden lustig macht.
Tatsache, ich benötige eine EINFACHE und für mich VERSTEHBARE möglichkeit, sozusagen fünf kleine LEDs der Reihe nach blinken zu lassen.

Die Lösung muss nicht besonders smart und schick sein. Die muss für mich EINFACH sein.

Vielen Dank im voraus für eure Hilfe.

Grüsse
irobot
Benutzeravatar
Kiffi
Beiträge: 10725
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: LED-Lauflicht

Beitrag von Kiffi »

mit dem Delay wirst Du das nicht hinbekommen, weil dieses
die Eventschleife Deines Fensters unterbricht und aufgrund
dessen die Buttons nicht 'gemalt' werden.

Nimm anstelle dessen einen Timer (AddWindowTimer()) mit
dem Du beispielsweise folgende Prozedur aufrufen kannst:

Code: Alles auswählen

Procedure LaufLicht()
  Static ImageCounter
  Select ImageCounter
    Case 0
      ButtonImageGadget(100, x, y, breite, hoehe, ImageID(10)
    Case 1
      ButtonImageGadget(100, x, y, breite, hoehe, ImageID(11)
    Case 2
      ButtonImageGadget(100, x, y, breite, hoehe, ImageID(12)
  EndSelect
  ImageCounter + 1
  If ImageCounter > MaxAnzahlLichter ; <- musst Du selber angeben
    ImageCounter = 0 ; wieder von vorn
  EndIf
EndProcedure
(so in der Art)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
irobot
Beiträge: 162
Registriert: 16.10.2005 09:22
Kontaktdaten:

Re: LED-Lauflicht

Beitrag von irobot »

Hallo Kiffi,

danke erstmal für deine schnelle Antwort.

Sobald die Prozedur aufgerufen wird, ist der Button weg.

:^(

Bis jetzt ist das mit den ganzen GadgetButtonxyz nie ein Problem gewesen. DER_PROZESS hat ja haufenweise Gadgets und Buttons. Sobald sich etwas VERÄNDERN soll auf der Buttonoberfläche, ist der Button weg.
Benutzeravatar
Kiffi
Beiträge: 10725
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: LED-Lauflicht

Beitrag von Kiffi »

hast Du die 100 als Gadget-Nummer vielleicht mehrfach vergeben?

Grüße ... Kiffi
a²+b²=mc²
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: LED-Lauflicht

Beitrag von ts-soft »

1. Du solltest nur das Image ersetzen und nicht einen neuen Button erstellen:

Code: Alles auswählen

SetGadgetAttribute(100, #PB_Button_Image, ImageID(10))
2. Ein Delay verzögert das Dein Programm zurück ins EventLoop kommt,
aber erst dort wird die Veränderung sichtbar!

Also ersetze Delay durch einen Timer oder nutze Threads.

Gruß
Thomas

// edit:
hier ein kleines Beispiel, kein Lauflicht, sondern ein Ein und Ausschaltbares Blinklicht,
aber Dein Beispiel enthält ja auch kaum Hinweise:

Code: Alles auswählen

EnableExplicit

Enumeration ;Bilder
  #img_LED_Black
  #img_LED_Green
  #img_LED_Red
EndEnumeration

Enumeration ;Gadgets
  #gad_BTN_LED
  #gad_BTN_Start
EndEnumeration

Procedure CreateLEDColor(ID, Color)
  If CreateImage(ID, 32, 32)
    StartDrawing(ImageOutput(ID))
      Box(0, 0, 31, 31, RGB(255, 255, 255))
      Circle(15, 15, 7, Color)
    StopDrawing()
  EndIf
EndProcedure

CreateLEDColor(#img_LED_Black, RGB(0, 0, 0))
CreateLEDColor(#img_LED_Green, RGB(0, 255, 0))
CreateLEDColor(#img_LED_Red, RGB(255, 0, 0))

OpenWindow(0, #PB_Ignore, #PB_Ignore, 200, 200, "")
ButtonImageGadget(#gad_BTN_LED, 10, 10, 32, 32, ImageID(#img_LED_Black))
ButtonGadget(#gad_BTN_Start, 10, 50, 60, 25, "Start/Stop")

Define state_btn, state_led
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #gad_BTN_Start
          state_btn ! 1
          If state_btn
            AddWindowTimer(0, 1, 100)
            state_led = 0
            SetGadgetAttribute(#gad_BTN_LED, #PB_Button_Image, ImageID(#img_LED_Red))
          Else
            RemoveWindowTimer(0, 1)
            SetGadgetAttribute(#gad_BTN_LED, #PB_Button_Image, ImageID(#img_LED_Black))
          EndIf
      EndSelect
      Case #PB_Event_Timer
        state_led ! 1
        If state_led
          SetGadgetAttribute(#gad_BTN_LED, #PB_Button_Image, ImageID(#img_LED_Green))
        Else
          SetGadgetAttribute(#gad_BTN_LED, #PB_Button_Image, ImageID(#img_LED_Red))
        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
Benutzeravatar
irobot
Beiträge: 162
Registriert: 16.10.2005 09:22
Kontaktdaten:

Re: LED-Lauflicht

Beitrag von irobot »

So,

habe es mit

Code: Alles auswählen

SetGadgetAttribute(100, #PB_Button_Image, ImageID(10))
realisiert.

Sieht fantastisch aus... :^)

Danke ts-soft, danke auch an Kiffi ! Ihr habt mir sehr geholfen.

Grüsse
irobot
--------------------
www.der-prozess.de
Antworten