| ||||
Navigation |
Seiten-InhaltProgrammierung von Windows CE mit eVB - eine kleine HilfeIch versuche in den folgenden Abschnitten, Fragen zu klären, von denen mir des öfteren aufgefallen ist, dass diese immer wieder im Usenet gestellt werden - oder beschreibe einige "Tricks", von denen ich meine, dass sie Entwicklern helfen können, ihre Arbeit schneller und einfacher zu erledigen. Tips und Tricks, die ich kenne und für wichtig halte, habe ich hier veröffentlicht - dies ist hoffentlich für viele Einsteiger eine Hilfe. Aus Zeitgründen kann und will ich keinen Support für Microsoft und eVB-Programmierung bieten. Für andere Fragen, die auftreten verweise ich (zurück?) an Google, Google-Groups oder die einschlägigen Newsgroups (z.B. microsoft.public.windowsce.embedded.evb). Download und Installation der Win CE-EntwicklungsumgebungGrößte Hürde war hier für mich der Anfang: Welches Programm brauche ich, was kostet es und woher bekomme ich es. Es hat lange gedauert, für mich alle Fragen zu beantworten:
Interface-Design für Pocket-PCIm Rahmen meiner Diplomarbeit habe ich mich mit dem Design von ergonomischen Interfaces auf Pocket-PC beschäftigt. Teilwese stellt es - je nach zu bearbeitenden Daten - eine große Herausforderung an die Entwickler dar, übersichtliche Dialoge zu entwerfen und sich nicht in Menü- und verschachtelten Fensterstrukturen zu verlieren (das ist ähnlich, wie mit den verschachtelten Sätzen *g*). Ich stelle Interessenten meine Diplomarbeit auch als Download (2.2 MB, PDF-Datei) zur Verfügung. Um allerdings ein wenig den Überblick zu behalten, wer, wann, wo und welhalb meine Arbeit nutzt, erstelle ich individuelle Download-Links und maile diese auf Anfrage an Sie. Bitte nehmen Sie über das Kontakt-Formular Verbindung zu mir auf! Probeme mit der ActiveSync-Verbindung zur ProjektaktualisierungUm aus der Entwicklungsumgebung heraus das Projekt auf den PocketPC zu übertragen muss eine ActiveSync Verbindung bestehen. In der IDE muss nun noch das externe Gerät konfiguriert werden: Als übertragungsart muss hier nicht 'ActiveSync' sondern 'PPP' als übertragungs-Protokoll gewählt werden, damit die übertragung wir gewünscht funktioniert.
Schnellere Aktualisierung des aktuellen Projekts auf PPCDas erste Problem, dass bei mir auftauchte war, dass
ich meine geänderte Version via "Application
Install Wizzard" auf dem Pocket
PC installieren wollte. Alle erforderlichen Schritte wurden nach Test
im Emulator durchgeführt, aber trotzdem lief auf dem Pocket PC noch
die alte Version. Ist die .vb-Datei dann erstellt, so kann man durch ziemlich wilde Mausklickerei das Programm auf dem Pocket PC istallieren. Es werden durch den Wizard alle Dateien auf den PPC kopiert. Ist allerdings schon das Programm dort installiert und es soll nur durch eine neue Version ersetzt werden, so reicht es, die neue .vb-Datei mit dem Explorer o.ä. in das entsprechende Verzeichnis zu verschieben und somit die alte Version zu überschreiben. (Dies sollte auch durch ein Stapelverarbeitungsprogramm erledigt werden können. Ich weiß allerdings leider nicht, wie ich damit auf den PPC zugreifen kann. Wer dies weiß, kann mir gerne eine Lösung zukommen lassen, die ich gerne hier veröffentlichen werde.) Arbeiten mit Datenbanken und Win CEIm Usenet (z.B. in microsoft.public.windowsce.embedded.evb) wird immer wieder die Frage gestellt, wie man MS-Access Datenbankdateien in das für CE-Rechner kompatible CDB-Format konvertieren kann, um damit in der Emulationsumgebung arbeiten zu können. Warum Microsoft nicht schon längst ein simples Tool ins Netz gestellt hat, welches das komplizierte Procedere vereinfacht, ist mir unverständlich (vielleicht kann mir jemand eine Erklärung liefern?). Hier also die nötigen Schritte: Möchte man eine Access-Datenbankdatei (MDB) auf dem Pocket PC nutzen, so reicht es, mit dem Explorer (via ActiveSync) die Datei auf das 'mobile Gerät' zu kopieren. Die Konvertierung zur CDB-Datei erfolgt automatisch durch ActiveSync (wenn die Option nicht deaktiviert ist). Probleme treten erst auf, wenn man mit dem CDB-Dateien in der Emulations-Umgebung arbeiten möchte.
Datenbanken mit Windows CESQL mit Windows CEDem Programmierer wird schnell klar, dass die SQL-Version für Windows CE (ADOCE) "einigen" Beschränkungen unterliegt. Ich habe es nicht glauben wollen (und bin mir jetzt auch noch nicht wirklich sicher): Um einen Datensatz zu aktualisieren, muss man die Objektmethoden von 'Recordset' benutzen! Es ist also wohl nicht möglich mit aktTAB.Open "UPDATE Konstanten SET Wert='emil' WHERE Name='Benutzer'", aktDB einen Wert zu ändern. Statt dessen gibt es wohl nur den Workaround, der im folgenden Code-Schnipsel dargestellt wird
Dim aktDB,
' Verbindung zu Datenbank
Set aktDB = CreateObject("ADOCE.Connection.3.0")
aktDB.Open Pfad & "\Datenbank.cdb"
' aktualisiere...
Set aktTAB = CreateObject("ADOCE.Recordset.3.0")
aktTAB.Open "SELECT * FROM Konstanten WHERE Name='Benutzer'", _
aktDB, adOpenKeyset, adLockOptimistic
aktTAB.Fields("Wert") = "emil"
aktTAB.Update
aktTAB.Close
aktDB.Close
Set aktTAB = Nothing
Set aktDB = Nothing
Schade eigentlich... ACHTUNG - ACHTUNG - Speicherproblem mit CreateObjectMeine Projekte, die ich für Windows CE Pocket PCs erstellt habe, arbeiten schon mal mit Datenbanken. Dabei ist aufgefallen, dass im Laufe des Programmes immer mehr Speicher angefordert und nicht wieder freigegeben wird. Inter- und Usenet-Recherche brachte mich zu dem Ergebnis, dass es ein Speicher-Leck bei der Arbeit mit Datenbanken gibt. Problem ist wohl, dass obige CreateObject-Funktion oder ...=Nothing-Zuweisungen nicht richtig arbeiten - also bei einer neuen CreateObject-Aktion wieder neuer Speicher benutzt wird (Es erinnert ein wenig an die Speicherverwaltung von alten Windows-Versionen. Microsoft weiß um dieses Problem - behebt es aber nicht - warum? Ich weiß es nicht!! ;-) Behoben habe ich das Problem, indem ich zwei globalen Objekte aktTAB und aktDB beim Programmstart mittels CreateObject die entsprechenden Objekte zuweise und diese im ganzen Programm nutze. Erst bei Beendigung des Programmes nutze ich noch die (sinnlose??) =Nothing-Zuweisungen. Bei Programmende steht der ganze Speicher dann wieder zur Verfügung. Probleme mit der Left-Funktion und eVBViele Programmierer stolpern bei ersten (oder auch späteren) Gehversuchen darüber, dass die Left-Funktion, die die linken n Zeichen eines Strings zurückliefen soll, scheinbar nicht funktioniert. Im Usenet ist sogar manchmal die Antwort zu lesen, dass es diese Funktion für eVB nicht geben soll... Das Problem besteht darin, dass die Funktion - aus einem Dialog.Modul aufgerufen - die Left-Methode des Dialoges aufruft, die den Abstand eines Steuerelementes zu seinem übergeordneten Container zurückliefert. Zur Umgehung dieses Problems gibt es zwei Möglichkeiten:
Welche Lösung man nun benutzt ist Geschmackssache und ggf. eine Geschwindigkeitsfrage (die ich aber noch nicht untersucht habe). Grafiken als Hintergrund eines FormsIrgendwann brauchte ich dieses Feature und konnte einfach nicht ergründen, wo das Problem liegt: Eine Anfrage im Usenet brachte mir zwei Vorschläge, von denen nur der zweite bei mir geholfen hat:
Sanduhr darstellen (Mauszeiger verändern)Um dem "Mauszeiger" unter Windows CE zu verändern, um dem Benutzer eine Wartezeit anzukündigen kann man, wie auch im Desktop PC, den Mauszeiger zu einer Sanduhr 'umschalten': Screen.MousePointer = 11 'Display hourglass Der Ursprungszustand wird durch die Zuweisung des Wertes 0 wieder hergestellt. Eigene Hilfe-Funktion mit eVBEs gibt natürlich auch die Möglichkeit eine eigene Hilfe bei den Programmen zu bieten. Das Procedere dafür erfordert einige Schritte, die ich in den folgenden Punkten step-by-step beschreiben will. HTH
CommonHelp.HelpFile = Pfad & "\help.htm" CommonHelp.HelpContext = "shortcuts" CommonHelp.HelpCommand = cdlHelpContext CommonHelp.ShowHelp Der Aufruf der Hilfe kann dann jeweils mit der Funktion "ShowHelp" realisiert werden. Da ich noch nicht herausgefunden habe, wie die Darstellung des "?" in der Menueleiste zu aktivieren ist, habe ich in ein Menue einfach den Punkt Hilfe eingebaut und rufe dann die genannte Funktion auf. Naja - sogar bei Microsoft gibt's was dazu - hier wird auch das Format der Hilfe-Dateien beschrieben. Dialog abbrechenDa ich noch keine Lösung gefunden habe, wie man in eVB 3.0 einen
Cancel-Button neben den OK-Button einfügt,
habe ich eine Idee zugetragen bekommen. Total simpel aber sehr effektiv: Public Function Init_Menu(frm As Form) Dim mnuDialog As MenuBarLib.MenuBarMenu Set mnuDialog = frm.MyMenuBar.Controls.AddMenu("Dialog", "mnuDialog") mnuDialog.Items.Add 1, "mnuOK", "Ok" mnuDialog.Items.Add 2, "mnuCancel", "Abbrechen" End Function Vorher muss in jedes der betreffenden Formulare ein Objekt vom Typ Menubar eingefügt werden (dieses muss erst über [Project][Components] in die Palette der Objekte eingefügt werden). Die Aktionen werden nun durch die Methode MenuClick des MenuBars bearbeitet. (Dank an Jean-Louis) ComboBoxes (Kombinationsfelder) mit eigenen Werten füllenAls Access-Programmierer bin ich es gewohnt, Kombinationsfelder
mit Tabelleninhalten oder Wertelisten zur Designphase zu füllen.
In eVB ist dies so einfach nicht möglich. Ich habe eine Funktion
erstellt, die aus dem Tag-Feld (durch ; getrennte) Wertelisten in die
ComboBox als Auswahlelemente einfügt.
Public Function Set_List_Values(CB As Control)
' fügt die Einträge des ComboBox.Tag-Datenfeldes, die durch ';'
' getrennt sind in die Liste ein (Datenfeld endet mit ';' !!)
' (Vorgabe wird erstes Element, wenn 'CB.Text' leer und ungleich ';')
If (CB.ListCount > 0) Then Exit Function ' nur bei erstem Öffnen des Forms
Dim i As Integer
Dim Text As String: Text = ""
CB.Visible = False ' beschleunigt Aktualisierung ?!! :-))
For i = 1 To Len(CB.Tag)
Select Case Mid(CB.Tag, i, 1)
Case ";":
CB.AddItem (Text)
Text = ""
Case Else:
Text = Text & Mid(CB.Tag, i, 1)
End Select
Next i
If ((Len(CB.Text) = 0) And (CB.Text <> ";")) Then CB.Text = CB.List(0)
If (CB.Text = ";") Then CB.Text = ""
CB.Visible = True
End Function
Eine zweite Funktion füllt das Kombinationsfeld mit den Inhalten einer einspaltigen Abfrage auf eine Tabelle: Doppelte Einträge in der Tabelle werden nicht in das Kombinationsfeld eingefügt ("mein eigenes
Public Function SetData(DB As String, ctl As Control,
table As String, feld_name As String)
' liest das Tabellen-Feld 'feld_name' aus Tabelle 'table' der Datenbank 'DB'
' und fügt nicht-Duplikate in Steuerelement 'CB' (ComboBox) ein
On Error Resume Next
ctl.Visible = False
Screen.MousePointer = 11 'Display hourglass
Dim aktDB, aktTAB
Dim newVal As String, i As Integer, contained As Boolean
Set aktDB = CreateObject("ADOCE.Connection.3.0")
aktDB.Open DB
If Err Then MsgBox "1 - " & Err.Description
Set aktTAB = CreateObject("ADOCE.Recordset.3.0")
aktTAB.Open table, aktDB, adOpenKeyset, adLockOptimistic
If Err Then MsgBox "2 - " & Err.Description
If (aktTAB.RecordCount > 0) Then
Do While Not aktTAB.EOF
newVal = aktTAB.Fields(feld_name).Value
If Err Then MsgBox "3 - " & Err.Description
contained = False
For i = 0 To ctl.ListCount - 1 ' überprüfe, ob Eintrag schon vorhanden
If (newVal = ctl.List(i)) Then
contained = True
Exit For
End If
Next i
If Not contained Then ctl.AddItem newVal ' wenn nicht -> einfügen
aktTAB.MoveNext
Loop
End If
aktTAB.Close
Set aktTAB = Nothing
aktDB.Close
Set aktDB = Nothing
Screen.MousePointer = 0 'Hide hourglass
ctl.Visible = True
End Function
Hilfreiche Sites, die auch noch weitere Hilfen, Programme etc. bietenletzte Änderung:
18.Sep 2005
|
rechte SpalteFelicitas-FernsehserviceEin E-Mail-Dienst, der Ihnen täglich eine Auswahl des TV-Programms zusendet, das anhand einer individuellen Suchwortliste erstellt wurde.Klicken Sie hier. | ||
|
© Peter Prieß - 2007 |
| ||