Für mein aktuelles Projekt machte ich mir gerade darüber Gedanken, wie ich die Datensätze im Programm verwalten will und kam zu dem Schluß, dass ein "Array of struct" eigentlich ganz gut dafür geeignet ist.
Vor allem sieht man im Quelltext dann auch gleich welche Daten wo liegen, weil man sie über die Punktnotation ansprechen kann. Das ist gegenüber einem 2D-Array ein großer Vorteil.
Aber auch das Laden und Speichern der Daten ist so viel unkomplizierter. Vielleicht könnt ihr das ja auch gebrauchen...
Hier mal ein Beispiel dazu:
AutoIt
#include <WinAPIHObj.au3>
#include <WinAPIInternals.au3>
; Datenstruktur definieren
Global Const $tagWORKER = 'struct;uint ID;char Nachname[60];char Vorname[60];char Geburtstag[8];' & _
'char Strasse[60];char HausNr[6];char PLZ[5];char Wohnort[60];char TelNr[20];endstruct'
; Das "Array of struct" erstellen
Global $g_aWorker[2]
For $i = 0 To UBound($g_aWorker) - 1
$g_aWorker[$i] = DllStructCreate($tagWORKER)
Next
#Region "Array of struct" mit Testdaten fuellen
$g_aWorker[0].ID = 10000
$g_aWorker[0].Nachname = 'Meiselbach'
$g_aWorker[0].Vorname = 'Karl-Heinz'
$g_aWorker[0].Geburtstag = '19640428'
$g_aWorker[0].Strasse = 'Josef-Zinnbauer-Straße'
$g_aWorker[0].HausNr = '308D'
$g_aWorker[0].PLZ = '75633'
$g_aWorker[0].Wohnort = 'Hintertupfingen'
$g_aWorker[0].TelNr = '+49 7366 783411'
$g_aWorker[1].ID = 10001
$g_aWorker[1].Nachname = 'Rotfuss'
$g_aWorker[1].Vorname = 'Theodor'
$g_aWorker[1].Geburtstag = '19591030'
$g_aWorker[1].Strasse = 'Am alten Forsthaus'
$g_aWorker[1].HausNr = '33'
$g_aWorker[1].PLZ = '58721'
$g_aWorker[1].Wohnort = 'Kronsbach'
$g_aWorker[1].TelNr = '+49 4862 11598'
#EndRegion
ConsoleWrite('Vor dem speichern auf Festplatte:' & @CRLF)
ConsoleWrite('$g_aWorker[0].Nachname = ' & $g_aWorker[0].Nachname & @CRLF)
ConsoleWrite('$g_aWorker[0].Wohnort = ' & $g_aWorker[0].Wohnort & @CRLF)
ConsoleWrite('$g_aWorker[0].TelNr = ' & $g_aWorker[0].TelNr & @CRLF)
ConsoleWrite('$g_aWorker[1].Nachname = ' & $g_aWorker[1].Nachname & @CRLF)
ConsoleWrite('$g_aWorker[1].Wohnort = ' & $g_aWorker[1].Wohnort & @CRLF)
ConsoleWrite('$g_aWorker[1].TelNr = ' & $g_aWorker[1].TelNr & @CRLF & @CRLF)
Global Const $sDatafile = @ScriptDir & '\Data.bin'
_WriteData($sDatafile) ; alle Daten auf Festplatte speichern
$g_aWorker = 0 ; Array of struct loeschen
_ReadData($sDatafile) ; die Daten wieder von der Festplatte laden
ConsoleWrite('Nach dem laden von Festplatte:' & @CRLF)
ConsoleWrite('$g_aWorker[0].Nachname = ' & $g_aWorker[0].Nachname & @CRLF)
ConsoleWrite('$g_aWorker[0].Wohnort = ' & $g_aWorker[0].Wohnort & @CRLF)
ConsoleWrite('$g_aWorker[0].TelNr = ' & $g_aWorker[0].TelNr & @CRLF)
ConsoleWrite('$g_aWorker[1].Nachname = ' & $g_aWorker[1].Nachname & @CRLF)
ConsoleWrite('$g_aWorker[1].Wohnort = ' & $g_aWorker[1].Wohnort & @CRLF)
ConsoleWrite('$g_aWorker[1].TelNr = ' & $g_aWorker[1].TelNr & @CRLF)
Func _WriteData($sPath)
Local $hFile, $nBytes, $tData
$hFile = _WinAPI_CreateFile($sPath, 1, 4) ; 1 = create file if not exist, 4 = write access
If Not $hFile Then Return
$tData = DllStructCreate('uint Count;')
$tData.Count = UBound($g_aWorker)
_WinAPI_WriteFile($hFile, $tData, DllStructGetSize($tData), $nBytes)
For $i = 0 To UBound($g_aWorker) - 1
_WinAPI_WriteFile($hFile, $g_aWorker[$i], DllStructGetSize($g_aWorker[$i]), $nBytes)
Next
_WinAPI_CloseHandle($hFile)
EndFunc
Func _ReadData($sPath)
Local $hFile, $nBytes, $tData
$hFile = _WinAPI_CreateFile($sPath, 2, 2) ; 2 = open file, 2 = read access
If Not $hFile Then Return
$tData = DllStructCreate('uint Count;')
_WinAPI_ReadFile($hFile, $tData, DllStructGetSize($tData), $nBytes)
Global $g_aWorker[$tData.Count]
For $i = 0 To $tData.Count - 1
$g_aWorker[$i] = DllStructCreate($tagWORKER)
_WinAPI_ReadFile($hFile, $g_aWorker[$i], DllStructGetSize($g_aWorker[$i]), $nBytes)
Next
_WinAPI_CloseHandle($hFile)
EndFunc
Alles anzeigen