VB 6 Bit setzen

Hallo,

ich habe gerade eine kleine Denkschwaeche. Folgender Sachverhalt.
Eine Variable Musikdata vom Typ Boolean, nimmt einen Wert an der aus der registry gelesen wird! Auf der Form befindet sich nun eine Checkbox ( Check2).

Je nach Zustand der Checkbox soll das Bit 0 in der Variablen Musikdata gesetzt werden. Irgendwie muss das doch mit ein Einzeiler gehen und nicht wie meine Variante mit x Zeilen.

Weiss jemand Rat?

Hier mein Code

Private Sub Check2\_Click()
 If Check2.Value = 1 Then
 If CLng(MusikData And &H1) = 0 Then MusikData = MusikData Or &H1
 Else
 If CLng(MusikData And &H1) = 1 Then MusikData = MusikData Xor &H1
 End If
End Sub

MfG Alex

Autsch das kommt davon wenn man in Gedanken woanders ist. Ich meinte vom Typ Byte und nicht Boolean :wink:

MfG Alex

Hallo Alex,

nun eine Checkbox ( Check2).

Je nach Zustand der Checkbox soll das Bit 0 in der Variablen
Musikdata gesetzt werden. Irgendwie muss das doch mit ein
Einzeiler gehen und nicht wie meine Variante mit x Zeilen.

Als Einzeiler geht das in VB nicht:

Private Sub Check2\_Click()
 If Check2.Value = 1 Then
 MusikData = MusikData Or &H1
 Else
 MusikData = MusikData And Not &H1
 End If
End Sub

MfG Peter(TOO)

Private Sub Check2_Click()
If Check2.Value = 1 Then
MusikData = MusikData Or &H1
Else
MusikData = MusikData And Not &H1
End If
End Sub

Hallo Peter,
VB kennt kein Iif wie in Excel-Vba?
MusikData=Iif(Check2.Value=1,MusikData Or &H1,MusikData And Not &H1)

Wenn nicht, wie wärs dann mit dieser völlig ungetesteten Anregung:

MusikData=Eval(MusikData Or &H1)*(Check2.Value=1)+Eval(MusikData And Not &H1)*(Check2.Value1)

Okay, in Excel-Vba hat, im Gegensatz zu Wahr in Excel selbst, True den Wert -1, ggfs müßte man das noch dementsprechend umschreiben.

Gruß
Reinhard

Hallo Peter,

erst einmal Danke für deine Anregung. Deinen Lösungsweg hatte ich bereits, nur das ich anstatt and not &h1 , gleich xor &h1 genommen habe, was das gleiche macht :smile:
Aber Dank Reinhard, bin ich nun auf folgende Lösung gekommen :smile:

 musikdata = IIf(Check2.Value = 1, musikdata Or &H1, musikdata Xor &H1)

MfG Peter(TOO)

MfG Alex

Hallo Reingard,

auch Dir ein Danke für deinen Hinweis :smile:

VB kennt kein Iif wie in Excel-Vba?

Also lif kennt VB nicht, aber iif. Ich Depp stand echt auf der Leitung, denn die Variante nehme ich sehr sehr oft. gerade wenn es darum geht einen Pfad zusammenzustricken :s

MusikData=Iif(Check2.Value=1,MusikData Or &H1,MusikData And
Not &H1)

Anstatt And Not &H1 kann man auch XOR &h1 nehmen :smile: Macht genau das selbe!
Der Lösungsweg ist

 musikdata = IIf(Check2.Value = 1, musikdata Or &H1, musikdata Xor &H1)

Wenn nicht, wie wärs dann mit dieser völlig ungetesteten
Anregung:

MusikData=Eval(MusikData Or
&H1)*(Check2.Value=1)+Eval(MusikData And Not
&H1)*(Check2.Value1)

Okay, in Excel-Vba hat, im Gegensatz zu Wahr in Excel selbst,
True den Wert -1, ggfs müßte man das noch dementsprechend
umschreiben.

In VB hat der Wert True auch die Wertigkeit von -1 :wink:

So koennte man das auch machen. Dann musst du aber noch die Function ABS aufrufen um den Wert von -1 auf 1 umzurechnen :wink:
Aber was ich in deiner Variante nicht verstehe ist, warum fragst du die Checkbox auf Boolean ab und nicht den Status ( Da hast du gleich die 1 oder die 0) ?

Gruß
Reinhard

Gruß Alex

In VB hat der Wert True auch die Wertigkeit von -1 :wink:

