⟵ zur Projektübericht

Motivation

Der ADFC-Stormarn e.V. verwendet Klebeetiketten zur Codierung von Fahrrädern.

EIN-Code Etikett

Auf diesen Etiketten ist ein EIN-Code (Eigentümer-Identifizierungs-Nummer) aufgedruckt, die es der Polizei, den Fundbüros und dem ADFC erlauben, den Eigentümer eines Fahrrads zu ermitteln. Eine über aufgeklebte Etikett angebrachte Plombierfolie schützt dieses vor dem Ablösen.

ADFC EIN-Code-Etikett aufgeklebt

Dieses Verfahren eignet sich auch für andere Gegenstände, wie Kameras, Fahrrad-Akkus, Kinderwagen, Pferdesättel, etc.

Die Codier-Aktionen finden häufig j.w.d. statt und nicht immer gibt es dort einen verlässlichen Zugang zum Internet. Die Daten zur Generierung der EIN-Codes werden deshalb in einer lokal zur Verfügung stehenden SQLite-Datenbank abgelegt.

Diese Seite beschreibt den Hauptbildschirm Screen1 für die Code-Generierung.


Hauptbildschirm Screen1: Code-Generierung

Implementierung

Entwurf

Referenz

ToDo

Vom Ablauf unabhängige Funktionen

Standby-Steuerung (1)

Weitere Funktionen (2)

Druckerauswahl (3) & Anzahl Etiketten (4)

Löschen aller Eingaben (5)


Hauptbildschirm Screen1: Code-Generierung

Der Kopf des Dialogbildschirms wird von einer Aktionsleiste gebildet. Deren Implementierung und Funktion ist im Kapitel ActionBar beschrieben. Die Funktionen zum Etikettendrucken sind im Kapitel Klebeetikett drucken dokumentiert.

Screenshot Screen1: Startdialog Code-Generierung, Ortseingabe
Startdialog Code-Generierung
Erfassung des Ortsnamen
  Screenshot Screen1: Efassung des Straßennamen
Erfassung des Straßennamen
  Screenshot Screen1: Erfassung der Hausnummer und der Initialen
Erfassung der Hausnummer und
der Initialen
  Screenshot Screen1: Komplett generierter EIN-Code mit Bar-Code
Komplett generierter EIN-Code
mit Barcode

Die Erfassung der Adressdaten erfolgt in mehreren Stufen: Eingabe des Ortsnamens, des Straßennamens der Hausnummer und der Initialen. Der Orts- und der Straßenname wird gegen eine Datenbank geprüft, bzw. kann aus der Datenbank selektiert werden. Der zugehörige EIN-Code wird nach jeder Eingabe aktualisiert. Der Barcode wird erst dann angezeigt, wenn die Adresserfassung vollständig ist.

Implementierung

Entwurf

Entwurf des Hauptbildschirms Screen1nicht alle Felder sind von Beginn an sichtbar. Sie werden im Laufe der Adresserfassung an- und abgeschaltet.

Wegen des großen Funktionsumfangs, ist die Block-Struktur recht unübersichtlich. In der folgenden Beschreibung der einzelnen Funktionen werden die Positionen der zugehörigen Blöcke markiert.

Referenz

