# Habe 3 Arrays und Einstellungen in eine Datei zu speichern bzw. laden



## Black-Zero (23. Oktober 2008)

Hallo,

wie der Titel meines Beitrages schon verspricht, habe ich vor 3 Arrays und einige Einstellungen in eine Datei zu speichern bzw. aus einer Datei zu laden.
Nach einigem googlen bin ich zu der Erkenntnis gekommen, dass ich es nicht ohne Hilfe schaffe, ein Array in eine Datei zu speichern und wieder zu laden.
Nebenbei könnte ich auch ein paar Tipps gebrauchen, wie ich am besten meine Einstellungen speichere bzw. lade und das am besten alles in einer Datei.

Vielen Dank für Eure Hilfe schon im Voraus,

Black-Zero


----------



## Zvoni (24. Oktober 2008)

Lies dir das hier mal durch:

http://www.vbarchiv.net/api/api_getprivateprofilestring.html
http://www.vbarchiv.net/api/api_writeprivateprofilestring.html


----------



## Black-Zero (30. Oktober 2008)

Danke für deine Antwort!

Habe mittlerweile deine 2 Links durchgearbeitet und verstanden.
Aber wie kann ich nun Arrays abspeichern? Auf diese Weise und am besten in der selben Datei.

Vielen Dank,

Black-Zero


----------



## Zvoni (30. Oktober 2008)

```
Dim myArray1(1 To 10) As String
Dim myArray2(1 to 5) As String
Dim myArray3(1 to 4) As String

For i=1 To 10
    WritePrivateProfileString "Array1", "Schlüssel" & i, myArray1(i), App.Path & "\myArray.ini"
Next

For i=1 To 5
    WritePrivateProfileString "Array2", "Schlüssel" & i, myArray2(i), App.Path & "\myArray.ini"
Next

For i=1 To 4
    WritePrivateProfileString "Array3", "Schlüssel" & i, myArray3(i), App.Path & "\myArray.ini"
Next
```


----------



## Black-Zero (30. Oktober 2008)

Danke für deine schnelle Antwort.

Leider kann ich das gerade nicht ausprobieren. Mach ich aber gleich heute Abend.
Funktioniert das auch mit 2 dimensionalen Arrays

Vielen Dank,

Black-Zero


----------



## Zvoni (30. Oktober 2008)

```
Dim myArray(1 to 10, 1 To 5) As String

For i=1 To 10

    For j=1 To 5

        WritePrivateProfileString "myArray", "Schlüssel" & i & "-" & j, myArray(i, j), App.Path & "\myArray.ini"

    Next

Next
```


----------



## Black-Zero (31. Oktober 2008)

Zvoni hat gesagt.:


> ```
> Dim myArray(1 to 10, 1 To 5) As String
> 
> For i=1 To 10
> ...



Hallo,

ich habs nun mal auf diese Weise ausprobiert und muss sagen, dass ich bei meinen drei Arrays schon ziemlich lang brauche, um diese zu speichern bzw. zu laden (jenseits von 5min ).

```
Dim Array_DMX_data(0 To 7, 0 To 287) As String
Dim Array_DMX_ch_Spek(1 To 1024, 0 To 287) As String
Dim Array_DMX_ch_gen(1 To 1024, 2 To 6) As String
```

Woran kann das liegen? Kann ich das irgendwie optimieren? Oder dem Programm mehr Prozessorleistung für diese Sache zuweisen?

Vielen Dank,

Black


----------



## Zvoni (31. Oktober 2008)

Wuha! Dir ist klar, dass du effektiv *304384* Variablen hast, welche du dann speichern willst? Das bedeutet auch, dass du die WritePrivateProfileString 304384 mal aufrufst. Denk dran: Die langsamste Komponente ist meistens die Festplatte, und wenn du 304384 mal die Datei öffnest, hineinschreibst und wieder schliesst, wundert es mich nicht, dass es so lange braucht.

Als Optimierung fällt mir nur asynchrone ActiveX-DLL ein, weil diese in dem Fall einen eigenen Thread erzeugt.

Mehr Prozessorleistung wird nichts bringen, da die langsamste Komponente dich ausbremst (Festplatte).


----------



## Black-Zero (31. Oktober 2008)

Zvoni hat gesagt.:


> Als Optimierung fällt mir nur asynchrone ActiveX-DLL ein, weil diese in dem Fall einen eigenen Thread erzeugt



Was ist das? Wie geht das?

Vielen Dank,

Black


----------



## Zvoni (31. Oktober 2008)

Das ist eher fortgeschrittene Programmiertechnik. Falls du Anfänger bist, bin ich mir nicht sicher, ob das ne Nummer zu gross ist für dich.

asynchrone ActiveX-DLL setzt z.B. voraus, dass du weisst, wie man Klassen sauber codet


----------



## ronaldh (31. Oktober 2008)

Folgende Funktion macht das gleiche, benötigt jedoch den Bruchteil einer Sekunde:


```
Type SchluesselTyp
   Einstellung(1 To 5) As String * 200
End Type

Public Sub Test()
   Dim myArray(1 To 10, 1 To 5) As String
   Dim FNr As Integer
   Dim FName As String
   Dim i As Integer
   Dim j As Integer
   Dim Schluessel As SchluesselTyp
   
   FName = App.Path + "\MyArray.dat"
   FNr = FreeFile
   Open FName For Random As #FNr Len = Len(Schluessel)
   For i = 1 To 10
      For j = 1 To 5
         Schluessel.Einstellung(j) = myArray(i, j)
      Next
      Put #FNr, i, Schluessel
   Next
   Close #FNr
   MsgBox "Fertig"
