Jedes gute Programm merkt sich die Grundeinstellungen beim Beenden, damit der Benutzer nicht immer alles neu auswählen muß, das soll bei Mathe-Max nicht anders sein.
Wir wollen uns merken, an welcher Stelle des Bildschirms unser Hauptfenster zuletzt war und welche Übung zuletzt aktiv war. Das wollen wir dann auch noch gleich in Abhängigkeit vom Benutzer festhalten, falls mehrere Altersklassen mit MatheMax trainieren.
Dazu müssen wir zunächst mal eine Möglichkeit schaffen, den Benutzernamen einzugeben. Wir nehmen unsere Druckerauswahl aus unserem Menü wieder raus (es ist für unser Programm sicher nur selten von Interesse) und bauen stattdessen einen Punkt "Benutzer ändern" (denn es soll auch im laufenden Programm möglich sein) mit dem Namen mnuBenutzer ein:
Private Sub mnuBenutzer_Click()
BenutzerSpeichern 'letzten Benutzer speichern
Benutzername = InputBox("Hallo, wie heißt Du?") 'Namen erfragen
Benutzername = UCase$(Left$(Benutzername, 1)) & _
LCase$(Right$(Benutzername, Len(Benutzername) - 1))
'Groß-/Kleinschreibung
Unsichtbar
'evtl vorhandene Aufgaben verschwinden lassen
BenutzerLaden
'Nachsehen ob für den Benutzer schon Daten vorhanden sind
Me.Caption = "Mathe-Max [ " & Benutzername & " ]"
'Fenstertitel anpassen
End Sub
Immer wenn der Benutzer geändert wird, sollen die Einstellungen des letzten Benutzers festgehalten werden. Dann fragen wir nach dem Namen des neuen Anwenders. Wir benutzen dazu der Einfachheit halber die Inputbox, die speziell dazu da ist, kurze Texteingaben abzufragen. Sie funktioniert ganz ähnlich wie eine MsgBox und benötigt auch keine eigene Form-Definition.
Da wir nicht sicher sein können, daß unser kleiner Benutzer schon fit in Groß-/Kleinschreibung ist, wandeln wir vorsichtshalber den ersten Buchstaben in Groß- den Rest in Kleinbuchstaben um (das muß nicht immer richtig sein, z.B. bei Hans-Jürgen geht's schief
). Damit man stets sieht, wer an der Reihe ist, blenden wir den Namen in der Titelzeile ein.
Den Benutzernamen machen wir modulweit bekannt:
Dim Benutzername As String 'aktueller Benutzername modulweit bekannt machen
Das eigentliche Laden und Speichern lagern wir in je eine Unterroutine aus, da wir diese Funktion auch beim Starten und Beenden benutzen wollen. Um Einstellungen zu speichern und wieder zu laden, bietet sich eine Ini-Datei an. Jeder von Euch hat schonmal einen Blick in eine solche Datei geworfen, der grundsätzliche Aufbau ist immer gleich:
AbschnittX und SchluesselX sind hier Platzhalter und werden durch sprechendere Bezeichnungn ersetzt. Nun könnte man solche Ini-Dateien natürlich durch simple Lese-/Schreiboperation mit Zeichenkettenverarbeitung erzeugen, das ist aber eher mühsam. Windows bietet uns für solche Standard-Ini-Dateien einige recht handliche API-Funktionen:
Schreiben in eine Ini-Datei:
Declare Function WritePrivateProfileString Lib "kernel32" _
Alias "WritePrivateProfileStringA" (ByVal lpApplicationName _
As String, ByVal lpKeyName As Any, ByVal lpString As Any, _
ByVal lpFileName As String) As Long
Lesen einer Zeichenkette aus einer Ini-Datei:
Declare Function GetPrivateProfileString Lib "kernel32" _
Alias "GetPrivateProfileStringA" (ByVal lpApplicationName _
As String, ByVal lpKeyName As Any, ByVal lpDefault As String, _
ByVal lpReturnedString As String, ByVal nSize As Long, ByVal _
lpFileName As String) As Long
Lesen eines Integerwertes aus einer Ini-Datei:
Declare Function GetPrivateProfileInt Lib "kernel32" _
Alias "GetPrivateProfileIntA" (ByVal lpApplicationName _
As String, ByVal lpKeyName As String, ByVal nDefault As _
Long, ByVal lpFileName As String) As Long
Anmerkung: Jede Declaration ist ein langer Satz (den wir natürlich auch durch Fortsetzungszeichen aufteilen können).
Die 3 Funktionen sind sehr ähnlich. Die Variablen in den Klammern haben folgende Bedeutung:
Mit diesem Wissen können wir jetzt munter drauf los speichern und lesen:
Private Sub BenutzerSpeichern()
WritePrivateProfileString Benutzername, "aktiveUebung", _
aktiveUebung, App.Path & "\MatheMax.ini"
WritePrivateProfileString Benutzername, "MaxErgebnisWert", _
Str$(MaxErgebnisWert), App.Path & "\MatheMax.ini"
WritePrivateProfileString Benutzername, "MinErgebnisWert", _
Str$(MinErgebnisWert), App.Path & "\MatheMax.ini"
WritePrivateProfileString Benutzername, "MaxFaktor", _
Str$(MaxFaktor), App.Path & "\MatheMax.ini"
End Sub
Wenn für eine private Ini-Datei kein Pfad angegeben wird, landet sie automatisch im Windows-Verzeichnis. Das wollen wir aber nicht unnötig zumüllen und geben deshalb den Pfad unserer Anwendung mit an (App.Path).
Beim Beenden des Programms soll zusätzlich die Fensterposition gespeichert werden:
Private Sub Form_Unload(Cancel As Integer)
WritePrivateProfileString "Fenster", "linkerRand", _
Str$(Me.Left), App.Path & "\MatheMax.ini"
WritePrivateProfileString "Fenster", "obererRand", _
Str$(Me.Top), App.Path & "\MatheMax.ini"
BenutzerSpeichern
End Sub
Das Laden geht genauso einfach:
Private Sub Form_Load()
Dim i As Integer
For i = 1 To 8 'rote Kugeln
Load imgKugelX(i) 'benötigte Anzahl Kugeln laden
imgKugelX(i).Left = imgKugelX(i - 1).Left + imgKugelX(i).Width * 1.2
'Kugeln positionieren
Next
For i = 1 To 8 'blaue Kugeln
Load imgKugelY(i) 'benötigte Anzahl Kugeln laden
imgKugelY(i).Left = imgKugelY(i - 1).Left + imgKugelY(i).Width * 1.2
'Kugeln positionieren
Next
Me.Left = GetPrivateProfileInt("Fenster", "linkerRand", 200, _
App.Path & "\MatheMax.ini")
Me.Top = GetPrivateProfileInt("Fenster", "obererRand", 100, _
App.Path & "\MatheMax.ini")
End Sub
Private Sub BenutzerLaden()
Dim Uebung As String, laenge As Long
Uebung = Space$(15) 'Variable initialisieren
laenge = GetPrivateProfileString(Benutzername, "aktiveUebung", _
"", Uebung, 15, App.Path & "\MatheMax.ini")
aktiveUebung = Left$(Uebung, laenge)
If aktiveUebung = "" Then
Verzoegerung 1
MsgBox "Bitte wähle eine Übung aus!", vbInformation
End If
MaxErgebnisWert = GetPrivateProfileInt(Benutzername, "MaxErgebnisWert", _
10, App.Path & "\MatheMax.ini")
MinErgebnisWert = GetPrivateProfileInt(Benutzername, "MinErgebnisWert", _
1, App.Path & "\MatheMax.ini")
MaxFaktor = GetPrivateProfileInt(Benutzername, "MaxFaktor", 10, _
App.Path & "\MatheMax.ini")
UebungWaehlen
End Sub
Eine Zeichenkettenvariable, die in einer GetPrivateProfileString benutzt wird, sollte stets vorher initialisiert werden, damit man nicht Schiffbruch erleidet. Wir füllen die Variable "Uebung" daher mit Leerzeichen (Space$()).
Beim Lesen mit GetPrivateProfileString erhalten wir als Rückgabewert die tatsächliche Länge der Zeichenkette (die kann ja unterschiedlich sein). Wir nutzen das und wandeln sie mit
aktiveUebung = Left$(Uebung, laenge)
um. Falls aktiveUebung leer ist, dann hat unser neuer Benutzer noch nicht mit MatheMax gearbeitet und wir fordern ihn mit einer MessageBox auf, eine Übung auszuwählen. Ist unser Benutzer schon bekannt, fahren wir am Ende der Prozedur gleich mit der ersten Übung fort. Ich habe dazu die Auswahl der Übung aus unserem Form_KeyPress-Ereignis ausgelagert und eine eigene Prozedur draus gemacht:
Private Sub UebungWaehlen()
Select Case aktiveUebung
Case "Zählen"
Zaehlen 'nächste Zählübung
Case "SymbAddition"
SymbAddition 'nächste symb. Addition
Case "Addition"
Addition 'nächste Addition
Case "Subtraktion"
Subtraktion 'nächste Subtraktion
Case "Multiplikation"
Multiplikation 'nächste Multplikation
Case "Division"
Division 'nächste Division
End Select
End Sub
Auch im Activate-Ereignis nehmen wir noch eine kleine Anpassung vor:
Private Sub Form_Activate()
Static gestartet As Boolean
If gestartet Then Exit Sub 'Abfrage ob schonmal gestartet
AutoRedraw = True
Me.PaintPicture picTafel.Image, (Me.ScaleWidth - picTafel.Width) _
\ 2, (Me.ScaleHeight - picTafel.Height) \ 2
AutoRedraw = False
CurrentX = 1500 'positioniert den nachfolgenden Printbefehl X-Achse
CurrentY = 2000 'positioniert den nachfolgenden Printbefehl Y-Achse
Print "Viel Spaß mit Mathe-Max!" 'druckt Text direkt auf die Form
Verzoegerung 1
mnuBenutzer_Click
Cls
gestartet = True
End Sub
Statt der MessageBox legen wir gleich mit der ersten Übung los (mnuBenutzer_Click).
Unsere MatheMax.ini könnte dann nach einem Lauf so aussehen:
Das war's jetzt aber auch. Verwirrt
? Guckt's Euch Schritt für Schritt an...
Copyright © 1998-2010 J.Behling
Weitergabe und Druck (auch in Teilen, mit Ausnahme von Privatgebrauch) ohne ausdrückliche Genehmigung der Autorin untersagt.
Design ABC Webatelier