Qrcode компонент
Yushinin
Воронеж
Здравствуйте, все.
Понадобился мне тут QRCode в отчетах.
Поискав, обнаружил только для .NET
Решил исправить такую несправедливаость и написал свой.
Онлайн решения отмел сразу, так как не факт, что на машине клиента будет устойчивый инет.
Нашел бесплатную библиотеку с примерами на Delphi - http://delphi32.blogspot.com/2011/11/quric...or-library.html
Посмотрев примеры и почитав документацию написал следущее:
Работает отлично.
Понадобился мне тут QRCode в отчетах.
Поискав, обнаружил только для .NET
Решил исправить такую несправедливаость и написал свой.
Онлайн решения отмел сразу, так как не факт, что на машине клиента будет устойчивый инет.
Нашел бесплатную библиотеку с примерами на Delphi - http://delphi32.blogspot.com/2011/11/quric...or-library.html
Посмотрев примеры и почитав документацию написал следущее:
unit syQRcode;
interface
uses classes, graphics, frxClass, frxDsgnIntf, QuricolCode, variants;
type
TQRcodeParams = class(TPersistent)
private
FPixelSize: integer;
FMargin: integer;
constructor Create(AOwner: TComponent);
published
property Margin: integer read FMargin write FMargin;
property PixelSize: integer read FPixelSize write FPixelSize;
end;
TfrxQRcode = class(TfrxView)
private
FText: string;
FParams: TQRcodeParams;
published
public
class function GetDescription: string; override;
procedure Draw(Canvas: TCanvas; ScaleX: Extended; ScaleY: Extended; OffsetX: Extended;
OffsetY: Extended); override;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure GetData; override;
published
property Text: string read FText write FText;
property CodeParams: TQRcodeParams read FParams write FParams;
property DataField;
property DataSet;
end;
implementation
{ TfrxQRcode }
constructor TfrxQRcode.Create(AOwner: TComponent);
begin
inherited;
Text := 'http://yushinin.ru';
FParams := TQRcodeParams.Create(self);
Description := GetDescription;
end;
destructor TfrxQRcode.Destroy;
begin
FParams.Free;
inherited;
end;
procedure TfrxQRcode.Draw(Canvas: TCanvas; ScaleX, ScaleY, OffsetX, OffsetY: Extended);
var
bmp: tbitmap;
begin
inherited;
BeginDraw(Canvas, ScaleX, ScaleY, OffsetX, OffsetY);
if Text <> '' then
begin
bmp := TQRCode.GetBitmapImage(Text, FParams.FMargin, FParams.FPixelSize);
Width := bmp.Width;
Height := bmp.Height;
Canvas.Draw(Fx, fy, bmp);
end;
end;
procedure TfrxQRcode.GetData;
begin
inherited;
if IsDataField then
FText := VarToStr(DataSet.Value[DataField])
end;
class function TfrxQRcode.GetDescription: string;
begin
Result := 'QR code';
end;
{ TQRcodeParams }
constructor TQRcodeParams.Create(AOwner: TComponent);
begin
FMargin := 4;
FPixelSize := 3;
end;
initialization
frxObjects.RegisterObject1(TfrxQRcode, nil, '', '', 0, 23);
finalization
frxObjects.Unregister(TfrxQRcode);
end.
Работает отлично.
Комментарии
А вот тем, кто пока ее не использует (к примеру мне), будет очень полезно использовать это решение!
Спасибо!
Поделитесь примером на дельфях пожалуйста, как привязать данную реализацию к генератору отчетов?
За ранее спасибо!
Gdalex, ну это уж совсем просто.
Нужно создать пакет, добавить модуль и установить его в среду.
Пакет, модуль, библиотека и инструкция прилагаются
Изменять пропорции QRcode нельзя.
В FR-дизайнере могу расместить компонент QRcode1 на странице. Просмотр и печать ОК.
Если в коде (вкладка "Код" FR-дизайнера) пытаюсь изменить QRcode1.Text , то при просмотре получаю сообщение "Неизвестный тип "TfrxQRcode".
Версия FR 4.4
В чем проблема?
На экране один размер, на печати - совсем другой, намного меньше.
Как наиболее безопасно порешать?
ЗЫ: Делфи-7 , ФР-4
поменял в dpk fs15, frx15 на fs7, frx7;
Стал проверять и действительно - при печати то масштабы меняются из-за разной разрешения экрана и принтера.
Спасибо gpi.
Метод Draw может быть таким:
Добавил удаление битмапа, а то ведь утечки памяти...
Можно использовать и фирменный FR метод печати frxDrawGraphic, добавив в uses модуль frxUtils.
Однако там ничего реально нужного для печати кода нет, кроме того же StretchDraw.
Проверил на печати, все ок и распознается.
Установил QRCode. В дезижене добавляется и просматривается всё нормально. а вот в рантайме при просмотре - акцессвиолейшон... Делфи 2010, FR 4.9.32
или это зависит от версии Делфи?
Возвращает Sorry, an error occurred. If you are unsure on how to use a feature, or don't know why you got this error message, try looking through the help files for more information.
Не первый раз такое на форуме. Понятно что вышла новая версия и там всё есть, но обновление с 4 на 5 FR стоит 10 тыс, хотелось бы к 4-ке прикрутить.
https://drive.google.com/open?id=0B5Ts1vanf...LUpuT2hpc0h6ZTQ
А под 4.0 работать будет?
[dcc32 Fatal Error] fs14.dpk(28): E2225 Never-build package 'rtl' must be recompiled
[dcc32 Fatal Error] syFR3.dpk(35): E2202 Required package 'fs14' not found
И dll только 32 разрядная в архиве
property CalcHeight: Extended read GetCalcHeight;
property CalcWidth: Extended read GetCalcHeight;
и 64 битная библиотека