End Sub
```

Grüsse
ronaldh


----------



## Black-Zero (31. Oktober 2008)

Ok. Werd ich gleich mal testen.

Wie sieht es da dann mit dem Laden der Daten aus? (Dauert bei derzeit genauso lang, wie das speichern)

Vielen Dank,

Black-Zero


----------



## Zvoni (31. Oktober 2008)

dürfte in etwa genauso schnell wie das speichern sein.


----------



## ronaldh (31. Oktober 2008)

Jo! Da muss nur "Put" gegen "Get" ausgetauscht werden.

Grüsse
ronaldh


----------



## Black-Zero (31. Oktober 2008)

```
Private Type SchluesselTyp1
   S_DMX_data(0 To 287) As String * 200
End Type
```

Er bringt mir folgenden Fehler: "Unveränderliche oder statische Daten können maximal 64kB umfassen"

Wie kann ich das beheben?

Vielen Dank,

Black


----------



## ronaldh (31. Oktober 2008)

Dreh es doch einfach um, dass heißt Array 0 to 7, und dann 288 Sätze in die temporäre Datei schreiben!


----------



## Zvoni (31. Oktober 2008)

Black-Zero hat gesagt.:


> ```
> Private Type SchluesselTyp1
> S_DMX_data(0 To 287) As String * 200
> End Type
> ...



Du reservierst 288 Einträge mit je 400 Bytes (=115200 Bytes) pro SchluesselTyp1-Variable


----------



## Black-Zero (31. Oktober 2008)

```
Private Type SchluesselTyp1
   S_DMX_data(0 To 287) As String * 200
End Type
```
Kann ich das Array nicht als eine andere Variable als String deklarieren? Ich hätte nur Zahlen zwischen 0 und maximalst 1500-2500 zu speichern (je nach dem wie weit ich mein Programm noch ausbaufähig lassen will) und vielleicht noch "" (leer). Und nach dem Maximalwert richten sich auch 2 meiner 3 Arrays in Ihrer einen Größe.
=> würde zum Problem werden, denk ich mal

Gäbe es nicht eine Möglichkeit, dass ich den kompletten Text, den ich so jetz in die Textdatei schreibe, in eine Art Zwischenspeicher (Beispielsweise eine Textbox) zusammenfasse und dann das Alles zusammen in einem Schreibzyklus in die Datei schreibe?

Vielen Dank,

Black


----------



## Zvoni (3. November 2008)

Such mal nach *WritePrivateProfileInt* ud *GetPrivateProfileInt*


----------



## ronaldh (3. November 2008)

Wenn Du nur maximal 4-stellige Zahlen speichern willst, ist eine Dimensionierung auf eine String-Länge von 200 natürlich völlig überzogen.

```
Private Type SchluesselTyp1
   S_DMX_data(0 To 287) As Integer
End Type
```
...ist dann natürlich der richtige Weg.


----------



## Black-Zero (5. November 2008)

Da soweit nun das Speichern anscheinend ohne Fehlermeldungen funktioniert, widme ich mich nun dem Laden:


Black-Zero hat gesagt.:


> Wie sieht es da dann mit dem Laden der Daten aus? (Dauert bei derzeit genauso lang, wie das speichern)





ronaldh hat gesagt.:


> Jo! Da muss nur "Put" gegen "Get" ausgetauscht werden.


Das hab ich gemacht:

```
FName = App.Path + "\eSound2Light1.dat"
   FNr = FreeFile
   Open FName For Random As #FNr Len = Len(Schluessel1)
   For i = 1 To 8
      For j = 0 To 287
         Schluessel1.S_DMX_data(j) = DMX_data(i - 1, j)
      Next
      Get #FNr, i, Schluessel1
   Next
   Close #FNr
   MsgBox "Fertig"
```
Wo speichert der nun aber mein geladenes Array hin? Wohl kaum zurück in das Array "DMX_data"?
Wie bekomm ich nun meine Daten zurück in mein ursprüngliches Array?

Vielen Dank,

Black-Zero


----------



## ronaldh (5. November 2008)

Du musst natürlich zuerst lesen, dann zuweisen. Und natürlich musst Du auch den Dateiinhalt dem Array zuweisen, und nicht den Dateiinhalt mit dem (vor dem Lesen ja vermutlich leeren) Array überschreiben.


```
FName = App.Path + "\eSound2Light1.dat"
   FNr = FreeFile
   Open FName For Random As #FNr Len = Len(Schluessel1)
   For i = 1 To 8
      Get #FNr, i, Schluessel1
      For j = 0 To 287
         DMX_data(i - 1, j) = Schluessel1.S_DMX_data(j) 
      Next
    Next
   Close #FNr
   MsgBox "Fertig"
```


----------



## Black-Zero (5. November 2008)

Super! Jetzt klappts!

Kann ich auf diese Weise auch mehrere Arrays in eine Datei speichern? Bzw. auch mit in eine *.ini Datei mit Einstellungen speichern?

Vielen Dank,

Black-Zero


----------



## Zvoni (5. November 2008)

Ja, kannst du.
Was das betrifft gibts es nur Limits vom Betriebssystem (Ich glaub unter Win ist die maximale Dateigrösse irgendwo bei 8GB, aber ich bezweifel mal, dass du so ne grosse Datei hinbekommst ^^)

Jedoch, würde ich mir aber auch Gedanken machen, eventuell auf getrennte Dateien zuzugreifen.


----------



## ronaldh (5. November 2008)

Zvoni hat gesagt.:


> Jedoch, würde ich mir aber auch Gedanken machen, eventuell auf getrennte Dateien zuzugreifen.



Das würde ich in diesem Fall auch dringend empfehlen, da Du ja nun mit einer Datei fester Satzlänge arbeitest, die durch die Type-Deklaration definiert ist. Und vermutlich hat Dein anderes Array andere Dimensionen, dann passt das natürlich nicht mehr.


----------

