Ampel - Logikproblem VB 

Status
Für weitere Antworten geschlossen.

preview

Registered +
Registriert
Feb. 2008
Beiträge
64
Hallo zusammen,

ich bin gerade dabei, die einfache Ampel in Visual Basic zu programmieren, also 3 Labels für die Ampel und einen Button, der den gesamten Ampelvorgang (Rot -> Rot/Gelb -> Grün -> Gelb -> Rot) "abspielt".
Dabei soll auf jegliche Timer verzichtet werden.
Rot zu Rot/Gelb stellt kein Problem dar, wenn ich allerdings grün dazu"programmiere", überspringt er die Rot/Gelb-Phase und springt von Rot direkt auf grün.
Wie kann die Abfrage so gestalten, dass diese Phase nicht übersprungen (vllt getrennt abfragen?) wird?

Danke

preview
 
Du könntest dass ganze doch mit einer einfachen Wenn-Dann Abfrage lösen:

Wenn Ampel=rot Dann schalt gelb ein
Wenn Ampel =rot and Ampel=gelb Dann schalt rot und gelb aus und grün ein
Wenn Ampel=grün ...
 
Du könntest dass ganze doch mit einer einfachen Wenn-Dann Abfrage lösen:

Wenn Ampel=rot Dann schalt gelb ein
Wenn Ampel =rot and Ampel=gelb Dann schalt rot und gelb aus und grün ein
Wenn Ampel=grün ...


Ist so geschehen, bloß verarbeitet der beide Anfragen auf einmal und den Sprung auf Rot/Gelb nimmt man gar nicht wahr, weil er direkt weiter geht zu nur grün.. -.-
 
Wenn du auf timer verzichten willst dann mach doch ne schleife die rechenzeit verschwendet is halt recht rechenintensiv aber dafür brauchste keinen timer
 
Orcshadow schrieb:
Wenn Ampel=rot Dann schalt gelb ein
Wenn Ampel =rot and Ampel=gelb Dann schalt rot und gelb aus und grün ein
Wenn Ampel=grün ...

Ist hier nicht das Problem, dass er nach dem ersten Wenn in das zweite Wenn springt, weil das nun auch wahr ist? Also bräuchte man nicht irgendwie ein break, oder return?
Zumindest ist so klar, warum der Interpreter den Block komplett durchläuft...
 
If l1.BackColor = &HFF& (=rot) Then
l2.BackColor = &HFFFF& (=gelb)

Else

If l2.BackColor = &HFFFF& (=gelb) Then

If l1.BackColor = &HFF& (=rot) Then l3.BackColor = &HFF00& (=grün): l2.BackColor
= &HFFFFFF(=weiss): l1.BackColor = &HFFFFFF(=weiss)



End If

End If

Das ist der Quelltext des Buttons.
Wenn ich das grüne weglasse, springt die Ampel wie gewünscht von rot auf rot/gelb, füge ich ihn ein springt sie von rot direkt auf grün -.- HILFE
 
Sie springt auch mit dem code auch von rot nach rot/gelb nach grün aber eben viel zu schnell zum sehen du musst zwischen die einzelnen zustandsänderungen irgendeine pause reinbringen seis durch ne große schleife oder eben nen timer aber gegen den hast du ja was
 
Für sowas baust du dir am besten eine ZustandsMaschine..

hier mal in C
Code:
void ampel (void)
{
static int i=0;

if(i==0)
{
//rot an
i++;
}

if(i==1)
{
//gelb an
i++;
}

if(i==2)
{
//grün an, gelb und rot aus
i++;
}

if(i==3)
{
//grün aus, gelb an
i=0;
}
}

static int i -> die Variable behält ihren Wert bei den Durchläufen...
 
Sie springt auch mit dem code auch von rot nach rot/gelb nach grün aber eben viel zu schnell zum sehen du musst zwischen die einzelnen zustandsänderungen irgendeine pause reinbringen seis durch ne große schleife oder eben nen timer aber gegen den hast du ja was

Die Frage ist ja, ob es ohne Timer und mit meinem Model überhaupt geht.
Denn sonst ist es Zeitverschwendung für euch und für mich :)

Danke aber an alle, die sich bis jetzt mit dem Problem befasst haben! (und sich hoffentlich auch weiterhin damit befassen)
 
also ich denk dass geht ohne timer bzw break befehl nicht meine kenntnsse sind jedoch nicht allzu groß auf diesem gebiet
 
´hab ich auch in meinen leten 2 posts versucht zu erklären. Du musst irgendwie dafür sorgen das der Pc beim ausführen zwischen den einzelnen stufen ne pause macht ohne timer oder schleife um prozessor beschäftigt zu halten geht das net
 
Hi!

Ja, es geht ohne Timer und ohne break-Befehl!

