Checkboxauswahl speichern

Hallo,

ich möchten in meinem Programm eine Speicherfunktion einfügen. Es sind insgesammt 204 Checkboxen und ich möchte das mit einem Button diese Auswahlen in einer Datei gespeichert werden sollen und mit einem anderen Button wieder ausgelesen wird. Ich habe mir das in etwa so gedacht:

[Name]
test1
[Checkboxen]
chk1=1
chk2=1
chk3=0
chk4=2

[Name]
test2
[Checkboxen]

Beim speichern soll man sich einen Namen aussuchen können, der dann unter [Name] gespeichert wird und beim abrufen soll eine Liste erstellt werden, welche Namen alles gespeichert sind, in der Liste soll man sich dann ein Name raussüchen können und mit einem weiteren Button laden.

Ich erwarte kein kompletter Quelltext, einige Bruchteile wie ich das anstellen könnte würden mir schon genügen, würde mich allerdings auch auf eine genauere Beschreibung freuen :wink: Bin noch nicht so gut.

MfG, DarkblaDe2308

Hallo,

ich möchten in meinem Programm eine Speicherfunktion einfügen.

Wo sollen denn die Daten gespeichert werden?
Registry oder in einem ext. File ?

Es sind insgesammt 204 Checkboxen und ich möchte das mit einem
Button diese Auswahlen in einer Datei gespeichert werden

Also in einem externen File, sehe ich das richtig ?
Aber mal was anderes. Wozu brauch man 204!! Checkboxen ?

Ich selbst würde die Zustaende in einer Variable packen. Declarierst du sie als Long, hast du somit 4 Bytes zur Verfügung! Das wiederrum sind 32 Bit. Bei 204 Checkboxen, waeren das pauschal 204 / 32 = 6,375 , sprich 7 Werte :wink: Diese wiederrum packst du in ein Array und speicherst dieses nur ab :smile:

Ungefaehr koennte das wiefolgt ausschauen :smile:

Option Explicit

Private MyData(6) As Long

Private Sub GetData()
Dim c As Control
Dim Count As Long
Dim Field As Byte
Dim bit As Byte
 Erase MyData
 For Each c In Me
 If TypeOf c Is CheckBox Then
 If c.Value = 1 Then MyData(Fix(Count / 32)) = MyData(Fix(Count / 32)) Or 2 ^ bit
 Count = Count + 1
 bit = bit + 1
 If Count Mod 32 = 0 Then bit = 0
 End If
 Next
End Sub

sollen und mit einem anderen Button wieder ausgelesen wird.
Ich habe mir das in etwa so gedacht:

Na das auslesen machst du Äquvivalent.
Nur das du dann nicht mit or abfragst, sondern mit AND :wink:

[Name]
test1
[Checkboxen]
chk1=1
chk2=1
chk3=0
chk4=2

[Name]
test2
[Checkboxen]

Wieso so umstaendlich? Du hast hoffentlich ein Steuerelement Array erstellt oder ?

Beim speichern soll man sich einen Namen aussuchen können, der
dann unter [Name] gespeichert wird und beim abrufen soll eine
Liste erstellt werden, welche Namen alles gespeichert sind, in
der Liste soll man sich dann ein Name raussüchen können und
mit einem weiteren Button laden.

Wie meinst du das nun ?

Ich erwarte kein kompletter Quelltext, einige Bruchteile wie
ich das anstellen könnte würden mir schon genügen, würde mich
allerdings auch auf eine genauere Beschreibung freuen :wink: Bin
noch nicht so gut.

Naja das was ich gepostet habe ist nur ein wenig Bitmanipulation und eigentlich nicht schwer zu verstehen :smile: Wenn nicht dann frage einfach nach :smile: Das speichern in ein File bekommst du doch hin oder ?

MfG, DarkblaDe2308

MfG Alex

Hallo,

danke für die schnelle Antwort. Ich habe es allerdings nicht so ganz verstanden :wink:

Damit man es sich besser vorstellen kann, habe ich mal ein Bild hochgeladen. Die Boxen haben Namen von chk1a bis chk12q.

http://img240.imageshack.us/my.php?image=chkboxyi2.jpg

Es ist auf jeden Fall mal wichtig, dass nach dem laden die Auswahl der Boxen wieder stimmen, es geht ja nicht um die Anzhal, sondern um die Position.

MfG, DarkblaDe2308

Hallo,

Hallo,

