# Boolesche variable setzen bzw. rücksetzen über einen Button



## borsti87 (31 Oktober 2007)

Hallo
	

	
	
		
		

		
			





Kann mir jemand sagen wie ich eine boolsche Variable über einen Button erst auf TRUE setzen kann und bei erneutem betätigen wieder auf FALSE setzen kann?

Ich habe bis jetzt folgendes

```
[LEFT][LIST=1]
[*]If JoystickButton = True And bPressed = False Then
[*]    bPressed = True
[*]    If Variable = False Then
[*]        Variable = True
[*]        Sleep (200)
[*]    Else
[*]        Variable = False
[*]        Sleep (200)
[*]    End If
[*]ElseIf JoystickButton = False Then
[*]    bPressed = False
[*]End If[/LIST][/LEFT]
```
Danke bosti87


----------



## vierlagig (31 Oktober 2007)

ein Binäruntersetzer also? nun, in step7 würde er so funktionieren (z.b.)


```
U  E0.7       //Eingang E0.7 
FP #FO        //Abfrage positive Flanke über Flankenoperanden FO 
=  #IO        //zuweisen des Flankenoperanden FO an den Impulsoperanden IO 
  
U  #IO        //Abfrage des Impulsoperanden IO 
UN A2.0       //Abfrage und Negation des Signalzustandes des Ausgangs A2.0 
S  A2.0       //Ausgang A2.0 setzen 
R  #IO        //rücksetzen des Impulsoperanden 
  
U  #IO        //Abfrage des Impulsoperanden 
U  A2.0       //Abfrage des Ausgangs A2.0 
R  A2.0       //rücksetzen des Ausgangs A2.0
```

in einer hochsprache so


```
If (E0.7 == true AND #IO == false)
Then #IO = true
Else #IO = false
EndIf

If (#IO == true AND A2.0 == false)
Then A2.0 = true
#IO = false
EndIf

If (#IO == true AND A2.0 == true)
Then A2.0 = false
EndIf
```
oder?


----------



## borsti87 (31 Oktober 2007)

Das sollte in Visual Basic 6 laufen

In PLC als FUP seähees so aus:


----------



## Markus (31 Oktober 2007)

für die sps ist das alles viel zu kompliziert...
hier die einfache lösng:

U E1.0 
FP M100.0 
X A1.0 
= A1.0


gibts es in deiner hochsprache auch sowas wie x-oder?


----------



## borsti87 (31 Oktober 2007)

Keine Ahnung würde ich sonst fragen?


----------



## vierlagig (31 Oktober 2007)

Markus schrieb:


> für die sps ist das alles viel zu kompliziert...
> 
> gibts es in deiner hochsprache auch sowas wie x-oder?



gott, deswegen sagte ich z.b. 

exklusiv-oder sollte mit IF und ELSEIF realisierbar sein... über die flanke mach ich mir mehr gedanken ...


----------



## zotos (31 Oktober 2007)

Ja das mit dem Minimalisten "ELTAKO" ist schön ich habe es als FUP (für CoDeSys/Beckhoff) auch mal hier angehängt.

Aber zu dem Eigentlichen Topic: Wo drin läuft den der Code bei VB ist ja fast alles ereignisgesteuert. Lässt Du das mit einem Timer laufen oder wo?


----------



## borsti87 (31 Oktober 2007)

in einem Label_change


----------



## zotos (31 Oktober 2007)

borsti87 schrieb:


> in einem Label_change


Wie soll das gehen?

Das raff ich jetzt nicht. Der Code läuft dann ja nur einmal beim jedem Wechsel des Label ab. Wer ändert das Label?


----------



## borsti87 (31 Oktober 2007)

das label ändert sich duch das klicken einer joysticktaste, gleichzeitig ändert sich mein boolescher wert