Typ Name Bedeutung Referenzierung
Global ActiveButtonColor Hintergrundfarbe aktive Schaltflächen. Get: Procedure SetDialogElements
Global Checksum Ergebnis der Checksummenberechnung für den Barcode (Code-128) Get: Procedure ComputeChecksum
Get: Procedure ComputeCode
Set: Procedure ComputeChecksum
Global CurrentState Gibt den aktuellen Zustand wieder. Einer der Konstanten StateInputGemeinde, StateInputStraße oder StateInputHausNr. Siehe auch SetDialogElements. Set: Procedure SetDialogElements
Global Gemeinde Name der aktuell selektierten Gemeinde. Get: Event ActionBar.MenuItemSelected
Get: Event cmdOnlineRequest.Click
Get: Procedure FillGemeindeListe
Set: Procedure AfterSelectGemeinde
Set: Procedure FillGemeindeListe
Set: Procedure Reset
Global GemeindeID Interne Datenbank-ID der aktuell selektierten Gemeinde. Get: Procedure AfterSelectGemeinde
Get: Procedure FillStraßenListe
Set: Procedure AfterSelectGemeinde
Set: Procedure Reset
Global GemeindeSchlüssel Gemeindeschlüssel der aktuell selektierten Gemeinde oder "xxx". Get: Function CodeIsNotComplete
Get: Function getCode
Get: Procedure ComputeCode
Set: Procedure AfterSelectGemeinde
Set: Procedure Reset
Global Hausnummer Aktuell erfasste Hausnummer oder "xxx". Get: Function CodeIsNotComplete
Get: Function getCode
Get: Procedure ComputeCode
Set: Event cmdDelHausNr.Click
Set: Event cmdDelStraße.Click
Set: Event tbHausNr.TextChanged
Set: Procedure Reset
Global InactiveButtonColor Hintergrundfarbe gesperrte Schaltflächen. Get: Procedure SetDialogElements
Global InactiveButtonTextColor Tetxtfarbe gesperrte Schaltflächen. Get: Procedure SetDialogElements
Global Initialen Aktuell erfasste Initialen oder "xx". Get: Function CodeIsNotComplete
Get: Function getCode
Get: Procedure ComputeCode
Set: Event cmdDelHausNr.Click
Set: Event cmdDelInitials.Click
Set: Event cmdDelStraße.Click
Set: Event tbInitialen.TextChanged
Set: Procedure Reset
Global Jahr Aktuelle Jahreszahl, zweistellig. Get: Function getCode
Get: Procedure ComputeCode
Set: Event Screen1.Initialize
Global Kfz Aktuell ermitteltes Kfz-Kennzeichen oder "xx". Get: Function CodeIsNotComplete
Get: Function getCode
Get: Procedure ComputeCode
Set: Procedure AfterSelectGemeinde
Set: Procedure Reset
Global PrintCount Anzahl am aktuellen Tag gedruckte Etiketten. Get: Event Pte560.AfterDataPrinted
Get: Event Screen1.Initialize
Get: Event Screen1.OtherScreenClosed
Set: Event Pte560.AfterDataPrinted
Set: Event Screen1.Initialize
Set: Event Screen1.OtherScreenClosed
Global StateInputGemeinde Konstante als Argument für Prozedur SetDialogElements. Get: Event Screen1.Initialize
Get: Procedure Reset
Get: Procedure SetDialogElements
Global StateInputHausNr Konstante als Argument für Prozedur SetDialogElements. Get: Procedure AfterSelectStrasse
Get: Procedure SetDialogElements
Global StateInputStraße Konstante als Argument für Prozedur SetDialogElements. Get: Event cmdDelStraße.Click
Get: Procedure AfterSelectGemeinde
Get: Procedure SetDialogElements
Global Strasse Name der aktuell selektierten Straße. Get: Event ActionBar.MenuItemSelected
Get: Event cmdOnlineRequest.Click
Get: Procedure FillStraßenListe
Set: Event cmdDelStraße.Click
Set: Procedure AfterSelectStrasse
Set: Procedure FillStraßenListe
Set: Procedure Reset
Global StrasseID Interne Datenbank-ID der aktuell selektierten Straße. Get: Procedure AfterSelectStrasse
Set: Event cmdDelStraße.Click
Set: Procedure AfterSelectStrasse
Set: Procedure Reset
Global StrassenSchlüssel Straßenschlüssel der aktuell selektierten Straße oder "xxxxx". Get: Function CodeIsNotComplete
Get: Function getCode
Get: Procedure ComputeCode
Set: Event cmdDelStraße.Click
Set: Procedure AfterSelectStrasse
Set: Procedure Reset
Global Today Tagesdatum im Format "yyyy-MM-dd" zum Zugriff auf eine TinyDB. Get: Event Pte560.AfterDataPrinted
Get: Event Screen1.Initialize
Get: Event Screen1.OtherScreenClosed
Set: Event Screen1.Initialize
Global WakeLock Gibt an, ob aktuell ein WakeLock gesetzt ist. Get: Event ActionBar.Button1Click
Set: Event ActionBar.Button1Click
Funktion CodeIsNotComplete Ermittelt, ob alle Felder für die Codegenerierung erfasst wurden. Call: Event cmdPrint.Click
Call: Procedure ComputeCode
Funktion FormatHausNr Formatiert die Hausnummer auf drei Stellen mit führenden Nullen. Call: Event tbHausNr.TextChanged
Funktion getCode Liefert den EIN-Code. Call: Event Util.DelayedEvent
Call: Procedure ComputeCode
Funktion getGemeindeID Ermittelt die interne Datenbank-ID der in der ListView listGemeinde selektierten Gemeinde. Call: Event listGemeinden.AfterPicking
Call: Procedure AfterSelectGemeinde
Funktion getSrassenID Ermittelt die interne Datenbank-ID der in der ListView listStrasse selektierten Straße. Call: Event listStrassen.AfterPicking
Call: Procedure AfterSelectStrasse
Prozedur AfterSelectGemeinde Wertet die erfasste Gemeinde aus und bereitet die Erfassung der Straße vor (s. ToDo). Call: Event listGemeinden.AfterPicking
Call: Procedure FillGemeindeListe
Prozedur AfterSelectStrasse Wertet die erfasste Starße aus und bereitet die Erfassung der Hausnummer vor (s. ToDo). Call: Event listStrassen.AfterPicking
Call: Procedure FillStraßenListe
Prozedur CheckPrinters Prüft, ob nur ein Drucker gekoppelt ist und schlägt diesen zur Verwendung vor. Call: Event Screen1.Initialize
Call: Event Screen1.PermissionGranted
Prozedur ComputeChecksum Berechnet die Checksumme für den Barcode (Code-128). Call: Procedure ComputeCode
Prozedur ComputeCode