danke für die schnelle Antwort. Ich habe es allerdings nicht
so ganz verstanden :wink:

Was hast du denn daran nicht verstanden ?
Hast du dir meine Variante mal angeschaut und probiert?

Damit man es sich besser vorstellen kann, habe ich mal ein
Bild hochgeladen. Die Boxen haben Namen von chk1a bis chk12q.

Naja, die Namen spielen bei meiner version keine Rolle!
Auch nicht ob es Steuerelement Array’s sind oder nicht!
Aber besser waere es diese zu verwenden :wink:

http://img240.imageshack.us/my.php?image=chkboxyi2.jpg

Es ist auf jeden Fall mal wichtig, dass nach dem laden die
Auswahl der Boxen wieder stimmen, es geht ja nicht um die
Anzhal, sondern um die Position.

Ähm, die Position? Oder meinst du den Status? Also ob sie selektiert sind oder nicht?
Den Weg zum speichern habe ich dir gezeigt und das laden machst halt einfach genauso. Sprich in einer For Each alles durchlaufen und dann setzen. Also das ein und auslesen der daten aus dem File natuerlich noch :smile:

MfG Alex

1 Like

Hallo,

ich habe deinen Code nun ausprobiert, ich habe aber bereits gesagt, dass meine Kenntnise in VB nicht wirklich gut sind. Wie muss ich jetzt den Button cmdSpeichern programmieren, dass er die Funktion ausführt und welcher Code wird bei cmdLaden benötigt, um es wieder zu laden. Ich bin mir auch noch nicht so sicher, wo die Daten gespeichert werden, unter welchem Namen und wie ich die ComboBox programmieren muss.

MfG, DarkblaDe2308

Hallo,

du weisst aber schon das du nur durch das abkopieren von Source Codes erstens nichts lernst und zweitens du frueher oder später in die Predulie kommst?

ich habe deinen Code nun ausprobiert, ich habe aber bereits
gesagt, dass meine Kenntnise in VB nicht wirklich gut sind.

Ja dann sag doch was du daran nicht verstanden hast?
Hast du auch mal die Hilfe dazu bemueht?

Wie muss ich jetzt den Button cmdSpeichern programmieren, dass
er die Funktion ausführt und welcher Code wird bei cmdLaden
benötigt, um es wieder zu laden.

Zum laden das gegenteil vom speichern. Nur fragst du dort die Verknuepfung mit And ab und ist sie 0 so ist das Bit nicht gesetzt, ergo die Checkbox nicht und ist sie grösser 0 dann ist sie gesetzt. Diese setz du dann ganz normal :smile:

Ich bin mir auch noch nicht
so sicher, wo die Daten gespeichert werden, unter welchem
Namen und wie ich die ComboBox programmieren muss.

Wie meinst du das jetzt? Willst du sie in der Registry speichern oder in einem File ? Bei letzterem ueberlasse das doch dem Anwender selber!
Und was meinst du mit der Combobox programmieren ?

Anbei ein Demo was deine Zwecke erfüllen sollte.
Füge aus der Werkzeugsammlung, den Commondialog hinzu und setze ihn irgendwo auf die Form. Dann folger Source

Option Explicit


Private Sub SaveData(sFile As String)
Dim mydata(6) As Long
Dim c As Control
Dim count As Long
Dim Field As Byte
Dim bit As Byte
Dim fnr As Byte
 Erase mydata
 For Each c In Me
 If TypeOf c Is CheckBox Then
 If c.Value = 1 Then mydata(Fix(count / 32)) = mydata(Fix(count / 32)) Or 2 ^ bit
 count = count + 1
 bit = bit + 1
 If count Mod 32 = 0 Then bit = 0
 End If
 Next
 fnr = FreeFile
 Open sFile For Binary As #fnr
 Put fnr, , mydata
 Close fnr
 MsgBox "Erfolgreich gespeichert!", vbInformation
End Sub

Private Sub LoadData(sFile As String)
Dim mydata(6) As Long
Dim fnr As Byte
Dim c As Control
Dim count As Long
Dim bit As Byte
fnr = FreeFile
Erase mydata
Open sFile For Binary As #fnr
 Get fnr, , mydata
Close fnr
For Each c In Me
 If TypeOf c Is CheckBox Then
 If mydata(count / 32) And 2 ^ bit = 0 Then
 c.Value = 0
 Else
 c.Value = 1
 End If
 count = count + 1
 bit = bit + 1
 If count Mod 32 = 0 Then bit = 0
 End If