```
(...)

Select Case MyJoy.dwButtons
        Case 1 ' Button1
            bButton(1) = True
            lblButton1.Caption = 1
        Case 2 ' Button2
            bButton(2) = True
            lblButton2.Caption = 1
        Case 4 ' Button3
            bButton(3) = True
            lblButton3.Caption = 1
        Case 8 ' Button4
            bButton(4) = True
            lblButton4.Caption = 1
        Case Else ' Kein Button gedrückt (0)
        Dim i As Long
                           
            lblButton1.Caption = 0
            lblButton2.Caption = 0
            lblButton3.Caption = 0
            lblButton4.Caption = 0
            
            For i = 1 To 4
               bButton(i) = False
            Next
    End Select

(...)
```

was besseres is mir bis jetzt nicht eingefallen

bin für ideen aller art offen bin halt absoluter vb anfänger


----------



## borsti87 (31 Oktober 2007)

ich wollte das dan so auwerten


```
(...)

Private Sub lblButton1_change()
   If bButton(1) =  True Then
(...)
End If

(...)

End Sub 

(...)
```


----------



## Oberchefe (31 Oktober 2007)

warum nicht so

```
MeinBool = Not MeinBool
```
 
Oder habe ich was falsch verstanden?


----------



## borsti87 (31 Oktober 2007)

dann würde meine "Ausgabe" ja flackern
es soll ja so sein:

Joystickbutton erses mal gedrückt
Variable "True"
Joystickbutton zweites mal gedrückt
Variable wieder "False"


----------



## Larry Laffer (31 Oktober 2007)

Hallo,
meiner Meinung nach hat vierlagig die richttige Antwort schon gegeben :


```
if not Aktion then
   Aktion = true
else
   Aktion = false
end if
```
 
So habe ich vergleichbare Toggle-Funktionen in VB schon gelösst ...


----------



## Ralle (31 Oktober 2007)

So ein "Button betätigt" - Ereignis wird doch nur einmalig ausgelöst, das ist doch praktischerweise schon eine Flanke (wenn man das richtige Ereignis nutze, bei Delphi z.Bsp. OnClick), also ist der Code von Oberschefe bzw. Larry doch ok.


----------



## borsti87 (31 Oktober 2007)

Es handel sich hier aber nicht um einen Visuelen Button sondern Joystickbutton ist eine Variable die duch einen Taster an einem Joystick gesetzt wird


----------



## vierlagig (31 Oktober 2007)

http://support.microsoft.com/kb/113476


----------



## Ralle (31 Oktober 2007)

borsti87 schrieb:


> Es handel sich hier aber nicht um einen Visuelen Button sondern Joystickbutton ist eine Variable die duch einen Taster an einem Joystick gesetzt wird



Dann ist deine Code mit der Case-Anweisung doch ganz gut dafür geeignet, oder?


----------



## borsti87 (31 Oktober 2007)

Das hilft mir ja nun nicht weiter.
Ich will ja jetzt das wenn ich das erste mal auf meinen Button a Joystick dücke die Variable True wird und wenn ich dann los lasse True bleibt bis ich das zweite mal drücke dann soll die Variable wieder False werden.

Des weiteren sollte die Variable auch nicht "flakern" wenn ich mal länger auf den Taster drücke.


----------



## Larry Laffer (31 Oktober 2007)

... dann würde ich es so machen (vorausgesetzt dein Eingang flackert nicht - was nämlich sein kann ...)


```
if not Aktion and not Flanke_Aktion then
   Aktion = true
else
   Aktion = false
end if
Flanke_Aktion = Aktion
```
 
Aktion wäre in dem Fall dein Joystick-Button.


----------



## borsti87 (31 Oktober 2007)

das erscheint mir unlogisch warum soll sich Aktion als mein Joystick-Button auf true Setzen wenn er zuvor false war ich will doch eine variable setzen und nicht den Button


----------



## borsti87 (31 Oktober 2007)

Das Funktioniert leider noch nicht wie von mir gewünscht


