30/03/2023
Introduktion til Barcode Scanning med Delphi
I en verden, hvor den fysiske og digitale verden smelter mere og mere sammen, er QR-koder og stregkoder blevet uundværlige værktøjer. De fungerer som digitale broer, der forbinder fysiske objekter eller steder med digital information. Selvom der findes utallige scanner-apps til rådighed i app-butikkerne, kan der stadig være et reelt behov for at udvikle sin egen skræddersyede løsning. Dette blogindlæg dykker ned i, hvordan man kan skabe en sådan applikation ved hjælp af Delphi og den kraftfulde ZXing-bibliotek.

Denne artikel beskriver processen med at bygge en barcode scanner-app, kaldet ScannerMApp, som er udviklet i Delphi. Applikationen benytter sig af Edward Spelts Delphi-port af det populære ZXing-bibliotek samt hans TFrameStand-komponent. Projektet er afhængigt af Delphi (version 10.2 Tokyo blev brugt) og to open source-biblioteker: ZXing og TFrameStand. Den fulde kildekode til ScannerMApp er tilgængelig på GitHub.com.
Måske undrer du dig over, hvorfor man skulle bygge sin egen scanner-app, når der findes så mange på markedet. Svaret ligger i behovet for fuld kontrol og integration. Ved at integrere et bibliotek direkte i din FMX-app (FireMonkey) opnår du flere fordele:
- Ingen tredjepartsafhængighed: Du er ikke afhængig af andre apps eller metoder til at kommunikere med dem.
- Total kontrol over scanningen: Du kan bestemme opløsning, tilføje forbehandling og få detaljeret information om fundne koder, såsom deres præcise position.
- Platformsuafhængighed: Hvis biblioteket er skrevet i 100% Delphi-kode, kan din app køre på tværs af platforme som Android, iOS, Windows, macOS og Linux.
Denne tilgang giver en mere fleksibel og integreret brugeroplevelse. Artiklen vil vise et konkret eksempel på, hvordan man strukturerer en simpel Delphi mobilapp, der tilgår enhedens sensorer (kameraet kan betragtes som en sensor), gemmer data og præsenterer dem for brugeren med en minimal brugergrænseflade.
ZXing: Det Mest Populære Java Barcode Scanning Bibliotek
ZXing (Zebra Crossing) er anerkendt som det mest populære open source-bibliotek til barcode scanning i Java. Dets succes har ført til, at det er blevet porteret til en lang række andre programmeringssprog, herunder C++, .Net C#, PHP, Objective-C, Python, JavaScript og, relevant for denne artikel, Delphi.
Takket være Edward Spelts dedikerede arbejde med at portere ZXing til Delphi, kan udviklere nu nemt drage fordel af dette kraftfulde bibliotek til at skabe cross-platform applikationer med barcode-funktionalitet. ZXing.Delphi er kendt for at være brugervenligt, hurtigt og understøtte alle større barcode-formater. Biblioteket er desuden for nylig blevet opdateret med forbedringer, der specifikt adresserer ydeevnen ved genkendelse af inverterede barcodes – en funktion, der nu kan slås til og fra for at optimere hastigheden, hvis der ikke er behov for at læse inverterede koder.
Udvikleren bag ScannerMApp udtrykker stor taknemmelighed over for Edward Spelt for hans værdifulde forslag og kodekorrektioner under udviklingsprocessen. For dem, der ønsker at dykke dybere ned i, hvordan biblioteket fungerer, anbefales det at udforske ZXing.Delphi demoerne og kildekoden til ScannerMApp på GitHub.
Anvendelsesmuligheder i ScannerMApp
ScannerMApp implementerer to primære brugsscenarier for scanning:
- Realtidsscanning fra kameraet: Enheden kamera startes med en lav opløsning. Applikationen griber hver tilgængelig billedramme, men scanner kun med intervaller på ca. 133 millisekunder (svarende til omkring 7 forsøg pr. sekund). Dette giver en balanceret tilgang mellem at fange billeder og behandle dem for barcodes.
- Scanning fra et eksisterende billede: Brugeren kan vælge et billede fra galleriet (eller filsystemet på desktop-platforme). I dette tilfælde udføres en enkelt scanning, hvilket generelt er tilstrækkeligt, da der ikke er fokusproblemer eller behov for at målrette koden.
Applikationsstruktur og Komponenter
Struktureringen af Delphi mobilapps følger ofte en bestemt arkitektur for at sikre modularitet og vedligeholdelse. ScannerMApp anvender en struktur baseret på datamoduler, en enkelt hovedform og flere frames. Brugen af TFrameStand forenkler orkestreringen af, hvordan disse frames vises for at skabe den samlede brugeroplevelse.