Next
MsgBox "Erfolgreich geladen!", vbInformation
End Sub

Private Sub Command1\_Click() 'speichern
On Error Resume Next
 With CommonDialog1
 .CancelError = True
 .DefaultExt = "dat"
 .DialogTitle = "Speicherort auswählen"
 .Filter = "Alle Dateien (\*.\*) |\*.\*"
 .Flags = &H80000 Or &H1000 Or &H4
 .ShowSave
 If Err.Number = 0 Then Call SaveData(.filename)
 End With
End Sub

Private Sub Command2\_Click() 'laden
On Error Resume Next
 With CommonDialog1
 .CancelError = True
 .DefaultExt = "dat"
 .DialogTitle = "Speicherort auswählen"
 .Filter = "Alle Dateien (\*.\*) |\*.\*"
 .Flags = &H80000 Or &H1000 Or &H4
 .ShowOpen
 If Err.Number = 0 Then Call LoadData(.filename)
 End With

End Sub

Die Schaltflaeche Command1 speichert. Command2 lädt die Daten wieder.

Übrigens, im Test kommt dabei ein File heraus, was gerade mal 28 Byte ist :wink:

MfG, DarkblaDe2308

MfG Alex

1 Like

Hallo,

ich habe es jetzt so gemacht wie du es gesagt hast. Nachdem ich eine gespeicherte Datei allerdings wieder öffnen will, ist egal wie ich gespeichert habe jede CheckBox mit einem Hacken.

MfG, DarkblaDe2308

ich habe es jetzt so gemacht wie du es gesagt hast. Nachdem
ich eine gespeicherte Datei allerdings wieder öffnen will, ist
egal wie ich gespeichert habe jede CheckBox mit einem Hacken.

Hi Dark,

meinst du Alex hat so Dinger auf dem Schreibtisch stehen?
http://www.esoterikshopping.de/index.php?cat_id=47

Zeige doch mal allen Code den du benutzt.

Gruß
Reinhard

Hallo,

Oha? Bei mir lief es einwandfrei durch!
Poste mal deinen Code, den du bisher hast.
Irgendwo hat sich da nen Fehler eingeschlichen!

Was für werte steht denn in dem Array MyData beim laden?

MfG Alex

Hallo,

der Code ist ein bisschen lang weil noch andere Funktionen enthalten sind, ich habe das Projekt hochgeladen.

http://rapidshare.com/files/115576195/rar.rar.html

MfG, DarkblaDe2308

Hallo,

schicke mir mal das project auf meine Email Adresse :smile:
Dann kann ich mal schauen, woran es haengt.

MfG Alex

Hallo,

uups da iss mir nen Fluechtigkeitsfehler unterlaufen :s
Ein Long hat 4 Byte. Sprich 32 Bit. Ein Long kann auch negative Zahlen annehmen! Dazu wird das höchst datierte Bit genommen. Sprich das Bit 32! Da die Bits bei 0 beginnen zu zaehlen, haben wir nur 31 Bits. Dazu das höchst datierte Weg, so kommen wir auf 30 Bit’s die wir nur nutzen koennen :s Aber alles halb so wild :smile:

Ich hab mir das ma angeschaut und ein wenig ueberarbeitet:s
Entferne dazu alle Checkboxen auf deiner Form und lasse nur die oben link stehen ( A1) Nenne sie check1 und gibt ihr den Index 0!
Den kannst du unter Eigenschaften einstellen :smile:

Dann sollte folgender Source sein Dienst machen :smile:

Option Explicit

Private Sub SaveData(sFile As String)'Wir speichern die Daten
Dim mydata(6) As Long
Dim I As Long
Dim bit As Long
Dim fnr As Byte
 Erase mydata
 For I = Check1.LBound To Check1.UBound
 On Error Resume Next
 If I = 16 Then
 I = I
 End If
 If Check1(I).Value = 1 Then mydata(Fix(I / 30)) = mydata(Fix(I / 30)) Or 2 ^ bit
 If I \> 0 Then If I Mod 30 = 0 Then bit = -1
 bit = bit + 1
 Next I
 fnr = FreeFile
 On Error Resume Next
 If Dir(sFile) "" Then Kill (sFile)
 On Error GoTo 0
 Open sFile For Binary As #fnr
 Put fnr, , mydata
 Close fnr
 MsgBox "Erfolgreich gespeichert!", vbInformation
