Hallo,
Für die Nostalgiker unter euch, habe ich eine Art Random Access Datei aus Bereichen gemacht.
Etwa wie früher aus BASIC gewohnt. Statt FIELD .... geht es hier mit STRUCT.
Probiert mal aus, ob ihr noch einen Fehler findet. Ansonsten ist es mal ein Anfang.
Code
Declare Mem Personal, Handle btn1, btn2, btn3, btn4, grid, edit1, edit2, edit3, edit4
Declare Long satznr, ende
Declare String zeile
Struct Mitarbeiter = Name$(30), Vorname$(30), Gehalt&, Abteilung$(256)
Dim Personal, Mitarbeiter
WindowTitle "Personal"
Window 620, 400
Create("Text", %HWnd, "Name : ", 10, 10, 80, 25)
edit1 = Create("Edit", %HWnd, "", 100, 10, 120, 25)
Create("Text", %HWnd, "Vorname", 230, 10, 80, 25)
edit2 = Create("Edit", %HWnd, "", 310, 10, 80, 25)
Create("Text", %HWnd, "Gehalt : ", 10, 40, 80, 25)
edit3 = Create("Edit", %HWnd, "", 100, 40, 80, 25)
Create("Text", %HWnd, "Abteilung : ", 230, 40, 80, 25)
edit4 = Create("Edit", %HWnd, "", 310, 40, 250, 25)
btn1 = Create("Button", %HWnd, "Speichern", 10, 80, 70, 25)
btn2 = Create("Button", %HWnd, "Lesen", 200, 80, 60, 25)
btn3 = Create("Button", %HWnd, "Ändern", 400, 80, 80, 25)
btn4 = Create("Button", %HWnd, "Ende", 500, 80, 60, 25)
grid = Create("GridBox", %HWnd, "Namen;0;180;Vornamen;0;100;Gehälter;0;80;Abteilung;0;240", 0, 10,120, 580, 200)
ende = 0
WhileNot ende
WaitInput
If Clicked(btn1)
' speichern
With Personal
.Name$ = GetText$(edit1)
.Vorname$ = GetText$(edit2)
.Gehalt& = Val(GetText$(edit3))
.Abteilung$ = GetText$(edit4)
EndWith
If GetText$(edit1) <> ""
RPut()
Else
MessageBox("Kein Name angegeben !", "Fehler", 0)
EndIf
ElseIf Clicked(btn2)
' Lesen
RGet()
ElseIf Clicked(btn3)
' Ändern
satznr = GetCurSel(grid)
RChange(satznr)
RGet()
ElseIf Clicked(grid)
Zeile = GetString$(grid, GetCurSel(grid))
SetText edit1, SubStr$(Zeile, 1, "|")
SetText edit2, SubStr$(Zeile, 2, "|")
SetText edit3, SubStr$(Zeile, 3, "|")
SetText edit4, SubStr$(Zeile, 4, "|")
ElseIf Clicked(btn4)
ende = 1
EndIf
Case %Key = 2 : ende = 1
EndWhile
Dispose Personal
Proc RPut
Assign #1, $ProgDir + "Mitarbeiter.dat"
OpenRW #1
Seek #1, GetFileSize(#1)
BlockWrite #1, Personal
Close #1
SetText edit1, ""
SetText edit2, ""
SetText edit3, ""
SetText edit4, ""
EndProc
Proc RGet
Declare Long size, ofset, records
Assign #1, $ProgDir + "Mitarbeiter.dat"
OpenRW #1
size = GetFileSize(#1)
ofset = 0
records = size / 323 ' siehe Struct (hier müssen die Chr$(0) der Stringvariablen mitgezählt werden). Also 3 Bytes mehr.
ClearList grid
WhileLoop 1, records
Seek #1, ofset
BlockRead(#1, Personal, 0, SizeOf(Personal))
With Personal
Zeile = .Name$ + "|" + .Vorname$ + "|" + Str$(.Gehalt&) + "|" + .Abteilung$
AddString(grid, zeile)
EndWith
Inc ofset, 323
EndWhile
Close #1
EndProc
Proc RChange
Parameters Long dsatz
Declare Long ofset, records
With Personal
.Name$ = GetText$(edit1)
.Vorname$ = GetText$(edit2)
.Gehalt& = Val(GetText$(edit3))
.Abteilung$ = GetText$(edit4)
EndWith
Assign #1, $ProgDir + "Mitarbeiter.dat"
OpenRW #1
records = GetFileSize(#1) / 323
If dsatz = 0
ofset = 0
ElseIf (dsatz > 0) And (dsatz <= records)
ofset = dsatz * 323
EndIf
Seek #1, ofset
BlockWrite #1, Personal
Close #1
EndProc
End
Alles anzeigen