So koennte man das auch machen. Dann musst du aber noch die
Function ABS aufrufen um den Wert von -1 auf 1 umzurechnen :wink:
Aber was ich in deiner Variante nicht verstehe ist, warum
fragst du die Checkbox auf Boolean ab und nicht den Status (
Da hast du gleich die 1 oder die 0) ?

Hallo Alex,
naja, war alles nur so ungetestes brainstorming, hätte ich es ausprobiert wäre ich ggfs auch auf Boolean gekommen, so war es nur ein Gedankengang um die Problematik anzugehen.

Und das Andere was du sagtest, (auf selbst oft benutzte Befehle nicht kommen) wenn man ein Anfrage stellt und jmd. ist so nett und gibt einem da phantastischen Code, mit API Aufrufen usw., so ist das sehr schön und toll.
Was mir leider auch öfters passiert, ich stelle eine Anfrage und bekomme eine Lösung, wo ich jeden Befehl kenne, aber ich kam einfach nicht darauf :frowning:
Wald vor lauter Bäumen nicht sehen usw.
Ich denke das ist normal.
Gruß
Reinhard

Hallo Alex,

MusikData=Iif(Check2.Value=1,MusikData Or &H1,MusikData And
Not &H1)

Anstatt And Not &H1 kann man auch XOR &h1 nehmen :smile: Macht
genau das selbe!

Nein, macht es nicht !

MusikData And Not &H1

Setzt Bit0 immer auf 0

MusikData Xor &H1

Wechselt bei jeder Ausführung den Zustand von Bit0.

sub test()
Sub Command1\_Click()
 Dim a As Byte

 a = &H1F
 Print "Start ""And Not"" : "; Hex(a)
 a = a And Not &H1
 Print "1x ""And Not"" : "; Hex(a)
 a = a And Not &H1
 Print "2x ""And Not"" : "; Hex(a)

 a = &H1F
 Print "Start ""Xor"" : "; Hex(a)
 a = a Xor &H1
 Print "1x ""Xor"" : "; Hex(a)
 a = a Xor &H1
 Print "2x ""Xor"" : "; Hex(a)

End Sub

Ausgabe:

Start "And Not" : 1F
1x "And Not"" : 1E
2x "And Not"" : 1E
Start "Xor"" : 1F
1x "Xor"" : 1E
2x "Xor"" : **1F**

MfG Peter(TOO)

Hi Peter,

klar, die zeile ist nicht ganz richtig, das hat Alex vermutlich schon gemerkt und …

 musikdata = IIf(Check2.Value = 1, musikdata Or &H1, musikdata And &HFE)

… geschrieben. :smile:

Gruß, Rainer

Hallo Peter,

da lag meinerseits ein klassischer Denkfehler vor!
Ich bin von ausgegangen das ein XOR ein negiertes OR sei!

Sprich wenn ein OR eine 1 liefert dann liefert XOR eine 0!
Da XOR nur eine 1 liefert wenn entweder E1 oder E2 eine 1 hat, daran hatte ich nicht gedacht. *schaem*

In meinem Falle waere es aber gegangen, dann wenn das Bit 0 gesetzt ist, also eine 1 liefert und ich dann den Aufruf Musikdata XOR &h1 aufrufe, entspricht das ja 1 und 1 und bringt mir eine 0! Ist eine 0 vorhanden, so rufe ich sie ja mit OR auf. Also 0 und 1 und das bringt mir dann die 1! In dem Falle koennte ich aber auch einfach, via XOR aufrufen, oder ?

Aber bezueglich meines Bsp. koennte ich es dann ja noch einfacher machen!
Die Variable Musikdata wird ja gesetzt anhand eines Wertes aus der Registry! In meiner Form nun, brauche ich eigentlich nur folgendes zu schreiben.

Private Sub check2\_Click()
 musikdata = musikdata Xor &H1
End Sub

Private Sub Form\_Load()
Check2.Value = musikdata Or &H1
End Sub

Somit muesste ich ja die Variable richtig setzen!
Hab ich nun wieder nen Denkfehler drinne?

MfG Alex

Hallo Alex,

Die Variable Musikdata wird ja gesetzt anhand eines Wertes aus
der Registry! In meiner Form nun, brauche ich eigentlich nur
folgendes zu schreiben.

Private Sub check2_Click()
musikdata = musikdata Xor &H1
End Sub

Private Sub Form_Load()
Check2.Value = musikdata Or &H1
End Sub

