Ir para conteúdo
  • Cadastre-se

dev botao

PIX estatico com firemonkey com falha ou estou errando em algo?


Recommended Posts

Ola
Eu estou tentando gerar pix estatatico com firemonkey funciona?

Seguinte eu fiz em VCL vs Firemokey
VCL funciona

uses
  ACBrDelphiZXingQRCode,ACBrImage, ACBrPIXUtil;

procedure TForm1.btQREGerarClick(Sender: TObject);
begin
  ACBrPixCD1.Recebedor.Nome := 'SOUZA';
  ACBrPixCD1.Recebedor.CEP := '31950280';
  ACBrPixCD1.Recebedor.Cidade := 'BELO HORIZONTE';
  ACBrPixCD1.Recebedor.UF := 'MG';

  PintarQRCodeEstatico('073XXXXX8641');
end;


procedure TForm1.PintarQRCodeEstatico (sChave: string);
var
 i : integer;
begin

  ACBrPixCD1.PSP := ACBrPSPPagSeguro1;
  ACBrPSPPagSeguro1.ChavePIX := sChave;


  i:= Integer(DetectarTipoChave(sChave));

  mQRE.Lines.Text := ACBrPixCD1.GerarQRCodeEstatico(
                       StrToFloatDef('1,00', 0),
                       '',
                       '');
  PintarQRCode(mQRE.Lines.Text, imgQRE.Picture.Bitmap, qrUTF8BOM);
end;

Em FMX não funciona
 

{$R *.fmx}

uses
  ACBrDelphiZXingQRCode,ACBrImage, ACBrPIXUtil;

procedure TForm1.btQREGerarClick(Sender: TObject);
begin
  ACBrPixCD1.Recebedor.Nome := 'JSOUZA';
  ACBrPixCD1.Recebedor.CEP := '31950280';
  ACBrPixCD1.Recebedor.Cidade := 'BELO HORIZONTE';
  ACBrPixCD1.Recebedor.UF := 'MG';

  PintarQRCodeEstatico('0SSSSS8641');
end;


procedure TForm1.PintarQRCodeEstatico (sChave: string);
var
 i : integer;
begin

  ACBrPixCD1.PSP := ACBrPSPPagSeguro1;
  ACBrPSPPagSeguro1.ChavePIX := sChave;


  i:= Integer(DetectarTipoChave(sChave));

  mQRE.Lines.Text := ACBrPixCD1.GerarQRCodeEstatico(
                       StrToFloatDef('1,00', 0),
                       '',
                       '');
  PintarQRCode(mQRE.Lines.Text,imgQRE.Bitmap, qrUTF8BOM);


end;