Ich kenne den ganzen Quelltext nicht daher kann ich dir den Fehler nicht sagen.
Aber ich schreib dir mal zwei Möglichkeiten auf wie du es machen könntest.
Du musst dabei aber immer ElseIf schleifen verwenden.
Sonst könnte es sein, dass der Hintergrund von z.B. l3 gerade grün war, aber danach kam noch die Umschaltung auf rot im Sub.
Dann würde die Ampel innerhalb eines Klickes zwei mal schalten.
Hoffe das ist verständlich.

Also, eine hat DOcean schon beschrieben.

Das würde in VB6 so aussehen:
Code:
Option Explicit

Dim i as Integer #i als globale Variable festlegen

# l1 = rot
# l2 = gelb
# l3 = grün

Private Sub cmd1_click() # cmd1 heißt der Button
# Bei jedem Klick auf den Button wird abgefragt wie groß i ist.
# Dann wird mit If und ElseIf der Wert von i abgefragt und
#dementsprechend wird die Ampel geschalten.
# Wenn i den Wert 3 erreicht, wird die Variable wieder auf 0
# gesetzt und alles beginnt von Vorne!

If i = 0 then
i = i + 1 #i wird um 1 erhöht
l1.BackColor = vbred
l2.BackColor = vbwhite
l3.BackColor = vbwhite
ElseIf i = 1 then
i = i + 1
l1.Backcolor = vbred
l2.Backcolor = vbyellow
l3.BackColor = vbwhite
ElseIf i = 2 then
i = i + 1
l1.BackColor = vbwhite
l2.BackColor = vbwhite
l3.BackColor = vbgreen
ElseIf i = 3 then
i = 0
l1.BackColor = vbwhite
l2.BackColor = vbyellow
l3.BackColor = vbwhite
End If
End Sub

Private Sub Form_load()
# hier werden die Hintergrundfarben der Labels alle auf weiß gesetzt
l1.vbwhite
l2.vbwhite
l3.vbwhite
End Sub

Die Andere Methode wäre die Zustände der Labelhintergründe abzufragen.
Das sähe dann so aus:

Code:
Option Explicit

Private Sub cmd1_Click() # cmd1 = Name des Button
If l1.BackColor = vbred And l2.BackColor = vbwhite And l3.BackColor = vbwhite then
# wird ausgeführt wenn l1 = rot, l2 = weiß, l3 = weiß ist
l2.BackColor = vbyellow
ElseIf l1.BackColor = vbred And l2.BackColor = vbyellow And l3.BackColor = vbwhite then
# wird ausgeführt wenn l1 = rot, l2 = gelb, l3 = weiß ist
l1.BackColor = vbwhite
l2.BackColor = vbwhite
l3.BackColor = vbgreen
ElseIf l1.Backcolor = vbwhite And l2.BackColor = vbwhite and l3.BackColor = vbgreen then
# wird ausgeführt wenn l1 = weiß, l2 = weiß, l3 = grün ist
l2.BackColor = vbyellow
l3.BackColor = vbwhite
Elseif l1.BackColor = vbwhite And l2.BackColor = vbyellow And l3.BackColor = vbwhite then
# wird ausgeführt wenn l1 = weiß, l2 = gelb, l3 = weiß ist
l1.BackColor = vbred
l2.BackColor = vbwhite
End If
End Sub

Private Sub Form_load()
# das sind die Anfangsbedingungen
l1.BackColor = vbred
l2.BackColro = vbwhite
l3.BackColor = vbwhite
End Sub

Ich hoffe das konnte dir helfen.
Wenn du noch Fragen hast meld dich per PN.

/edit: Noch ein guter Tipp! vb@rchiv Visual Basic Tipps, Sourcecode, Free-ActiveX, WinAPI (hoffe der link ist genehmigt)


Mfg Tigga!
 
@Tigga
is dann nich wieder das selbe problem das es einfach so schnell geht das man die einzelnen phassen nicht sieht?
 
Dann müste man aber in einem Affen Tempo auf den Button "hauen"...

Der Code sorge nur dafür das bei jedem Klick EXAKT ein Phase weitergeschaltet wird....
 
@peter9876
Nein. Es wird immer nur eine Phase weitergeschalten.

@DOcean
Das wollte er ja oder?
Und warum Affentempo?
Schalten bei dir Ampeln im sekundentakt um? :weg:

Mal im ernst.
Im ganzen Thread hat er nichts von automatischem Umschalten geschrieben.

Wenns automatisch funktionieren soll, muss er eben einen Timer verwenden.


Mfg Tigga!
 
Vielen Dank für den Quelltext und die Anregungen.

Wollte in der Tat keine Auto-Ampel sondern eine Manuelle, d.h. 1 ButtonKlick = eine Phase weiter.

Werde mich mal erfolgreich ? melden, wenn ich es eingegeben hab!
 
also preview, dein quelltext ist schon richtig aber der einfache Trick ist, einfach alles rückwärts zu programmmieren! das bisher 1. if an den schluss setzen
 
Status
Für weitere Antworten geschlossen.

Ähnliche Themen

R
Antworten
18
Aufrufe
4K
Rommel007
R
Z
Antworten
11
Aufrufe
2K
G
Zurück
Oben Unten