```
Private Sub lblButton2_Change()
If Not bButton(2) And Not bPressed1(2) Then
   shpHoM(0).Visible = True
Else
   shpHoM(0).Visible = False
End If
bPressed1(2) = bButton(2)

End Sub
```
Sofort nach dem das Fom gelden ist ist shpHoM(0).visibil = True
wenn ich dann die Taste am Joystick drücke wird shpHoM(0).visibil = False
und bei weiterem drücken der Taste pasiert nichts mehr?


----------



## Ralle (31 Oktober 2007)

Irgenwie ist dein code komisch.

bhmButton (statische Variable, die sich den Buttonwert merkt)



```
Private Sub lblButton2_Change()
If Not bPressed1(2)AND bButton(2) Then
  If Not bhmButton then 
     shpHoM(0).Visible = True
     bhmButton = True
  Else
     shpHoM(0).Visible = False
     bhmButton = False
  End If 
End If
bPressed1(2) = bButton(2)

End Sub
```
Bin zwar kein vb-Könner, aber hilft das?
Man müßte statt der neuen statischen Variablen auch direkt shpHoM(0).Visible abfragen können.


----------



## borsti87 (31 Oktober 2007)

hm jetzt wird beim drücken der Joystick-Taste shpHoM(0).Visible = True
bei erneutem drücken aber nicht wieder False


----------



## Ralle (31 Oktober 2007)

borsti87 schrieb:


> hm jetzt wird beim drücken der Joystick-Taste shpHoM(0).Visible = True
> bei erneutem drücken aber nicht wieder False



bhmButton muß eine globale Variable sein, die im gesamten Programm Gültigkeit hat.
Oder du versuchst, wie schon erwähnt das hier:



> Man müßte statt der neuen statischen Variablen auch direkt shpHoM(0).Visible abfragen können.




```
Private Sub lblButton2_Change()
If Not bPressed1(2)AND bButton(2) Then
  If Not shpHoM(0).Visible then 
     shpHoM(0).Visible = True
  Else
     shpHoM(0).Visible = False
  End If 
End If
bPressed1(2) = bButton(2)

End Sub
```


----------



## borsti87 (31 Oktober 2007)

ich bleib dabei 



borsti87 schrieb:


> hm jetzt wird beim drücken der Joystick-Taste shpHoM(0).Visible = True
> bei erneutem drücken aber nicht wieder False


----------



## Ralle (31 Oktober 2007)

borsti87 schrieb:


> ich bleib dabei



Ich glaube, du mußt bPressed1(2) zurücksetzen, wenn der Joystickknopf nicht mehr betätigt ist. Das mußt du doch im Debugger sehen können, was diese Variable macht, oder? Ich vermute mal, sie bleibt auf True, da die Subroutine lblButton2_Change() doch sicher nach dem Loslassen des Buttons nicht mehr aufgerufen wird. Also wird beim 2. Aufruf die Variable bPressed1(2) noch immer auf True sein und das bleibt sie praktisch für immer. Die könnte man evtl. auch als lokale Variable in der Subroutine definieren, dann sollte es gehen.


----------



## Larry Laffer (1 November 2007)

... was ist denn das Aufruf-Kriterium für dein Script "lblButton2_Change" ?


----------



## innovis (9 November 2007)

Ich glaube, ich habe es verstanden. Wie wäre's mit:


```
Public Static oldValue as Bool, newValue as Bool, state as Bool

Private Sub lblButton2_Change()
  'Der Wert hat sich geändert, sollen wir toggeln?
  if oldValue = newValue then
    ' Wir toggeln und merken uns das
    newValue = not newValue
    state = not state
  else
    ' Wir toggeln nicht und merken uns auch das
    oldValue = newValue
  end if

End Sub
```
Dein Zustand ist natürlich in "state" gespeichert. 
Ich hoffe, ich konnte Dir helfen.


----------