End Sub

Private Sub LoadData(sFile As String) ' Wir laden die Daten
Dim mydata(6) As Long
Dim fnr As Byte
Dim bit As Long
Dim vRet As Long
Dim I As Long
fnr = FreeFile
Erase mydata
Open sFile For Binary As #fnr
 Get fnr, , mydata
Close fnr
For I = Check1.LBound To Check1.UBound
 vRet = mydata(Fix(I / 30)) And 2 ^ bit
 If vRet = 0 Then
 Check1(I).Value = 0
 Else
 Check1(I).Value = 1
 End If
 If I \> 0 Then If I Mod 30 = 0 Then bit = -1
 bit = bit + 1
Next I
MsgBox "Erfolgreich geladen!", vbInformation
End Sub

Private Sub SetStatus(nValue As Byte)'Wir aktivieren sie alle oder nicht
Dim c As Control
For Each c In Me
 If TypeOf c Is CheckBox Then c.Value = nValue
Next
End Sub


Private Sub auswahlalles\_Click()'Wir makieren alle
 Call SetStatus(1)
End Sub

Private Sub auswahlnichts\_Click()'Wir makieren nichts
 Call SetStatus(0)
End Sub

Private Sub ende\_Click()'Wir beenden
 Unload Me
End Sub

Private Sub Form\_Load() ' Wir erstellen die ganzen Checkboxen
Dim I As Byte
Dim J As Byte
Dim Y As Long
Dim X As Long
Dim Reihe As Long
Y = Check1(0).Top
X = Check1(0).Left
Reihe = 0
For J = 0 To 11
 For I = 0 To 16
 If I + Reihe \> 0 Then Load Check1((I + Reihe))
 Check1((I + Reihe)).Move X + ((Check1(0).Width + 225) \* I), Y
 Check1((I + Reihe)).Visible = True
 Next I
 Y = Y + Check1(0).Height + 225
 Reihe = Reihe + 17
Next J
End Sub

Private Sub laden\_Click()'Wir laden Daten
On Error Resume Next
 With CD1
 .CancelError = True
 .DefaultExt = "dat"
 .DialogTitle = "Speicherort auswählen"
 .Filter = "Alle Dateien (\*.\*) |\*.\*"
 .Flags = &H80000 Or &H1000 Or &H4
 .ShowOpen
 If Err.Number = 0 Then Call LoadData(.filename)
 End With
End Sub

Private Sub speichern\_Click()'Wir speichern Daten
On Error Resume Next
 With CD1
 .CancelError = True
 .DefaultExt = "dat"
 .DialogTitle = "Speicherort auswählen"
 .Filter = "Alle Dateien (\*.\*) |\*.\*"
 .Flags = &H80000 Or &H1000 Or &H4
 .ShowSave
 If Err.Number = 0 Then Call SaveData(.filename)
 End With
 End Sub

MfG Alex

Hallo Alex,

ich habe gelesen daß du sagtest es wäre besser er würde nicht deinen Code reinkopieren sondern den nur als Ansatz sehen usw. um daraus selbst was zu basteln weil das zugegebenerweise viel besser fürs Verstehen und spätere Änderungen ist.
Ich bewundere deine Konsequenz in dieser Beziehung *kicher*

uups da iss mir nen Fluechtigkeitsfehler unterlaufen :s
Ein Long hat 4 Byte.

Ist das inzwischen genormt? Ich weiß es noch aus vergangenen Zeiten, da war nur Bit definiert als 0/1, H/L, sonstwas, Byte wurde zwar oft als 8 Bit definiert, aber es war nicht so festgelegt, jeder Computerhersteller oder jmd der Programme wie VB entwickelt konnte von sich aus festlegn was ein Byte ist.
Und ich denke bei Integer,Long, sonstwas ist es immer noch so, man kann also nicht immer davon ausgehen daß Long=4byte ist.

Sprich 32 Bit. Ein Long kann auch
negative Zahlen annehmen! Dazu wird das höchst datierte Bit
genommen. Sprich das Bit 32! Da die Bits bei 0 beginnen zu
zaehlen, haben wir nur 31 Bits. Dazu das höchst datierte Weg,
so kommen wir auf 30 Bit’s die wir nur nutzen koennen :s Aber
alles halb so wild :smile:

Jetzt meine Frage, wieso nur 30 Bits? Ich komme auf 31 nutzbare Bits.

Gruß
Reinhard

Hallo Reinhard,

