Page 4 of 7
Gma.QrCodeNet.Encoding.dll
Posted: Thu Mar 10, 2022 8:33 am
by lagraf
Ich habe mir jetzt eine X# Klasse erstellt, die einen QRCode mit der Gma.QrCodeNet.Encoding.dll erstellt und als File speichert:
Code: Select all
USING Gma.QrCodeNet.Encoding
USING Gma.QrCodeNet.Encoding.Windows.Render
USING System.IO
USING System.Drawing
USING System.Drawing.Imaging
CLASS TestQrCode
METHOD Generate(cText AS STRING, nSize AS WORD, cType AS STRING, cFile AS STRING) AS LOGIC PASCAL CLASS TestQrCode
// cText Zu codierender Text
// nSize QRCode Größe 1-255
// cType Output Filetyp PNG, BMP, JPEG
// cFile Output Filename inkl. Pfad ohne Extension
// Return true/false
LOCAL qrEncoder AS QREncoder
LOCAL qrCode AS QrCode
LOCAL renderer AS GraphicsRenderer
LOCAL format AS ImageFormat
LOCAL cOutput AS STRING
IF Empty(cText) .or. nSize < 1
RETURN FALSE
ENDIF
DO CASE
CASE Lower(cType) == "png"
format := ImageFormat.Png
cOutput := cFile + ".png"
CASE Lower(cType) == "bmp"
format := ImageFormat.Bmp
cOutput := cFile + ".bmp"
OTHERWISE
format := ImageFormat.Jpeg
cOutput := cFile + ".jpg"
ENDCASE
FErase(cOutput)
qrEncoder := QrEncoder{ErrorCorrectionLevel.H}
qrCode := qrEncoder:Encode(cText)
renderer := GraphicsRenderer{FixedModuleSize{nSize, QuietZoneModules.Two}, System.Drawing.Brushes.Black, System.Drawing.Brushes.White}
BEGIN USING VAR stream := FileStream{cOutput, FileMode.Create}
renderer:WriteToStream(qrCode:Matrix, format, stream)
END USING
RETURN iif(File(cOutput), TRUE, FALSE)
END CLASS
Wie kann ich aus dieser Klasse eine X# DLL erstellen, die ich dann aus VO nutzen kann?
Gma.QrCodeNet.Encoding.dll
Posted: Thu Mar 10, 2022 9:43 am
by wriedmann
Gma.QrCodeNet.Encoding.dll
Posted: Thu Mar 10, 2022 2:44 pm
by g.bunzel@domonet.de
Hallo Franz,
in dieser FoxPro-Klasse wird eine freie DLL zur Erstellung von QR-Barcodes verwendet:
github.com/VFPX/FoxBarCodeQR
Du kannst diese DLL aus der ZIP-Datei einfach mit VO benutzen. Es ist keine Registrierung der DLL erforderlich - einfach die DLL-Datei in das Programmverzeichnis kopieren.
Wrapper für VO:
_DLL FUNCTION GenerateFile (cData AS PSZ, cFileName AS PSZ) AS INT PASCAL:BarCodeLibrary.GenerateFile
_DLL FUNCTION SetConfiguration (nSize AS INT, nImageType AS INT) AS INT PASCAL:BarCodeLibrary.SetConfiguration
_DLL FUNCTION LibraryVersion () AS PSZ PASCAL:BarCodeLibrary.LibraryVersion
Die Erstellung eines QR-Codes als Bildatei mit VO ist ein Zweizeiler:
SetConfiguration (4, 1))
GenerateFile (String2Psz("Das ist ein Mustertext mit QR-Code"), String2Psz("QR_Muster.jpg"))
/****
tnSize: The size of the generated image. Receives an integer between 2 and 12
2 = 66 x 66 (in pixels)
3 = 99 x 99
4 = 132 x 132
5 = 165 x 165
6 = 198 x 198
7 = 231 x 231
8 = 264 x 264
9 = 297 x 297
10 = 330 x 330
11 = 363 x 363
12 = 396 x 396
tnType: The type of the generated image file. Receives an integer between 0 and 2.
0 = BMP
1 = JPG
2 = PNG
********/
HTH
Gerhard Bunzel
Gma.QrCodeNet.Encoding.dll
Posted: Fri Mar 11, 2022 5:12 am
by lagraf
Gerhard:
danke für die Info, aber die FoxPro Klasse kenne ich und habe sie testweise auch bereits ausprobiert. Bei meinen X# Versuchen zum Thema QR Code geht es darum, dass die dabei entstehende DLL schrittweise um weitere Funktionen ausgebaut werden soll, die in VO nicht machbar sind.
Wolfgang:
Danke, ich schau mir das Beispiel heute noch an.
Gma.QrCodeNet.Encoding.dll
Posted: Fri Mar 11, 2022 5:25 am
by wriedmann
Hallo Franz,
auch wenn die Sache mit dem COM-Objekt nicht sofort klappt: ich ärgere mich hier auch jedes Mal, wenn ich eine neue Bibliothek implementieren muss. Eine bestehende erweitern ist meistens Sache von ein paar Minuten.
Am besten startest Du mit einem simplen Objekt wie das beschriebene, und baust die QR-Funktion erst ein, wenn das funktioniert.
Und sonst: einfach melden.
Wolfgang
Gma.QrCodeNet.Encoding.dll
Posted: Fri Mar 11, 2022 7:44 am
by g.bunzel@domonet.de
Hallo Franz,
hier gibt es auch noch eine andere DLL - u.a. mit Funktionen zur Rechnungsverwaltung und -validierung:
http://www.validacfd.com/
Gerhard
Gma.QrCodeNet.Encoding.dll
Posted: Sun Mar 13, 2022 8:51 am
by lagraf
Hallo Wolfgang,
ich habe mir das com_module_sample angesehen, verstehe aber nicht, warum das so aufwändig ist.
Wenn ich die FoxPro BarCodeLibrary.dll hernehme, dann definiere ich nur 3 externe Functions
_DLL FUNCTION LibraryVersion () AS PSZ PASCAL:BarCodeLibrary.LibraryVersion
_DLL FUNCTION GenerateFile (cData AS PSZ, cFileName AS PSZ) AS INT PASCAL:BarCodeLibrary.GenerateFile
_DLL FUNCTION SetConfiguration (nSize AS INT, nImageType AS INT) AS INT PASCAL:BarCodeLibrary.SetConfiguration
kopiere die DLL ins Programmverzeichnis und kann diese Funktionsaufrufe direkt verwenden.
Ist der Unterschied deshalb, weil es in dem einen Fall um Funktionen geht, im anderen um Methoden einer Klasse? Oder ist der Aufwand notwendig, damit ich das tlb File erhalte, mit dem ich mit die Methoden in VO autom. generieren kann?
Gma.QrCodeNet.Encoding.dll
Posted: Sun Mar 13, 2022 3:05 pm
by wriedmann
Hallo Franz,
wenn es Dir nur um die Nutzung der DLL für die QR-Codes geht, bist Du mit der Foxpro-Library sicher schneller.
Wenn es Dir aber darum geht, eine DLL zu schaffen, die im Moment "nur" die QR-Codes erzeugt, aber nach und nach um weitere .NET-Funktionen erweitert werden kann, bzw. die bereits eigenen X#-Code enthält, ist wahrscheinlich die COM-Library besser und den größeren Aufwand wert.
Das mit der COM-Library ist deswegen komplexer, weil zum eine COM-DLL erzeugt wird, die dann auch noch ohne explizite Registrierung in VO verwendet werden kann (also ohne das entsprechende Modul auf jedem PC, auf dem es verwendet werden soll, zu registrieren).
Wolfgang
Gma.QrCodeNet.Encoding.dll
Posted: Sun Mar 13, 2022 5:48 pm
by lagraf
Hallo Wolfgang,
grundsätzlich sollte es eine DLL werden die mehr als nur QR Codes enthält.
Warum muß die Foxpro DLL nicht registriert werden, warum genügt es die Funktionsaufrufe als externe Aufrufe (_DLL Function) in VO zu definieren? Geht das in X# bzw. in .NET nicht?
Gma.QrCodeNet.Encoding.dll
Posted: Sun Mar 13, 2022 5:55 pm
by wriedmann
Hallo Franz,
klar geht das auch über Funktionsaufrufe, aber da kannst Du keine Objekte erstellen/abfragen, sondern bist auf eine funktionsbasierte Schnittstelle angewiesen, während über die COM-Schnittstelle Objekte "übertragen" werden können, ihre Eigenschaften gesetzt und abgefragt und ihre Methoden aufgerufen werden können.
Das ist ungefähr so, als gäbe es in den VO-Libraries nur Funktionen, aber keine Klassen.
Wolfgang