Gma.QrCodeNet.Encoding.dll

Deutschsprachiges X#-Forum – German language forum

Moderator: wriedmann

lagraf
Posts: 450
Joined: Thu Jan 18, 2018 9:03 am
Location: A

Gma.QrCodeNet.Encoding.dll

Post 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?
User avatar
wriedmann
Posts: 3757
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Gma.QrCodeNet.Encoding.dll

Post by wriedmann »

Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
g.bunzel@domonet.de
Posts: 97
Joined: Tue Mar 01, 2016 11:50 am
Location: Germany

Gma.QrCodeNet.Encoding.dll

Post 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
lagraf
Posts: 450
Joined: Thu Jan 18, 2018 9:03 am
Location: A

Gma.QrCodeNet.Encoding.dll

Post 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.
User avatar
wriedmann
Posts: 3757
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Gma.QrCodeNet.Encoding.dll

Post 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
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
g.bunzel@domonet.de
Posts: 97
Joined: Tue Mar 01, 2016 11:50 am
Location: Germany

Gma.QrCodeNet.Encoding.dll

Post 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
lagraf
Posts: 450
Joined: Thu Jan 18, 2018 9:03 am
Location: A

Gma.QrCodeNet.Encoding.dll

Post 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?
User avatar
wriedmann
Posts: 3757
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Gma.QrCodeNet.Encoding.dll

Post 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
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
lagraf
Posts: 450
Joined: Thu Jan 18, 2018 9:03 am
Location: A

Gma.QrCodeNet.Encoding.dll

Post 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?
User avatar
wriedmann
Posts: 3757
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Gma.QrCodeNet.Encoding.dll

Post 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
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
Post Reply