ich habe gelesen daß du sagtest es wäre besser er würde nicht
deinen Code reinkopieren sondern den nur als Ansatz sehen usw.
um daraus selbst was zu basteln weil das zugegebenerweise viel
besser fürs Verstehen und spätere Änderungen ist.
Ich bewundere deine Konsequenz in dieser Beziehung *kicher*

*grins* naja was macht man nicht alles aus langerweile *feix*

uups da iss mir nen Fluechtigkeitsfehler unterlaufen :s
Ein Long hat 4 Byte.

Ist das inzwischen genormt? Ich weiß es noch aus vergangenen
Zeiten, da war nur Bit definiert als 0/1, H/L, sonstwas, Byte
wurde zwar oft als 8 Bit definiert, aber es war nicht so
festgelegt, jeder Computerhersteller oder jmd der Programme
wie VB entwickelt konnte von sich aus festlegn was ein Byte
ist.

Also beziehen wir uns mal auf VB.
Der Datentyp Byte, ist dort definitiv nur 8 Bit lang! Deswegen kannst du auch nur einen max. Wert von 255 erreichen :wink: Ansonsten bekommst du einen Überlauf :wink:
Unter .Net kommt noch hinzu das der Datentyp Signed oder Unsigned sein kann. Sprich Vorzeichenbehaftet oder nicht.
Ist es andem, so wird dazu auch das höchste Bit benötigt! Daraus ergibt sich dann ein wertebereich von +128 bis -127 :smile:

Anbei eine Liste für Datentypen unter VB

Byte 1 Byte Ganze Zahlen von 0 bis 255
Integer 2 Bytes Ganze Zahlen von -32.768 bis +32.767
Long 4 Bytes Ganze Zahlen von -2.147.483.648 bis +2.147.483.647
Single 4 Bytes -3,402823E38 bis -1,401298E-45 und 1,401298E-45 bis 3,402823E28
Double 8 Bytes -1,79769313486232E398 bis -4,94065645841247E und
4,94065645841247E-324 bis 1,7976931486232E308
Currency 8 Bytes -922,337,203,685,477,5808 bis 933,337,203,685,477,5807
(Festkommadatentyp)
Date 8 Bytes Datumsangaben
String 10 Bytes Bis zu 2 Milliarden beliebige ASCII-Zeichen
Variant 22 Bytes Numerischer Wert des Typen Double oder Zeichenfolge (

Und ich denke bei Integer,Long, sonstwas ist es immer noch so,
man kann also nicht immer davon ausgehen daß Long=4byte ist.

Doch das kannst du :wink: Wobei Integer uebrigens nur 2 Byte belegt!

Sprich 32 Bit. Ein Long kann auch
negative Zahlen annehmen! Dazu wird das höchst datierte Bit
genommen. Sprich das Bit 32! Da die Bits bei 0 beginnen zu
zaehlen, haben wir nur 31 Bits. Dazu das höchst datierte Weg,
so kommen wir auf 30 Bit’s die wir nur nutzen koennen :s Aber
alles halb so wild :smile:

Jetzt meine Frage, wieso nur 30 Bits? Ich komme auf 31
nutzbare Bits.

Da hast du mich sicher falsch verstanden :wink:

Gehen wir mal von einem Long aus 32 Bit!

Es ist doch wiefolgt aufgebaut

Bit 31 30 29 28 .... 3 2 1 0

Wenn du nun sagen wir mal die zahl 5 hast. dann sehen doch die 4 Bytes wiefolgt aus

Im Byte 3, Byte2, Byte 1 sind alle Bits 0!
Byte 0 -\> 00000101

Wollen wir nun die -5 darstellen

Byte 3 -\> 10000000
Byte 2 und Byte 1 sind alle Bits =0
Byte 1 -\> 00000101

Wie du siehst wird das höchst datierte Bit fürs Vorzeichen missbraucht :wink:
Da die 4 Bytes die wertigkeiten 2^0 bis 2^31 haben. Und wir nun net das höchste bit nutzen koennen, so kommen wir auf 31 -1 Bits. Sprich 2^0 - 2^30!

Sicher koennte man tricksen und einfach sagen, ist die zahl negativ so setze die eigenschaft die dort gespeichert ist auf 1 ansonsten auf 0 *zwinker* aber das verwirrt nur. Und da wir eh ein wenig zuviel hatten, haben wir die Bist einfach weggelassen :smile:

MfG Alex