Welcome, Guest
Username: Password: Remember me
Hier wird Deutsch gesprochen

TOPIC:

Gma.QrCodeNet.Encoding.dll 14 Mar 2022 14:47 #21925

  • lagraf
  • lagraf's Avatar
  • Topic Author


  • Posts: 307
  • Hallo Wolfgang,
    ich versuche erstmal die einfachere Variante mit einer Function:
    1) X# App RKSVDll als Library/Dll compiliert und die Dll in den VO App Ordner kopiert
    FUNCTION Test() AS LOGIC PASCAL
    	System.Console.WriteLine("Hello aus Function")
    	RETURN TRUE
    2) VO
    _DLL FUNCTION Test() AS LOGIC PASCAL:RksvDll.Test
    METHOD DoRksvDll() CLASS StandardShellWindow
    	LOCAL lReturn AS LOGIC
    	lReturn := Test()
    	InfoBox{SELF, "DoRskvDll", "X#Dll returns " + AsString(lReturn)}:Show()
    	RETURN SELF
    Beim Start der Methode DoRksvDll() erhalte ich die Fehlermeldung "Anwendung konnte nicht korrekt gestartet werden (0xc000007b)".
    Wenn die Dll nicht im VO App Ordner liegt erhalte ich korrekt die Meldung dass sie fehlt.
    Hast du eine Idee, warum das nicht geht?

    Please Log in or Create an account to join the conversation.

    Gma.QrCodeNet.Encoding.dll 14 Mar 2022 19:47 #21926

    • wriedmann
    • wriedmann's Avatar


  • Posts: 3152
  • Hallo Franz,
    ich habe jetzt mal gegooglet, wie das funktionieren könnte, und das hier gefunden:
    stackoverflow.com/questions/4818850/is-i...arp-dll-like-in-vs-c
    Zum einen arbeitet .NET intern anders als z.B. C/C++, zum anderen kennt das .NET Framework gar keine Funktionen (die X#-Funktionen verdanken wir der Findigkeit der X#-Entwickler, denn die haben die Funktionen als statische Methoden einer internen versteckten Klasse implementiert).
    Falls ich die nächsten Tage Zeit finde, werde ich das mal ausprobieren.
    Wolfgang
    P.S. auch auf der StackOverflow-Seite wird auf COM verwiesen
    Wolfgang Riedmann
    Meran, South Tyrol, Italy

    www.riedmann.it - docs.xsharp.it

    Please Log in or Create an account to join the conversation.

    Gma.QrCodeNet.Encoding.dll 17 Mar 2022 11:58 #21966

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 307
  • Ich teste noch ein wenig mit .NET und X# zu Lernzwecken herum und habe den Code um Folgendes zur Anzeige des QRCodes erweitert:
    LOCAL panel AS Panel
    LOCAL padding AS System.Drawing.Point
    LOCAL dSize AS DrawingSize
    
    qrEncoder := QrEncoder{ErrorCorrectionLevel.H}
    qrCode := qrEncoder:Encode(cText)
    renderer := GraphicsRenderer{FixedModuleSize{nSize, QuietZoneModules.Two}, System.Drawing.Brushes.Black, System.Drawing.Brushes.White}
    
    panel := Panel{}
    padding := System.Drawing.Point{10, 16}
    dSize := renderer:SizeCalculator:GetSize(qrCode:Matrix:Width)
    panel:AutoSize := FALSE
    panel:Size := Size{dSize:CodeWidth, dSize:CodeWidth} + Size{2*padding:X, 2*padding:Y}
    BEGIN USING VAR graphics := panel:CreateGraphics()
    	renderer:Draw(graphics, qrCode:Matrix, padding)
    END USING
    Der Code compiliert ohne Fehler, aber eine Anzeige über Panel erfolgt nicht.

    Please Log in or Create an account to join the conversation.

    Gma.QrCodeNet.Encoding.dll 21 Mar 2022 09:07 #22005

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 307
  • Wolfgang,
    ich habe mal den Eintrag [DllExport] in einer X# App ausprobiert, das wird aber von der XIDE mit einem Fehler quittiert. Muss dazu noch die NuGet Lib für Unmanaged Exports installiert werden? Was mache ich mit dem File microsoft.identity.client.4.42.1.nupkg, scheint als ob man damit nur in VS was anfangen kann.

    Please Log in or Create an account to join the conversation.

    Last edit: by lagraf.

    Gma.QrCodeNet.Encoding.dll 21 Mar 2022 09:29 #22008

    • wriedmann
    • wriedmann's Avatar


  • Posts: 3152
  • Hallo Franz,
    der X#-Compiler (übrigens auch der C#-Compiler) kann ohne die entsprechende Library mit dem Attribut DllExport nichts anfangen.
    Eine Nuget-Datei (*.nupkg) ist übrigens eine Zip-Datei.
    Du kannst sie einfach umbenennen und die Library RGiesecke.DllExport.dll in diesem Fall aus dem Unterverzeichnis Tools rausholen.
    Es wäre möglich, dass Du auch Mono.Cecil.dll brauchst.
    Wolfgang
    Wolfgang Riedmann
    Meran, South Tyrol, Italy

    www.riedmann.it - docs.xsharp.it

    Please Log in or Create an account to join the conversation.

    Gma.QrCodeNet.Encoding.dll 07 Apr 2022 16:02 #22112

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 307
  • Hallo Wolfgang,
    ich habe von der Seite sites.google.com/site/robertgiesecke/Hom...ads/unmanagedexports das C# Beispiel in die XIDE übertragen, die References auf RGiesecke.DllExport und System.Runtime.InteropServices angelegt und den Code wie folgt erstellt:
    using RGiesecke.DllExport;
    using System.Runtime.InteropServices;
    class Test
    {
      [DllExport("add", CallingConvention = CallingConvention.Cdecl)]
      public static int TestExport(int left, int right)
      {
         return left + right;
      } 
    }
    Beim Compilieren bekomme ich den Fehler
    error CS0246: The type or namespace name 'DllExport' could not be found (are you missing a using directive or an assembly reference?)
    für die [DllExport] Zeile. Auch mit zusätzlicher Verwendung von Mono.Cecil.Dll funktionierts nicht.

    Das ganze dann als X# Beispiel sieht so aus (mit Mono.Cecil.dll):
    USING RGiesecke.DllExport
    USING System.Runtime.InteropServices
    USING Mono.Cecil.dll
    [DllExport("add", CallingConvention = CallingConvention.Cdecl)]
    CLASS Test
    PUBLIC STATIC METHOD TestExport(left AS INT, right AS INT) AS INT PASCAL
    	RETURN left + right
    END CLASS
    Hier bringt der Compiler den Fehler
    error XS9002: Parser: unexpected CRLF, are you missing a token ?
    bei der Zeile [DllExport]. Das i

    File Attachment:

    File Name: TEST.zip
    File Size:2 KB
    st die gleiche Meldung wie ursprünglich, wo die RGiesecke Dll noch nicht eingebunden war.
    Attachments:

    Please Log in or Create an account to join the conversation.

    Gma.QrCodeNet.Encoding.dll 07 Apr 2022 16:32 #22114

    • FFF
    • FFF's Avatar


  • Posts: 1356
  • Franz,
    hinter dem Attribut muß ein ";" dran, oder es muß auf der gleichen Zeile vor der Class stehen.
    Allgemein die Bitte für alle:
    postet keine Schnipsel, mehr, als einen Typo kann da niemand finden. Die beste Methode ist, den Ordner, in dem die App residiert als ganzes zu zippen, dann hat man Chancen, mit vertretbarem Aufwand zu helfen.
    - Deine Test.zip etwa kann nicht compilieren, weil wir die beiden dlls nicht haben, es mach auch nicht viel Sinn, wenn wir sie uns suchen, weil dann noch lange nicht sicher ist, dass das genau das gleiche ist, was du benutzt.
    Regards
    Karl (X# 2.7; Xide 1.27; W8.1/64 German)

    Please Log in or Create an account to join the conversation.

    Last edit: by FFF.

    Gma.QrCodeNet.Encoding.dll 07 Apr 2022 17:25 #22115

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 307
  • Hallo Wolfgang,
    ich dachte ich schick dir die Exportfiles, weil du im anderen Thread diese haben wolltest. Und da du selber auf die Dlls verwiesen hast, nahm ich an, dass du die auch hast. Für den neuesten Stand bekommst du das Dir gezippt, zusätzlich die beiden Dlls für den Debug Ordner und das Export File.

    File Attachment:

    File Name: UnmExpTest.zip
    File Size:160 KB
    USING RGiesecke.DllExport
    USING System.Runtime.InteropServices
    USING Mono.Cecil
    [DllExport("add", CallingConvention := CallingConvention.Cdecl)];
    CLASS Test
    PUBLIC STATIC METHOD TestExport(left AS INT, right AS INT) AS INT PASCAL
    	RETURN left + right
    END CLASS
    bringt 3 Fehler in der [DllExport] Zeile:
    error XS0246: The type or namespace name 'DllExportAttribute' could not be found (are you missing a using directive or an assembly reference?)
    error XS0246: The type or namespace name 'DllExport' could not be found (are you missing a using directive or an assembly reference?)
    error XS1069: The type name 'CallingConvention' could not be found in the namespace 'System.Runtime.InteropServices'. This type has been forwarded to assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' Consider adding a reference to that assembly.
    Attachments:

    Please Log in or Create an account to join the conversation.

    Gma.QrCodeNet.Encoding.dll 07 Apr 2022 20:49 #22118

    • wriedmann
    • wriedmann's Avatar


  • Posts: 3152
  • Hallo Franz,
    ich habe auf die DLLs verwiesen, weil ich das irgendwo mal gelesen hatte und es mich interessiert hatte.
    Die Integration von X# und VO ist definitiv eines der Gebiete, die für mich wichtig sind.
    Erstes Problem: das Attribut DLLExport bezieht sich nicht auf die Klasse, sondern auf die Methode, gehört also eine Zeile weiter runter.
    Der Code schaut also so aus:
    using RGiesecke.DllExport
    using System.Runtime.InteropServices
    
    class Test
    [DllExport("add", CallingConvention := CallingConvention.Cdecl)];
    public static method TestExport(left as int, right as int) as int pascal
    	return left + right
    end class

    Das Hauptproblem ist, dass Du anscheinend die falsche DLL erwischt hast.
    Robert Giesecke hat zwei Dinge gebaut, die komplett gegensätzlich funktionieren:
    • DllExport
    • UnmanagedExports
    Bei zweiterem sagt die NuGet-Beschreibung das Folgende:

    und ich denke, es ist das, was Du möchtest.
    Mit der richtigen Referenz wird das dann auch kompiliert (Wichtig: es kann nicht AnyCPU sein, sondern muss für VO x86 sein).
    Allerdings scheint das nicht zu laufen, und wenn ich mit einem Tool (DLL Export Viewer von NirSoft) die DLL anschaue, dann hat die keine exportierte Funktion drin.
    Ich habe das jetzt mal in Visual Studio und mit dem NuGet-Paket probiert, und auch da klappt es nicht.
    Soweit ich das aber verstehe, passiert da ganz was anderes: die DLL dient nur dazu, die Dekorationen verständlich zu machen.
    Anschließend wird eine Build-Operation in Visual Studio aufgerufen, die die erstellte DLL noch modifiziert.
    Auf der Seite steht auch: "During compilation, my task will modify the IL to add the required exports."
    Ob und wie das mit der XIDE geht, kann ich Dir nicht sagen - das muss der Chris ggf. anschauen.
    Siehe auch hier:
    sites.google.com/site/robertgiesecke/Hom...ads/unmanagedexports
    Wolfgang
    P.S. das Ganze schaut komplizierter aus als einfach COM zu verwenden-
    Wolfgang Riedmann
    Meran, South Tyrol, Italy

    www.riedmann.it - docs.xsharp.it
    Attachments:

    Please Log in or Create an account to join the conversation.

    Last edit: by wriedmann.

    Gma.QrCodeNet.Encoding.dll 08 Apr 2022 05:29 #22120

    • wriedmann
    • wriedmann's Avatar


  • Posts: 3152
  • Hallo Franz,
    ich habe gestern abend nochmal eine Stunde drauf investiert.
    An und für sich sollte das auch mit X# und der XIDE funktionieren, denn auch in der XIDE kannst Du PostBuildActions definieren.
    Mit der neueren Version von dieser Seite
    github.com/3F/DllExport
    sollte sich das auch implementieren lassen (das nützt genau wie das Tool von Giesecke ILDasm und ILAsm zum Erstellen der Exports).
    Ich habe es allerdings auch mit Visual Studio nicht sofort zum Laufen gebracht, und irgendwann war ich zu müde.
    Vielleicht hat jemand anderer Lust, sich damit zu beschäftigen - mir fehlt die Zeit und das berechtigte Interesse.
    Zum einen habe ich die COM-Schnittstelle am Laufen, und die ist wesentlich leistungsfähiger und "sauberer" da objektorientiert im Gegensatz zur rein funktionalen Schnittstelle über das C-API.
    Wolfgang
    P.S. auch ILDAsm/ILAsm sind Teil des .NET SDKs, für das Dir der Dick gestern eine URL geliefert hat
    Wolfgang Riedmann
    Meran, South Tyrol, Italy

    www.riedmann.it - docs.xsharp.it

    Please Log in or Create an account to join the conversation.

    Gma.QrCodeNet.Encoding.dll 08 Apr 2022 09:04 #22121

    • Chris
    • Chris's Avatar


  • Posts: 3538
  • Hi Franz,

    Unfortunately again this code is not complete, so it is very difficult to tell why it does not work. Can you please zip your full test project and post it here, so we can have a close look?

    lagraf wrote: Ich teste noch ein wenig mit .NET und X# zu Lernzwecken herum und habe den Code um Folgendes zur Anzeige des QRCodes erweitert:

    LOCAL panel AS Panel
    LOCAL padding AS System.Drawing.Point
    LOCAL dSize AS DrawingSize
    
    qrEncoder := QrEncoder{ErrorCorrectionLevel.H}
    qrCode := qrEncoder:Encode(cText)
    renderer := GraphicsRenderer{FixedModuleSize{nSize, QuietZoneModules.Two}, System.Drawing.Brushes.Black, System.Drawing.Brushes.White}
    
    panel := Panel{}
    padding := System.Drawing.Point{10, 16}
    dSize := renderer:SizeCalculator:GetSize(qrCode:Matrix:Width)
    panel:AutoSize := FALSE
    panel:Size := Size{dSize:CodeWidth, dSize:CodeWidth} + Size{2*padding:X, 2*padding:Y}
    BEGIN USING VAR graphics := panel:CreateGraphics()
    	renderer:Draw(graphics, qrCode:Matrix, padding)
    END USING
    Der Code compiliert ohne Fehler, aber eine Anzeige über Panel erfolgt nicht.

    XSharp Development Team
    chris(at)xsharp.eu

    Please Log in or Create an account to join the conversation.

    Gma.QrCodeNet.Encoding.dll 11 Apr 2022 10:16 #22129

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 307
  • Hi Chris,
    attached you find the complete code of the test project.

    File Attachment:

    File Name: VOGuiWinforms.zip
    File Size:68 KB
    Attachments:

    Please Log in or Create an account to join the conversation.

    Gma.QrCodeNet.Encoding.dll 11 Apr 2022 10:31 #22130

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 307
  • Hallo Wolfgang,
    ich sehe auf der Seite github.com/3F/DllExport nur *.cs und *.csproj Files, aber keine Dll, muß die erst noch selber compiliert werden? Was mich dabei auch wundert: Ich dachte bisher anhand deiner Aussage dass das nur mit Functions funktioniert, für Klassen und Methoden ist COM notwendig?

    Please Log in or Create an account to join the conversation.

    Gma.QrCodeNet.Encoding.dll 11 Apr 2022 10:42 #22131

    • wriedmann
    • wriedmann's Avatar


  • Posts: 3152
  • Hallo Franz,
    1) nochmal zum Vorgang: um eine .NET-DLL wie eine normale C-DLL verwenden zu können, muss die DLL nach dem Erstellen verändert werden. Das passiert über die PostBuild-Action, und auf der 3F-Seite findest Du auch eine entsprechende cmd-Datei, die das mit Aufrufen von ILAsm und ILDasm erledigt (der originale Code von Robert Giesecke macht das nur für .NET 2.0, also untauglich für X#).
    Die DLL wird nur gebraucht, damit in der DLL die Informationen für die Konvertierung vorhanden sind
    2) die funktionale Schnittstelle per C-API exportiert nur Funktionen, wiel das C-API nichts anderes kennt.
    Per Attribut wird in der C#-DLL dann festgelegt, wie die entsprechende statische Methode exportiert wird.
    Nochmal zum besseren Verständnis: statische Methoden sind Methoden, die im Kontext einer Klasse, aber nicht im Kontext eines Objektes ausgeführt werden. Daher sind sie eigentlich mehr wie Funktionen zu sehen (und die Xbase-Funktionen werden vom X#-Compiler als statische Methoden einer versteckten Klasse implementiert, weil .NET gar keine Funktionen kennt).
    3) die COM-Schnittstelle ist per Definition objekt-orientiert, d.h. über diese Schnittstelle werden Objekte transportiert, es kann auf ihre Eigenschaften zugegriffen werden und Methoden auf ihnen ausgeführt werden. Zudem kann COM die Bitness-Grenze überschreiten, man kann also mit einer x64-Applikation auch x86-DLLs laden und umgekehrt.
    Wolfgang
    Wolfgang Riedmann
    Meran, South Tyrol, Italy

    www.riedmann.it - docs.xsharp.it

    Please Log in or Create an account to join the conversation.

    Gma.QrCodeNet.Encoding.dll 11 Apr 2022 18:08 #22134

    • Chris
    • Chris's Avatar


  • Posts: 3538
  • Hi Franz,

    lagraf wrote: Hi Chris,
    attached you find the complete code of the test project.

    File Attachment:

    File Name: VOGuiWinforms.zip
    File Size:68 KB


    Can you please also zip and post the QrCode dll that you are using?

    .
    XSharp Development Team
    chris(at)xsharp.eu

    Please Log in or Create an account to join the conversation.

    Gma.QrCodeNet.Encoding.dll 11 Apr 2022 18:11 #22135

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 307
  • The QRCode Dll ist included in the already attached VOGuiWinforms.zip with name Gma.QrCodeNet.Encoding.dll

    Please Log in or Create an account to join the conversation.

    Gma.QrCodeNet.Encoding.dll 11 Apr 2022 18:30 #22138

    • Chris
    • Chris's Avatar


  • Posts: 3538
  • Hi Franz,

    lagraf wrote: The QRCode Dll ist included in the already attached VOGuiWinforms.zip with name Gma.QrCodeNet.Encoding.dll


    Oops, sorry, somehow I missed it!

    The problem with showing the QR, is that you are painting it before the window is actually shown. When the window does show up, then the OS repaints it again and clears the QR code. Normally you would put such drawing code in a handler method of the Paint event, or in the OnPaint() method, which is the equivalent of VO's Expose().

    Something like the code below should do it, although it's not a good idea to redraw the code every time the panel needs repainting, you should instead draw it once (in a separate bitmap maybe) and the reuse it every time to draw it on the window. Can you also show us the full c# sample code that you used, so we can directly translate it so it works the same way in X#?
    METHOD QrCode(cText AS STRING, nSize AS DWORD) AS VOID
    	LOCAL panel AS Panel
    	panel := Panel{}
    	panel:AutoSize := TRUE
    	panel:Paint += PaintEventHandler{ SELF , @Paint_handler() }
    	SELF:Controls:Add(panel)
    
    METHOD Paint_handler(sender AS OBJECT , e AS PaintEventArgs) AS VOID
    	LOCAL panel AS Panel
    	LOCAL qrEncoder AS QrEncoder
    	LOCAL qrCode AS QrCode
    	LOCAL renderer AS GraphicsRenderer
    	LOCAL padding AS System.Drawing.Point
    	LOCAL dSize AS DrawingSize
    	LOCAL graphics AS Graphics
    	
    	panel := (Panel)sender
    
    	qrEncoder := QrEncoder{ErrorCorrectionLevel.H}
    	qrCode := qrEncoder:Encode("Hellow world")
    	renderer := GraphicsRenderer{FixedModuleSize{5, QuietZoneModules.Two}, System.Drawing.Brushes.Black, System.Drawing.Brushes.White}
    	padding := System.Drawing.Point{10, 16}
    	dSize := renderer:SizeCalculator:GetSize(qrCode:Matrix:Width)
    	panel:Size := System.Drawing.Size{dSize:CodeWidth + 20, dSize:CodeWidth + 20}
    
    	BEGIN USING VAR stream := FileStream{"c:\temp\VOGuiWinforms.bmp", FileMode.Create}
    		renderer:WriteToStream(qrCode:Matrix, ImageFormat.Bmp, stream)
    	END USING
    
    	graphics := panel:CreateGraphics()
    	renderer:Draw(graphics, qrCode:Matrix, padding)	

    .
    XSharp Development Team
    chris(at)xsharp.eu

    Please Log in or Create an account to join the conversation.

    Last edit: by Chris.

    Gma.QrCodeNet.Encoding.dll 12 Apr 2022 10:05 #22143

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 307
  • Hi Chris,thank you for your code, I putted it in my app and now it shows qrCode, zip attached!
    How can I save renderer into a bitmap (WriteToStream?) and use it for drawing?
    The C# example has same problem, it does not show the qrCode, but it's not necessary to make it run.

    File Attachment:

    File Name: VOGuiWinforms.zip
    File Size:68 KB


    I tried OnPaint like this:
    CLASS WFWindow INHERIT System.Windows.Forms.Form
    PROTECT _graphics AS Graphics
    ...
    METHOD DoQrCode(cText AS STRING, nSize AS DWORD) AS VOID
    // Generate qrCode and save it in protected var
    _graphics := _panel:CreateGraphics()
    ...
    PROTECTED METHOD OnPaint(e AS PaintEventArgs) AS VOID
    // Draw graphic each time it is painted
    SUPER:OnPaint(e)
    _renderer:Draw(_graphics, _qrCode:Matrix, System.Drawing.Point{182, 66})
    RETURN
    But this brings an error and no graphic is painted:
    Unhandled exception -> Object reference not set to an instance of an object
    Attachments:

    Please Log in or Create an account to join the conversation.

    Last edit: by lagraf.

    Gma.QrCodeNet.Encoding.dll 13 Apr 2022 00:41 #22150

    • Chris
    • Chris's Avatar


  • Posts: 3538
  • Hi Franz,

    Most likely this error is thrown because the method is called even before you assign the _renderer var. Also when you respond to OnPaint(), you need to use the Graphics object provided by the PaintEventArgs parameter, not create or reuse your own.

    But in any case, it's much easier if you just assign the BackgroundImage property of the control to the bitmap you want to show, so everything happens automatically. Something like this:

    METHOD QrCode(cText AS STRING, nSize AS DWORD) AS VOID
    	LOCAL panel AS Panel
    	LOCAL qrEncoder AS QrEncoder
    	LOCAL qrCode AS QrCode
    	LOCAL renderer AS GraphicsRenderer
    	LOCAL padding AS System.Drawing.Point
    	LOCAL dSize AS DrawingSize
    
    	panel := Panel{}
    	panel:AutoSize := TRUE
    	SELF:Controls:Add(panel)
    
    	qrEncoder := QrEncoder{ErrorCorrectionLevel.H}
    	qrCode := qrEncoder:Encode(cText)
    	renderer := GraphicsRenderer{FixedModuleSize{nSize, QuietZoneModules.Two}, System.Drawing.Brushes.Black, System.Drawing.Brushes.White}
    	padding := System.Drawing.Point{10, 16}
    	dSize := renderer:SizeCalculator:GetSize(qrCode:Matrix:Width)
    	panel:Size := System.Drawing.Size{dSize:CodeWidth + padding:X, dSize:CodeWidth + padding:Y}
    
    	LOCAL oBitmap, oCopy AS System.Drawing.Bitmap
    	BEGIN USING VAR stream := MemoryStream{}
    		renderer:WriteToStream(qrCode:Matrix, ImageFormat.Bmp, stream)
    		oBitmap := System.Drawing.Bitmap{stream}
    	END USING
    	// create a copy of the bitmap, otherwise need to keep the memory stream open till the original bitmap is no longer needed
    	oCopy := System.Drawing.Bitmap{oBitmap}
    
    	panel:BackgroundImage := oCopy
    	panel:BackgroundImageLayout := System.Windows.Forms.ImageLayout.Center

    .
    XSharp Development Team
    chris(at)xsharp.eu

    Please Log in or Create an account to join the conversation.

    Last edit: by Chris.

    Gma.QrCodeNet.Encoding.dll 13 Apr 2022 10:36 #22157

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 307
  • Hi Chris,
    I implemented all 3 examples (Paint_handler, OnPaint, BackgroundImage) to show qrCode in my test app to keep it for later use in other apps.
    Thank you for help!

    Please Log in or Create an account to join the conversation.

    Moderators: wriedmann