Berechnet den EIN-Code mir Leerzeichen zwischen den Elementen. Falls alle Daten vorliegen:

  • berechnet den Barcode und zeigt ihn an
  • gibt die Schaltfläche zum Drucken (cmdPrint) frei
  • gibt die Schaltfläche zum Öffne von Screen  BarCode frei (cmdExpand)
Call: Event cmdDelHausNr.Click
Call: Event cmdDelInitials.Click
Call: Event cmdDelStraße.Click
Call: Event tbHausNr.TextChanged
Call: Event tbInitialen.TextChanged
Call: Procedure AfterSelectGemeinde
Call: Procedure AfterSelectStrasse
Prozedur FillGemeindeListe Füllt das ListView listGemeinden mit den Gemeindenamen, die mit der Zeichenfolge beginnt, wie sie Global Gemeinde hinterlegt ist. Call: Event Screen1.Initialize
Call: Event tbGemeinde.TextChanged
PProzedur FillStraßenListe Füllt das ListView listStrassen mit den Straßennamen, die mit der Zeichenfolge beginnt, wie sie Global Strasse hinterlegt ist. Call: Event tbStrasse.TextChanged
Call: Procedure AfterSelectGemeinde
PProzedur kbNext Den ActionButton der Tastatur für die TextBox tbHausNr auf "weiter" einstellen. Call: Procedure Reset
Prozedur kbNone Den ActionButton der Tastatur für das Feld Initialen auf "keine Funktion" einstellen. Call: Procedure Reset
Prozedur RequestBTPermissions Fordert bei Android die Erlaubnis zur Benutzung der Bluetooth-Funktionen an./td> Call: Event Screen1.Initialize
PProzedur Reset Versetzt die Eingabe- und Anzeigeelemente in den Grundzustand (s. ToDo). Call: Event cmdDelGemeinde.Click
Call: Event Screen1.Initialize
PProzedur SetDialogElements Bereit die Eingabe- und Anzeigeelemente für die verschiedenen Erfassungszustände auf (s. ToDo). Call: Event cmdDelStraße.Click
Call: Event Screen1.Initialize
Call: Procedure AfterSelectGemeinde
Call: Procedure AfterSelectStrasse
Call: Procedure Reset
Event ActionBar.Button1Click
Event ActionBar.MenuItem1Selected
Event ActionBar.MenuItemSelected
Event cmdDelGemeinde.Click
Event cmdDelHausNr.Click
Event cmdDelInitials.Click
Event cmdDelStraße.Click
Event cmdExpand.Click
Event cmdOnlineRequest.Click
Event cmdPrint.Click
Event KeyboardControl.ActionButtonClicked
Event listGemeinden.AfterPicking
Event listStrassen.AfterPicking
Event pickPrinter.AfterPicking
Event pickPrinter.BeforePicking
Event Pte560.AfterDataPrinted
Event Screen1.BackPressed
Event Screen1.ErrorOccurred
Event Screen1.Initialize
Event Screen1.OtherScreenClosed
Event Screen1.PermissionDenied
Event Screen1.PermissionGranted
Event SQLiteEIN.SQLError
Event tbGemeinde.TextChanged
Event tbHausNr.TextChanged
Event tbInitialen.TextChanged
Event tbStrasse.TextChanged
Event Util.DelayedEvent