Debugando em  procedure PintarQRCode(const QRCodeData: String; ABitMap: TBitmap; que chama no ACBrImage
Quando dou ctrl+f7 no delphi pra inspecionar a variavel QRCodeBitmap e mando SaveToFile e gerou uma uma imagem bmp 47po47 tudo preto. 

debuguei aqui 

 procedure PintarQRCode(const QRCodeData: String; ABitMap: TBitmap;
   const AEncoding: TQRCodeEncoding);
 var
   QRCode: TDelphiZXingQRCode;
   QRCodeBitmap: TBitmap;
   Row, Column: Integer;
   {$IfDef FMX}
    BitMapData: TBitmapData;
   {$EndIf}
 begin
   QRCode       := TDelphiZXingQRCode.Create;
   QRCodeBitmap := TBitmap.Create;
   try
     QRCode.Encoding  := AEncoding;
     QRCode.QuietZone := 1;
     QRCode.Data      := widestring(QRCodeData);

     //QRCodeBitmap.SetSize(Q



unit completa do FMX copia do VCL
 

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects,
  FMX.Controls.Presentation, FMX.StdCtrls, FMX.Memo.Types, FMX.ScrollBox,
  FMX.Memo, ACBrPIXCD, ACBrPIXPSPPagSeguro, ACBrBase;

type
  TForm1 = class(TForm)
    imgQRE: TImage;
    btQREGerar: TButton;
    mQRE: TMemo;
    ACBrPSPPagSeguro1: TACBrPSPPagSeguro;
    ACBrPixCD1: TACBrPixCD;
    procedure btQREGerarClick(Sender: TObject);
  private
    procedure PintarQRCodeEstatico(sChave: string);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

uses
  ACBrDelphiZXingQRCode,ACBrImage, ACBrPIXUtil;

procedure TForm1.btQREGerarClick(Sender: TObject);
var
    BitMapData: TBitmapData;
begin
  ACBrPixCD1.Recebedor.Nome := 'JOHN KENNEDY OLIVEIRA SOUZA';
  ACBrPixCD1.Recebedor.CEP := '31950280';
  ACBrPixCD1.Recebedor.Cidade := 'BELO HORIZONTE';
  ACBrPixCD1.Recebedor.UF := 'MG';

  PintarQRCodeEstatico('07342XXXX41');
end;


procedure TForm1.PintarQRCodeEstatico (sChave: string);
var
 i : integer;
begin

  ACBrPixCD1.PSP := ACBrPSPPagSeguro1;
  ACBrPSPPagSeguro1.ChavePIX := sChave;


  i:= Integer(DetectarTipoChave(sChave));

  mQRE.Lines.Text := ACBrPixCD1.GerarQRCodeEstatico(
                       StrToFloatDef('1,00', 0),
                       '',
                       '');
  PintarQRCode(mQRE.Lines.Text,imgQRE.Bitmap, qrUTF8BOM);


end;


end.

DETALHE ESTOU TESTOU O fmx no proprio windows.

Editado por johnbh3
erro
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...

resolvido 
Fiz isto

 

PintarQRCodeEstatico ();
var
 i : integer;
 qrCodeData: string;
begin
    ACBrPixCD1.Recebedor.Nome := DmDados.configuracao('NOME_PIX');
    ACBrPixCD1.Recebedor.CEP := DmDados.configuracao('END_CEPPIX');
    ACBrPixCD1.Recebedor.Cidade := DmDados.configuracao('END_CIDADEPIX');
    ACBrPixCD1.Recebedor.UF := DmDados.configuracao('END_UFPIX');

    lblNomePIX.Text := 'PAGAMENTO PARA, '+ACBrPixCD1.Recebedor.Nome;
    if DmDados.configuracao('TIPO_CHAVEPIX') = '1' Then
    begin
      ACBrPixBradesco.ChavePIX :='+5531'+DmDados.configuracao('CHAVE_PIX')
    end
    else
    begin
      ACBrPixBradesco.ChavePIX := DmDados.configuracao('CHAVE_PIX');
    end;

    qrCodeData := ACBrPixCD1.GerarQRCodeEstatico(
                     precoACobrar,
                     'PAGAMENTO ESTACIONAMENTO',
                     '');

  {$IFDEF MSWINDOWS}
  QRCodeWin(imgQR, qrCodeData);
  {$ELSE}
  QRCodeMobile(imgQR, qrCodeData);
  {$ENDIF}


end;

Usei o acbr para gerar a string do qrCode
Quando mobile pela directiva

 

procedure TfrmSaidaVeiculo.QrCodeMobile(imgQRCode: TImage; texto: string);
const
    downsizeQuality: Integer = 2; // bigger value, better quality, slower rendering
var
    QRCode: TDelphiZXingQRCode;
    Row, Column: Integer;
    pixelColor : TAlphaColor;
    vBitMapData : TBitmapData;
    pixelCount, y, x: Integer;
    columnPixel, rowPixel: Integer;

    function GetPixelCount(AWidth, AHeight: Single): Integer;
    begin
        if QRCode.Rows > 0 then
          Result := Trunc(Min(AWidth, AHeight)) div QRCode.Rows
        else
          Result := 0;
    end;
begin
    // Not a good idea to stretch the QR Code...
    if imgQRCode.WrapMode = TImageWrapMode.Stretch then
        imgQRCode.WrapMode := TImageWrapMode.Fit;


    QRCode := TDelphiZXingQRCode.Create;

    try
        QRCode.Data := '  ' + texto;
        QRCode.Encoding := TQRCodeEncoding.qrAuto;
        QRCode.QuietZone := 4;
        pixelCount := GetPixelCount(imgQRCode.Width, imgQRCode.Height);

        case imgQRCode.WrapMode of
            TImageWrapMode.Original,
            TImageWrapMode.Tile,
            TImageWrapMode.Center:
            begin
                if pixelCount > 0 then
                    imgQRCode.Bitmap.SetSize(QRCode.Columns * pixelCount,
                    QRCode.Rows * pixelCount);
            end;

            TImageWrapMode.Fit:
            begin
                if pixelCount > 0 then
                begin
                    imgQRCode.Bitmap.SetSize(QRCode.Columns * pixelCount * downsizeQuality,
                        QRCode.Rows * pixelCount * downsizeQuality);
                    pixelCount := pixelCount * downsizeQuality;
                end;
            end;

            //TImageWrapMode.iwStretch:
            //    raise Exception.Create('Not a good idea to stretch the QR Code');
        end;
        if imgQRCode.Bitmap.Canvas.BeginScene then
        begin
            try
                imgQRCode.Bitmap.Canvas.Clear(TAlphaColors.White);
                if pixelCount > 0 then
                begin
                      if imgQRCode.Bitmap.Map(TMapAccess.Write, vBitMapData)  then
                      begin
                            try
                                 For Row := 0 to QRCode.Rows - 1 do
                                 begin
                                    for Column := 0 to QRCode.Columns - 1 do
                                    begin
                                        if (QRCode.IsBlack[Row, Column]) then
                                            pixelColor := TAlphaColors.Black
                                        else
                                            pixelColor := TAlphaColors.White;

                                        columnPixel := Column * pixelCount;
                                        rowPixel := Row * pixelCount;

                                        for x := 0 to pixelCount - 1 do
                                            for y := 0 to pixelCount - 1 do
                                                vBitMapData.SetPixel(columnPixel + x,
                                                    rowPixel + y, pixelColor);
                                    end;
                                 end;
                            finally
                              imgQRCode.Bitmap.Unmap(vBitMapData);
                            end;
                      end;
                end;
            finally
                imgQRCode.Bitmap.Canvas.EndScene;
          end;
        end;
    finally
        QRCode.Free;
    end;
end;

 

Vai que sirva pra alguem funcionou todos os bancos. E qualidade ficou otima!

Agora funciona desktop e mobile.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.