Vielleicht als Fortsetzung zu meinem Kurs, basierend auf dem letzten Programm.
Man gerät ja mit einfachen Textdateien als Datenbank schnell an die Grenzen. Nicht wegen der Menge Datensätze, sondern vielmehr, wenn es um zugehörige Listen zu einem Datensatz geht. Hier mal ein Code für Anfänger, der die dBase-Funktionen und ein Memo-Feld benutzt.
Declare btn1&, btn2&, btn3&, btn4&, btn5&, edit1&, edit2&, edit3&, edit4&, grid&, ME&, ende&, item&, knopf&, hpic&
Declare datei$, spalten$, eintrag$
Declare anzahl%, ds&
WindowTitle "Adressen"
Window 1000, 500
datei$ = $ProgDir + "Adressen.dbf"
'Menü anlegen
PopUp "&Datei"
AppendMenu 200,"&Über"
AppendMenu 201,"&Ende"
spalten$ = "Nr.;0;40;Name;0;140;Voranme;0;140;Straße;0;140;Ort;0;160"
btn1& = Create("Button", %HWnd, "Ende", 10, 10, 60, 25)
btn3& = Create("Button", %HWnd, "Speichern", 100, 10, 80, 25)
btn4& = Create("Button", %HWnd, "Löschen", 200, 10, 80, 25)
btn5& = Create("Button", %HWnd, "Ändern", 300, 10, 60, 25)
Create("Text", %HWnd, "Name :", 10, 60, 60, 25)
edit1& = Create("Edit", %HWnd, "", 75, 60, 180, 25)
Create("Text", %HWnd, "Vorname :", 300, 60, 80, 25)
edit2& = Create("Edit", %HWnd, "", 385, 60, 120, 25)
Create("Text", %HWnd, "Straße :", 10, 100, 60, 25)
edit3& = Create("Edit", %HWnd, "", 75, 100, 180, 25)
Create("Text", %HWnd, "Ort :", 300, 100, 60, 25)
edit4& = Create("Edit", %HWnd, "", 385, 100, 240, 25)
grid& = Create("Gridbox", %HWnd, spalten$, 1, 10, 150, 630, 200)
DrawText 670, 130, "HOBBYS"
ME& = Create("MultiEdit", %HWnd, "", 650, 150, 300, 200)
ende& = 0
UseIcon "A" ' Das schönere Profan-Icon als Fenstersymbol verwenden
UserMessages $10 ' Zum Abfragen des Schließen-Kreuz (wm_close).
ZeichneLogo()
' Oder mit DrawPic bildname$, 700, 10; 0 externe Bild - Datei anzeigen
IfNot FileExists(datei$)
Assign #1, $ProgDir + "ARESSEN.STR"
Rewrite #1
Print #1, "NAME; C; 30; 0"
Print #1, "VORNAME; C; 30; 0"
Print #1, "STRASSE; C; 30; 0"
Print #1, "PLZ_ORT; C; 30; 0"
Print #1, "NOTIZ; M; 10; 0"
Close #1
DB("Create", $ProgDir + "ARESSEN.STR", $ProgDir + "ADRESSEN.DBF")
anzahl% = DB("Open", #1, datei$)
DB("Use", #1)
MessageBox("Neue Datenbank erzeugt !", "Info", 0)
Else
anzahl% = DB("Open", #1, datei$)
DB("Use", #1)
Laden()
EndIf
WhileNot ende&
WaitInput
If Clicked(btn1&) OR (%UMessage = $10) OR MenuItem(201)
Ende()
ElseIf Clicked(btn3&)
' Speichern
Speichern()
ElseIf Clicked(btn4&)
' Löschen
knopf& = MessageBox("Sind Sie wirklich sicher ?", "Datensatz löschen", 292)
If knopf& = 6
item& = GetCurSel(grid&)
If item& > -1
Loeschen(item&)
EndIf
EndIf
ElseIf Clicked(btn5&)
' Datensatz ändern
Aendern()
ElseIf Clicked(grid&)
' Gridbox geklickt
item& = GetCurSel(grid&) ' Nummer des geklicken Eintrag holen
If item& > -1 ' nur, wenn richtig auf einen Eintrag geklickt wurde und item& einen Wert > 0 hat (1. Eintrag hat die Nummer 0).
eintrag$ = GetString$(grid&, item&) ' Geklickten Eintrag in String setzen
SetzeEdits(eintrag$)
EndIf
EndIf
If MenuItem(200)
MessageBox("Ich bin der Autor !", "INFO", 35)
EndIf
EndWhile
Proc Laden
Declare zeile$
ClearList grid&
If anzahl% > 0
DB("Go", "|<")
WhileNot %dbEOF
zeile$ = Str$(&dbRecNo) + "|" + DB("Get", "NAME") + "|" + DB("Get", "VORNAME") + "|" + DB("Get", "STRASSE") + "|" + DB("Get", "PLZ_ORT")
AddString(grid&, zeile$)
DB("Go", ">")
EndWhile
MessageBox(Str$(&dbRecCount) + " Datensätze geladen !", "Info", 0)
EndIf
EndProc
Proc Speichern
If GetText$(Edit1&) <> ""
ds& = db("AppendBlank")
db("Put", "NAME", GetText$(Edit1&))
db("Put", "VORNAME", GetText$(Edit2&))
db("Put", "STRASSE", GetText$(Edit3&))
db("Put", "PLZ_ORT", GetText$(Edit4&))
If GetText$(ME&) <> "" ' bei XProfan : GetCount(ME&) > 0
ClearList
MoveHandleToList(ME&) ' bei XProfan : Move("HandleToList", ME&)
DB("PutMemo", "NOTIZ")
ClearList ME&
Else
ClearList
AddString(0, " ")
DB("PutMemo", "NOTIZ")
EndIf
db("PutRec", 0)
AddString(grid&, Str$(ds&) + "|" + GetText$(Edit1&) + "|" + GetText$(Edit2&) + "|" + GetText$(Edit3&) + "|" + GetText$(Edit4&))
MessageBox("Datensatz gespeichert !", "Info", 0)
Else
MessageBox("Keinen Namen angegeben !", "Info", 0)
EndIf
EndProc
Proc Aendern
Declare pos&, zeile$, datensatz&
pos& = GetCurSel(grid&)
zeile$ = GetString$(grid&, pos&)
datensatz& = Val(SubStr$(zeile$, 1, "|"))
SetText grid&, pos&, 1, GetText$(Edit1&)
SetText grid&, pos&, 2, GetText$(Edit2&)
SetText grid&, pos&, 3, GetText$(Edit3&)
SetText grid&, pos&, 4, GetText$(Edit4&)
DB("Go", datensatz&)
db("Put", "NAME", GetText$(Edit1&))
db("Put", "VORNAME", GetText$(Edit2&))
db("Put", "STRASSE", GetText$(Edit3&))
db("Put", "PLZ_ORT", GetText$(Edit4&))
ClearList
MoveHandleToList(ME&)
DB("PutMemo", "NOTIZ") ' Bei XProfan : Move("HandleToList", ME&)
db("PutRec", datensatz&)
EndProc
Proc SetzeEdits
Parameters zeile$
Declare satz&
satz& = Val(SubStr$(zeile$, 1, "|"))
ClearList
ClearList ME&
DB("Go", satz&)
DB("GetMemo", "NOTIZ")
' bei XProfan : Move("ListToHandle", ME&)
MoveListToHandle(ME&)
SetText edit1&, SubStr$(zeile$, 2, "|")
SetText edit2&, SubStr$(zeile$, 3, "|")
SetText edit3&, SubStr$(zeile$, 4, "|")
SetText edit4&, SubStr$(zeile$, 5, "|")
EndProc
Proc Loeschen
Parameters pos&
Declare datensatz&, zeile$
If pos& > -1
zeile$ = GetString$(grid&, pos&)
datensatz& = Val(SubStr$(zeile$, 1, "|"))
DB("Go", datensatz&)
DB("Delete")
DB("Pack")
Laden()
EndIf
EndProc
Proc Ende
knopf& = MessageBox("Willst du wirklich beenden ?", "Frage", 35)
If Knopf& = 6 ' Ja-Button gedrückt
' Speichern() ' wenn man möchte
ende& = 1 ' ende& wird wahr und somit die Schleife verlassen.
EndIf
EndProc
Proc ZeichneLogo
MCLS 200, 100, RGB(0, 255, 0)
StartPaint - 1
DrawText 50, 20, "Hier könnte ihr"
DrawText 50, 50, "Logo stehen !"
EndPaint
hpic& = Create("hPic", 0, "&MEMBMP")
DrawPic hpic&, 700, 10; 0 ' statt hpic& kann man auch den Namen einer Bilddatei angeben.
EndProc
DB("Close", #1)
End
Alles anzeigen