Somit muesste ich ja die Variable richtig setzen!
Hab ich nun wieder nen Denkfehler drinne?

JA :wink:

Theoretisch funktioniert dein Code problemlos.

Praktisch kann es immer einmal vorkommen, dass eine Meldung im System verloren geht.
In deinem Fall bekommt zuerst die Checkbox eine Meldung über das Click-Ereignis. Dadurch wird das Häkchen gesetzt oder gelöscht. Anschliessend sendet die Checkbox ein Ereignis an dein Programm, welches diese dekodiert und deine Funktion check2_Click() aufruft. Geht nun das Ereignis verloren, zeigt deine Variable genau das Gegenteil von der Checkbox an.

Genau so einen Fehler hat mein ICQ auch. Das Fenster ist zwar das aktive und reagiert auch auf Tastatureingaben, aber Mausklicks werden auf die Fenster dahinter weitergeleitet, weil die Mausroutine glaubt, dass das Fenster nicht aktiv ist.

MfG Peter(TOO)

Hi Alex,

Private Sub check2_Click()
musikdata = musikdata Xor &H1
End Sub

Private Sub Form_Load()
Check2.Value = musikdata Or &H1
End Sub

warum willst Du, wenn Du das letzte Bit löschen willst, Dich darauf verlassen, daß es gesetzt ist und umschalten? Lösch es doch einfach mit And &hFE und gut ist’s.

Gruß, Rainer

Hallo Peter,

aber selbst wenn in meinem Falle die Meldung verloren gehen würde, wäre es nicht so tragisch. Denn wie du dir sicherlich denken kannst ist Musikdata eine Variable die Werte für Einstellungen beinhalten. Das Bit 0 speziell besagt das beim auslesen der Informationen ( MP3, MP4, WMA etc.) Alle Flags ( ID3V2 Tag) ausgelesen werden. Max. werden nur die wichtigsten Felder ausgelesen und Felder wie die UserItems nicht. Diese kann man aber problemlos später erneut einlesen und hinzufügen :smile:

Aber dennoch ein grosses Danke an Dich für deine Hilfestellung und deine Hinweise :smile:

MfG Alex

Hallo Rainer,

das Problem ist folgendes. Ich habe eine DB die Daten (Musik,Videos,Programme) verwaltet. Je nachdem gibt es eine Variable Musikdata, Programdata oder VideoData was die Einstellungen für die jeweilige Daten beinhaltet, die auch in der Registry als Byte gespeichert sind!

Nehmen wir nun einmal die Daten von Musik. Dort werden Daten vom Typ MP3, M4a, WAV, WMA, MPEG, FLAC etc. eingelesen. Wenn die Daten einen ID3V2 Tag besitzen so werden sie auch ausgelesen!

Dort gibt es einen Bereich wo Benutzerdefinierte Daten stehen ( UserFrames, Useritems etc.) Diese kann man je nach Bedarf auslesen!
Diese Position kannst du je nach belieben aktivieren!
Ist sie aktiviert so dauert das einlesen von 5000 Dateien , ca. geschlagene 5 Minuten länger!

In der Variablen MusikData ist das Bit 0 was besagt die Daten auslesen oder nicht! Nun kannst du im Prog auf Scan Klicken und dort die Files automatisch einlesen. Auch hast du dort die Möglichkeit noch die Daten zu aendern. Also sollen alle Frames eingelesen werden oder nicht!

Dieses kannst du ueber die Checkbox Check 2 aktivieren oder nicht!

Deswegen kam meine Frage wie ich das Bit 0 von Musikdata je nach Status von Check 2 auf 0 oder 1 setzen kann!

Mein Frage bezueglich ob es mit einen Einzeller geht beruht darauf das mein Project schon ca 80.000 Zeilen Source hat und compiliert knapp 5 MB betraegt. Sicher kann ich diese dann als DLL speichern, aber 5 MB als DLL ist schon heftig, somal ich erst ca. 60% vom Project fertig habe :s

MfG Alex

Hallo Alex,

danke für die ausführliche Erklärung. Die lese ich wohl noch ein paar mal, bis ich alles verstanden habe. :smile: Trotzdem. Deine Lösung …

musikdata = IIf(Check2.Value = 1, musikdata Or &H1, musikdata Xor &H1)

… ist Fehlerhaft. Das kann klappen, muss aber nicht immer. Was Du willst erreichst Du mit …

musikdata = IIf(Check2.Value = 1, musikdata Or &H1, musikdata And &HFE)

Gruß, Rainer