Hallo zusammen.
In diesem Thread (
https://www.delphipraxis.net/203147-...er-delphi.html) hat Redeemer eine superkompakte Klasse für die Erstellung von QR-Codes erstellt.
Die wollte ich nach einem Test mit Delphi 10.4 Community nach Turbo Delphi portieren, stieß da aber auf einige Probleme u.a. bzgl. pngimage (was ich mit etwas Aufwand beheben konnte). Aber nach delphi 2006 sind zu viele Änderungen erfolgt.
Nach einigen Versuchen habe ich mir dann überlegt, eine
DLL mit D10.4C zu erstellen, um sie dann in Delphi 2006 zu laden und den QR-Code per Bitmap zu übertragen.
Die
DLL mit Delphi 10.4 Community:
Delphi-Quellcode:
library GiroCode;
uses
// ShareMem,
System.SysUtils,
System.Classes,
Graphics, ExtCtrls,
RedeemerQR in '..\..\..\BorlandDelphiKomponenten\RedeemerQR\RedeemerQR.pas',
RedeemerInheritablePNG in '..\..\..\BorlandDelphiKomponenten\RedeemerQR\RedeemerInheritablePNG.pas';
{$R *.res}
type
TTextGiroCode = array [1..12] of ShortString;
function GenerateCode(GC: TTextGiroCode; var QRbmp: TBitmap): Integer;
var
QR: TRedeemerQR;
GC_Text: String;
i: Integer;
begin
result := 0;
GC_Text := '';
for i := 1 to 11 do
GC_Text := GC_Text + GC[i] + #13;
GC_Text := GC_Text + GC[12];
QR := TRedeemerQR.Create();
try
QR.LoadFromString(AnsiString(GC_Text), ecMedium);
// hier kommt es zur Zugriffsverletzung
QRbmp.Width := QR.Width + 2;
// auch, wenn Height vor Width steht
QRbmp.Height := QR.Height + 2;
QRbmp.Canvas.Draw(1,1, QR);
result := 1;
finally
QR.Free;
end;
end;
exports
GenerateCode index 1;
begin
end.
Der Aufruf aus Delphi 2006 (in D10.4C sieht die
Unit genauso aus):
Delphi-Quellcode:
[...]
type
TTextGiroCode =
array [1..12]
of ShortString;
{$R *.dfm}
procedure TForm1.Button3Click(Sender: TObject);
var
FuncCall:
function(GC: TTextGiroCode;
var QRbmp: TBitmap): Integer;
DllHandle: THandle;
text: TTextGiroCode;
i: Integer;
bmp: TBitmap;
begin
DllHandle := loadlibrary('
GiroCode.dll');
if DllHandle = 0
then
begin
ShowMessage('
DLL-Ladefehler: GiroCode.dll nicht gefunden!');
Exit;
end;
@FuncCall := getprocaddress(DllHandle, '
GenerateCode');
if (@FuncCall =
Nil)
then
ShowMessage('
GetProcAddress-Fehler: GiroCode.dll enthält keine Function "GenerateCode"')
else
begin
for i := 1
to 12
do
text[i] := Memo1.Lines[i-1];
bmp := TBitmap.Create;
bmp.Width := 0;
bmp.Height := 0;
FuncCall(text, bmp);
image1.Picture.Assign(bmp);
//bmp.SaveToFile('qr.png');
end;
FreeLibrary(DLLHandle);
end;
Bei Aufruf der
DLL aus D10.4C ist alles in Ordnung und der QR-Code wird angezeigt.
Wenn nun die
DLL aus Delphi2006 aufgerufen wird, kommt es inzu einer Zugriffsverletzung an der Stelle, wo QRbmp.Width zugewiesen wird. Eine Auswertung der Variablen ergibt, dass diverse Eigenschaften nicht verfügbar sind.
Kann mir jemand helfen und verraten, wo mein Fehler liegt???
PS: Die Verwendung von "sharemem" oder nicht bringt keinen Unterschied.
Danke
Michael