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
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
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
Aber Dank Reinhard, bin ich nun auf folgende Lösung gekommen
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 Macht genau das selbe!
Der Lösungsweg ist
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
So koennte man das auch machen. Dann musst du aber noch die Function ABS aufrufen um den Wert von -1 auf 1 umzurechnen
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) ?
In VB hat der Wert True auch die Wertigkeit von -1
So koennte man das auch machen. Dann musst du aber noch die
Function ABS aufrufen um den Wert von -1 auf 1 umzurechnen
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
Wald vor lauter Bäumen nicht sehen usw.
Ich denke das ist normal.
Gruß
Reinhard
MusikData=Iif(Check2.Value=1,MusikData Or &H1,MusikData And
Not &H1)
Anstatt And Not &H1 kann man auch XOR &h1 nehmen 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**
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?
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
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.
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.
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
Aber dennoch ein grosses Danke an Dich für deine Hilfestellung und deine Hinweise
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