Ver Mensaje Individual
  #5  
Antiguo 15-02-2024
darkamerico darkamerico is offline
Miembro
 
Registrado: dic 2010
Posts: 233
Reputación: 14
darkamerico Va por buen camino
Red face Solucion usando API de google

Encontré esta solución, ya la compile y va 100%:

Código Delphi [-]
unit uPrincipal;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, DelphiZXingQRCode,
  Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    btnGenerarQR: TButton;
    Image1: TImage;
    procedure btnGenerarQRClick(Sender: TObject);
  private
  public
  end;

type
  TQrImage_ErrCorrLevel=(L,M,Q,H);

var
  Form1: TForm1;

implementation

uses jpeg, PngImage, HTTPApp, WinInet;

const
  UrlGoogleQrCode='http://chart.apis.google.com/chart?chs=%dx%d&cht=qr&chld=%s&chl=%s';
  QrImgCorrStr   : array [TQrImage_ErrCorrLevel] of string=('L','M','Q','H');

{$R *.dfm}

procedure WinInet_HttpGet(const Url: string;Stream:TStream);
const
BuffSize = 1024*1024;
var
  hInter   : HINTERNET;
  UrlHandle: HINTERNET;
  BytesRead: DWORD;
  Buffer   : Pointer;
begin
  hInter := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if Assigned(hInter) then
  begin
    Stream.Seek(0,0);
    GetMem(Buffer,BuffSize);
    try
        UrlHandle := InternetOpenUrl(hInter, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);
        if Assigned(UrlHandle) then
        begin
          repeat
            InternetReadFile(UrlHandle, Buffer, BuffSize, BytesRead);
            if BytesRead>0 then
             Stream.WriteBuffer(Buffer^,BytesRead);
          until BytesRead = 0;
          InternetCloseHandle(UrlHandle);
        end;
    finally
      FreeMem(Buffer);
    end;
    InternetCloseHandle(hInter);
  end
end;

procedure GetQrCode(Width,Height:Word;Correction_Level:TQrImage_ErrCorrLevel;const Data:string;StreamImage: TMemoryStream);
Var
 EncodedURL: string;
begin
  EncodedURL:=Format(UrlGoogleQrCode,[Width,Height,QrImgCorrStr[Correction_Level],HTTPEncode(Data)]);
  WinInet_HttpGet(EncodedURL,StreamImage);
end;

procedure TForm1.btnGenerarQRClick(Sender: TObject);
var
  ImageStream: TMemoryStream;
  PngImage: TPngImage;
begin
 Image1.Picture:=nil;
 ImageStream:=TMemoryStream.Create;
 PngImage   :=TPngImage.Create;
 try
   try
       GetQrCode(169,169,TQrImage_ErrCorrLevel(1),'atg',ImageStream);
       if ImageStream.Size>0 then
       begin
          ImageStream.Position:=0;
          PngImage.LoadFromStream(ImageStream);
          Image1.Picture.Assign(PngImage);
       end;
   except
      on E: exception do
      ShowMessage(E.Message);
   end;
 finally
  ImageStream.Free;
  PngImage.Free;
 end;
end;


end.

Sin embargo, depende de la API de Google, sigo pensando que un código standalone sigue siendo mejor.

Atte
Responder Con Cita