ToDo

Vom Ablauf unabhängige Funktionen

Screenshot Screen1: Startdialog Code-Generierung, Ortseingabe

Standby-Steuerung (1)

Wenn das gerät eine Weile nicht benutzt wird, schaltet Android normalerweise das Gerät aus. Um es wieder zu aktivieren, muss man sich neu anmelden. Das ist besonders dann störend, wenn das Gerät von mehreren Personen benutzt wird. Dann muss entweder die Pin weiter gegeben werden oder der Eigentümer des Geräts zum erneuten Anmelden verfügbar sein.

Über die Extension UrsAI2KeepAwake wird ein ScreenDimWakeLock gesetzt, der das Wechseln in den Standby-Modus verhindert, es aber erlaubt, dass Android das Gerät zur Akkuschonung abdunkeln darf. Bei der Initialisierung von Screen1 wird bereits ein ScreenDimWakeLock als Voreinstellung gesetzt. Über den AktionButton1 der ActionBar kann der WakeLock gelöscht oder neu gesetzt werden:

Screen1: Actionbar.Button1Click-Ereignis

Ein gesetzter WakeLock wird durch das Symbol visibility_on in der AktionBar angezeigt. Wenn kein WakeLock gesetzt ist wechselt das Symbol auf visibility_off.

Zugehörige Code-Blöcke: Position der Funktionsblöcke: Standby (1)

Weitere Funktionen (2)

Der Aufruf weiterer Funktionsdialoge erfolgt über das Menü der Actionbar:

Screen1: ActionMenu, Weitere Funktionen

Beim Initialisieren des Screens wird das Menü aufgebaut:

Screen1: Initalisierung des ActionMenü

Wird ein Menüpunkt angetippt, wird das Ereignis ActionBar.MenuItemSelected ausgelöst. Der zugehörige Funktionsdialog wird geöffnet. Wenn die Funktion Online-Abfrage gestartet werden soll, werden die bereits erfassten Daten als Liste zusammengestellt und dem Dialog als Startwert zur Verfügung gestellt.

Screen1: Actionmenü, Starten der Funktionsdialoge

Zugehörige Code-Blöcke: Position der Funktionsblöcke: Weitere Funktionen (2)

Druckerauswahl (3) & Anzahl Etiketten (4)

Die Funktionen sind auf der Seite EIN-Code: Drucken beschrieben.

Zugehörige Code-Blöcke: Position der Funktionsblöcke: Druckerauswahl (3) & Anzahl Etiketten (4)

Löschen aller Eingaben (5)

Die Schaltfläche

Zugehörige Code-Blöcke: Position der Funktionsblöcke: Löschen aller Eingaben (5)