Microsoft Foundation Classes (Desktop)

Mein erster Versuch mit „CMFCMaskedEdit“

Ich habe gerade ein kleines Projekt bei dem ich mich endlich mal ausgiebig mit den neuen MFC Klassen des Visual C++ 2008 Feature Pack beschäftigen kann.
Unter anderem brauche ich die Möglichkeit einer Versionsnummerneingabe. Dazu wollte ich das "CMFCMaskedEdit" Control verwenden.
Im Prinzip ist es ein normales EDIT Control bei dem man einen Eingabefilter setzen kann um ein bestimmtes Format zu erhalten. Wer es sich mal anschauen möchte findet im "NewControls" Sample des Feature Pack Beispielscodes ein Projekt bei dem es in unterschiedlichen Varianten verwendet wird.
Bei den Versionsnummern handel es sich um vier einstellige Dezimalzahlen die jeweils mit einem "." getrennt sind. Beispielsweise"1.2.3.4". So etwas wie "1.2.3.99" gib es also nicht.
In der jeweiligen Dialogfeldklasse muss man dann jeweils eine Membervariable für das Steuerelement erstellen. Leider geht das nicht über den Assistenten, dieser bietet uns nur CEdit an. Das nehmen wir dann aber einfach und nachdem der Assistent fertig ist überschreiben wir in der Header Datei einfach das CEdit mit CMFCMaskedEdit.
Dann müssen wir das Format definieren.
 

m_edtMinVersion.EnableMask("D D D D","_._._._");

Der erste Parameter gib die Maske an welche Zeichen an welcher Position erlaubt sind. "D" steht für Zahlen.

Der zweite Parameter gibt das Format der Eingabe an. Die "_" stehen dabei als Platzhalter für die einzugebenen Daten.

Faul wie man als Entwickler nun mal häufig ist habe ich erst gar nicht die MSDN Dokumentation gelesen sondern mich einfach an das "NewControls" Sample gehalten.

Dort wird noch die Funktion "SetValidChars" aufgerufen. Ich habe meinen Code noch um den Aufruf ergänzt und schon mal per SetWindowText einen Default Wert angegeben.

Der Code war dann also wie folgt:

m_edtMinVersion.EnableMask(

"D D D D","_._._._");

m_edtMinVersion.SetValidChars(

"123456789");

m_edtMinVersion.SetWindowText(

"3.0.6.3");

Und siehe da: Nichts geht. Der Text wird nicht vorbelegt und die Eingabe funktioniert auch nicht richtig.

Kurz den Code überflogen und habe mir dann überlegt das ich evtl. noch den "." und das "_" als erlaubtes Zeichen setzen müsste, das hat aber auch nichts gebracht.

Da aber auch ein blindes Huhn mal ein Korn findet ist mir dann doch noch aufgefallen das eigentlich auch eine "0" erlaubt werden müsste. Siehe da, schon klappte es.

Beim weiteren rumspielen ist mir dann noch aufgefallen das ich auf die "SetValidChars" Funktion auch hätte komplett verzichten können, das die Maske des Controls das auch schon automatisch regelt. Ein "D" steht auch wirklich nur für eine Zahl, das bedeutet mehr kann man auch wirklich nicht eingeben.

Das ganze hat mich zwar nur ein paar Minuten gekostet, aber beim nächsten Control lese ich erst wieder die Dokumentation.

 

– Patrick

Windows Mobile

Ein Windows Mobile ABC: D wie Datenbank

Irgendwann stellt man sich in seiner Anwendung bestimmt mal die Frage: Wohin mit meinen Daten?

Wenn man damit nur die Einstellungen der Anwendung meint kann man die ganz unbedenklich in der Registry oder einer Konfigurations-Datei abspeichern. Wobei Konfigurations-Dateien hier auch schon wieder komplizierter werden können, da es ja leider keine API (Zu mindestens von Haus aus…) für die gute alte INI Datei mehr gibt. Kleine Konfigurations-Strukturen könnten da ziemlich einfach als BLOB in eine Datei geschrieben werden, wenn es jedoch etwas mehr wird muss mich sich schon um andere Formate wie XML Gedanken machen.

Was jedoch wenn man eine größere Menge Strukturierter Daten wie beispielsweise Kundendatensätze, Produktlisten oder Auftragsdaten speichern muss? Auf der Desktopseite würden hier sicherlich viele zu einer Datenbank greifen, warum also nicht auch auf Windows Mobile?

Generell haben wir da im nativen Code zwei Möglichkeiten die uns mitgeliefert werden.

Zum einfachen und schnellen lesen und schreiben von Objekten steht uns die lineare EDB Datenbank zur Verfügung.

Die dementsprechende Dokumentation dazu gibt es im SDK beziehungsweise auch Online im MSDN unter http://msdn.microsoft.com/en-us/library/aa912277.aspx .

Ein kleines Sample liefert das Windows Mobile 6 SDK gleich auch noch mit:

„%PROGRAM FILES% Windows Mobile 6 SDKSamplesCommonCPPWin32FileDB”

Wer jedoch eine relationale Datenbank haben möchte kann hier auf den Microsoft SQL Server Compact zurückgreifen.

Der SQL Server Compact ist zwar weitaus umfangreicher als eine EDB Datenbank, dafür aber auch weitaus mächtiger.

Sie unterstützt unter anderen SQL Befehle, Datenbank Replikation und Synchronisation.

Mal ganz abgesehen davon das Sie nicht nur unter Windows Mobile, sondern auch auf nahezu jeder anderen Windows Plattform läuft!

Genau wie EDB ist der SQL Server Compact bei Windows Mobile 6 Geräten bereits im ROM enthalten was uns das Deployment erspart.

Die Dokumentation dazu befindet sich natürlich Online im MSDN unter http://msdn.microsoft.com/en-us/library/ms174516.aspx .

Und hier findet man auch noch ein Codesample dazu: http://technet.microsoft.com/en-us/library/ms173261.aspx .

Weiter Informationen zu SQL Server Compact findet man auch in João Paulo Figueiras Blog, der generell immer Lesenswert ist: http://nativemobile.blogspot.com/.

Wer übrigens auf der Desktopseite noch nach einer mitgelieferte Datenbank sucht sollte sich mal die „Extensible Storage Engine“ unter http://msdn.microsoft.com/en-us/library/ms684493(VS.85).aspx anschauen!

– Patrick