Her er en oversigt over de centrale komponenter:
Datamoduler (MainDM):
- Indeholder al den vigtige kode.
- Inkluderer TCameraComponent til at optage billeder fra enheden kamera.
- Bruger TFDMemTable til at gemme scanningsresultaterne i en hukommelsestabel.
- Huser al kode relateret til ZXing.Delphi.
Frames: Hver frame præsenterer en specifik del af brugergrænsefladen og afspejler appens status og tilgængelige data.
- TScanningFrame: Hjælper brugeren med at opfange barcodes. Den tegner kameraets billedrammer på et TRectangle (hurtigere end TImage) og viser information om kameraets opløsning og FPS. Den har også en knap til at tænde/slukke lommelygten (hvis tilgængelig), hvilket kan være nyttigt i dårligt lys. Under scanning vises rektangler over billedrammen for at indikere potentielle barcodes fundet af ZXing.Delphi.
- TDataFrame: Viser en liste over hidtil scannede barcodes. Bruger en TListView med DynamicAppearance til at vise detaljer som thumbnails, barcode-format, indhold og antallet af gange, en specifik kode er blevet scannet. Klik på et element fører til en detaljeret visning.
- TScanResultFrame: Præsenterer detaljeret information om en succesfuldt scannet barcode, herunder format, dato for erhvervelse, et billede af rammen med markører for barcode-positionen, og muligheder for at slette elementet eller dele indholdet via systemets ShareSheet.
- TInfoFrame: Viser en simpel kreditlayout med information om appen og de anvendte biblioteker.
MainForm: Indeholder en TFrameStand-instans, der styrer brugergrænsefladen på tværs af hele appen.
Kommunikation og Beskeder (System.Messaging)
For at minimere afhængigheder mellem appens moduler (forms, datamoduler, frames) benytter ScannerMApp sig af Delphi's indbyggede System.Messaging publish/subscribe-mekanisme via TMessageManager. Dette sikrer, at kode er organiseret og adskilt – ingen UI-kode i datamodulet, og ingen applikationskode i UI-frames.
Følgende brugerdefinerede beskeder anvendes:
TScanningMessageTScanResultMessageTScanPointMessageTScanSettingMessageTTorchModeMessageTCameraBufferMessageTHardwareBackMessage
Eksempel på beskedudveksling:
- Når en ny billedramme er tilgængelig fra kameraet (via
TMainDM.CameraComponent1SampleBufferReady), sendes enTCameraBufferMessage. TScanningFrame, som er abonneret på denne besked, modtager bitmap'en og viser den for brugeren. - Når ZXing.Delphi-biblioteket detekterer et potentielt barcode-punkt under scanning, sendes en
TScanPointMessage. TScanningFrame informerer brugeren ved at tegne et rektangel over billedet. - Ved en succesfuld barcode-genkendelse sender MainDM en
TScanResultMessage. Både MainForm, MainDM og TDataFrame informeres. MainForm sørger for, at brugeren kan se TDataFrame, MainDM gemmer resultatet i TFDMemTable, og TDataFrame opdaterer sin ListView.
Anvendte Teknologier
Udviklingen af ScannerMApp har involveret en række kraftfulde teknologier fra Delphi og open source-verdenen:
| Teknologi | Beskrivelse |
|---|---|
| RTL (System.Messaging) | Leverer publish/subscribe-mekanismen til kommunikation mellem moduler. |
| FMX (FireMonkey) | Giver nem adgang til enhedens kamera og muliggør cross-platform UI-udvikling. |
| FireDAC | Anvendes til nem lagring af resultater, inklusive bitmaps, i en hukommelsestabel. |
| LiveBindings | Binder hukommelsestabellen til TListView i TDataFrame for nem data-visning. |
| Parallel Programming Library | Bruges til at udføre barcode scanning i baggrunden, hvilket sikrer en god brugeroplevelse uden blokering af UI-tråden. |
| ZXing.Delphi | Implementerer selve barcode-detektionen og dekodningen. |
| TFrameStand | Orkestrerer brugergrænsefladen og giver mulighed for visuel kontinuitet og flotte overgange. |
Fremtidige Forbedringer og Konklusion
ScannerMApp startede som et proof-of-concept til et træningskursus, men er sidenhen blevet poleret og forbedret. Den frigives nu som et eksempel for alle Delphi-udviklere. Selvom appen er langt fra perfekt, giver den et godt indblik i mulighederne.
Der er flere områker, hvor appen kan forbedres yderligere:
- Android Intent Filter: Registrere appen for SEND action intent-filter på Android, så den kan vises i ShareSheet fra andre applikationer.
- iOS Testning: Grundig testning på iOS-platformen for at sikre fuld funktionalitet. Feedback fra iOS-brugere er meget velkommen.
- Lagringsstrategi: Definere en klar strategi for datalagring, enten lokalt eller på en fjernserver.
- Lydfeedback: Tilføje en lydindikation ved succesfulde scanninger.
- Filtrering af Barcode Formater: Implementere mulighed for at filtrere efter specifikke barcode-formater (f.eks. kun QR-koder eller EAN13). Dette kan forbedre præcisionen og reducere falske positiver.
Forhåbentlig vil dette eksempel inspirere andre Delphi-udviklere til at udforske mulighederne for at skabe avancerede mobilapps. Det demonstrerer, hvor nemt det er at bygge en relativt kompleks mobilapplikation med Delphi, som kan køre på tværs af flere platforme.
Hav en god dag og god kodning!
Ofte Stillede Spørgsmål (FAQ)
- Hvad er den mest populære barcode scanning library i Java?
- ZXing (Zebra Crossing) er det mest populære open source-bibliotek til barcode scanning i Java.
- Kan ZXing bruges i Delphi?
- Ja, Edward Spelt har lavet en Delphi-port af ZXing, kendt som ZXing.Delphi, som gør det muligt at bruge biblioteket i Delphi-projekter.
- Hvad er fordelene ved at integrere en scanner direkte i min app?
- Du opnår fuld kontrol over scanningen, undgår afhængighed af tredjepartsapps og kan opnå bedre platformsuafhængighed.
- Hvilke platforme understøtter ScannerMApp?
- Applikationen er bygget med FMX og kan potentielt køre på Android, iOS, Windows, macOS og Linux, afhængigt af ZXing.Delphi's understøttelse på disse platforme.
- Hvordan kommunikerer de forskellige dele af ScannerMApp med hinanden?
- Appen bruger Delphi's indbyggede System.Messaging publish/subscribe-mekanisme til at sende og modtage beskeder mellem modulerne, hvilket minimerer afhængigheder.
Hvis du vil læse andre artikler, der ligner ZXing.Delphi: Barcode Scanning i Delphi, kan du besøge kategorien Software.
