├── CSV ├── gtDelphiCSV.bmp ├── README.md ├── LICENSE └── gtDelphiCSV.pas ├── README.md ├── gtDelphiZXingQRCode ├── TestApp │ ├── SampleFMXapp │ │ ├── SampleFMX.skincfg │ │ ├── SampleFMX.dpr │ │ ├── view.main.pas │ │ ├── view.main.fmx │ │ └── SampleFMX.dproj │ ├── SampleFMXwithSKIAapp │ │ ├── gtQRCodeFMX_Skia.dpr │ │ ├── view.main.pas │ │ └── view.main.fmx │ └── FMXapp │ │ └── sample.pas ├── README.md ├── LICENSE.md └── Source │ └── gtQRCodeGenFMX.pas ├── LICENSE └── CommandPrompt ├── README.md └── gtCommandPrompt.pas /CSV/gtDelphiCSV.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/War3Evo/gtDelphi/HEAD/CSV/gtDelphiCSV.bmp -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # gtDelphi 2 | 3 | gtDelphiCSV is a collection of my delphi components 4 | 5 | -------------------------------------------------------------------------------- /gtDelphiZXingQRCode/TestApp/SampleFMXapp/SampleFMX.skincfg: -------------------------------------------------------------------------------- 1 | [ExpressSkins] 2 | Default=1 3 | ShowNotifications=1 4 | Enabled=1 5 | dxSkinsDefaultPainters=1 6 | -------------------------------------------------------------------------------- /gtDelphiZXingQRCode/TestApp/SampleFMXapp/SampleFMX.dpr: -------------------------------------------------------------------------------- 1 | program SampleFMX; 2 | 3 | uses 4 | System.StartUpCopy, 5 | FMX.Forms, 6 | view.main in 'view.main.pas' {viewMain}, 7 | gtQRCodeGenFMX in '..\..\Source\gtQRCodeGenFMX.pas', 8 | FMX.DelphiZXIngQRCode in '..\..\Source\FMX.DelphiZXIngQRCode.pas'; 9 | 10 | {$R *.res} 11 | 12 | begin 13 | Application.Initialize; 14 | Application.CreateForm(TviewMain, viewMain); 15 | Application.Run; 16 | end. 17 | -------------------------------------------------------------------------------- /gtDelphiZXingQRCode/TestApp/SampleFMXwithSKIAapp/gtQRCodeFMX_Skia.dpr: -------------------------------------------------------------------------------- 1 | program gtQRCodeFMX_Skia; 2 | 3 | uses 4 | System.StartUpCopy, 5 | FMX.Forms, 6 | view.main in 'view.main.pas' {viewMain}, 7 | gtQRCodeGenFMX in '..\..\Source\gtQRCodeGenFMX.pas', 8 | FMX.DelphiZXIngQRCode in '..\..\Source\FMX.DelphiZXIngQRCode.pas', 9 | gtCommandPrompt in '..\..\..\CommandPrompt\gtCommandPrompt.pas'; 10 | 11 | {$R *.res} 12 | 13 | begin 14 | Application.Initialize; 15 | Application.CreateForm(TviewMain, viewMain); 16 | Application.Run; 17 | end. 18 | -------------------------------------------------------------------------------- /CSV/README.md: -------------------------------------------------------------------------------- 1 | # gtDelphi 2 | 3 | gtDelphiCSV is a component is meant to break down CSV files 4 | by reading each line of the csv file. You can change the CSV file contents 5 | line by line if the isModified is set to true via the OnProcess procedure. 6 | 7 | Roadmap: 8 | - Create package files for redistribute for others to use in all delphi platforms 9 | - Create a demo application with source code 10 | - Add Multi-Threading ability cross platform 11 | - OnProgress add PrecentageDone : byte 0 - 100 % 12 | - Add more ways to process files 13 | 14 | -------------------------------------------------------------------------------- /CSV/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 El Diablo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 El Diablo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /CommandPrompt/README.md: -------------------------------------------------------------------------------- 1 | Created this component based on the information from 2 | https://stackoverflow.com/users/800214/whosrdaddy: 3 | 4 | For non unicode aware Delphi versions go here: 5 | https://stackoverflow.com/questions/10598313/communicate-with-command-prompt-through-delphi 6 | 7 | This component is bare bones, and has no ability to do any special commands. 8 | 9 | EXAMPLE: 10 | ``` 11 | procedure TForm1.Button1Click(Sender: TObject); 12 | begin 13 | CommandPrompt1.Start; 14 | end; 15 | 16 | procedure TForm1.Button2Click(Sender: TObject); 17 | begin 18 | CommandPrompt1.Stop; 19 | end; 20 | 21 | procedure TForm1.CommandPrompt1ReadCommandPrompt(OutPut: AnsiString); 22 | begin 23 | memo1.Lines.Add('IN: ' + String(OutPut)); 24 | end; 25 | 26 | procedure TForm1.CommandPrompt1WriteCommandPrompt(OutPut: AnsiString); 27 | begin 28 | memo1.Lines.Add('OUT: ' + String(OutPut)); 29 | end; 30 | 31 | procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); 32 | begin 33 | if ord(Key) = VK_RETURN then 34 | begin 35 | Key := #0; // prevent beeping 36 | CommandPrompt1.cmdWriteln(AnsiString(Edit1.Text)); 37 | end; 38 | end; 39 | ``` 40 | 41 | I am planning to create an SSH component using this component. You will need to target Windows 64-bit mode. You can find that information here: https://stackoverflow.com/questions/59583322/createprocess-of-c-windows-system32-openssh-ssh-exe-fails-with-error-2 42 | 43 | 44 | This component was created using Delphi 10.3 45 | 46 | -------------------------------------------------------------------------------- /gtDelphiZXingQRCode/README.md: -------------------------------------------------------------------------------- 1 | gtDelphiZXingQRCode 2 | ================= 3 | 4 | ### Threaded version of DelphiZXingQRCode ### 5 | 6 | 10/19/2022 7 | 8 | The Skia4Delphi version compiled application you can download from as gtQRCodeFMX_Skia Freeware 9 | 10 | https://www.timmons.pro/opensource.php 11 | 12 | 10/09/2022 13 | 14 | *** COLORing Pixels Work! *** 15 | 16 | Many Thanks to Vinícius Felipe Botelho Barbosa of https://github.com/viniciusfbb for the help with developing SVG code that is compatible with Skia4Delphi 17 | 18 | Use the SampleFMX.dproj in ./TestApp/SampleFMXapp for example code 19 | 20 | * Added OnFillColor event -allows you to change the pixel colors as the QRcode is developed 21 | - with OnFillColor, you can change the variables inside the event to change the colors 22 | - OnFillColor also gives you the x,y cords 23 | * Added MultiSelectFileFormat property - allows you to either generate SVG or BMP or both 24 | * Changed OnImageControlFinish to OnGenerateFinally event 25 | * Added UseInnerStyleSVG (default is true) 26 | - Set to false for Skia4Delphi 27 | * Added OnLoad 28 | - OnLoad happens after OnCreate and all the default values are set 29 | 30 | 10/08/2022 31 | 32 | ** Added ability to generate SVG (needs external viewer to see SVG) 33 | 34 | 10/07/2022 35 | 36 | **It's not multi-threaded, just threaded so your application can do other things while it's running in the background.** 37 | 38 | You can control how much cpu cycles it is using by increase or decreasing the ThreadSleep integer of gtDelphiZXingQRCode component. It is default of 40 ms. 39 | 40 | **The FMX version works** 41 | 42 | **Worked over 10 hours straight to get this threaded version of DelphiZXingQRCode working with all the bug fixes, updates, and errors reported on the original DelphiZXingQRCode page.** 43 | 44 | I'll upload a full sample application later, for now I'll just upload a sample.pas. 45 | 46 | gtDelphiZXingQRCode uses the code from DelphiZXingQRCode and combines all the pull requests for errors and bug fixes. gtDelphiZXingQRCode also uses code from the JSiQRCodeGenerator fork for the VCL / FMX non-visual components. JSiQRCodeGenerator did not have any updates and seemed to only convert the original to components. 47 | 48 | # Getting Started # 49 | 50 | A sample .pas is provided in the TestApp folder to demonstrate how to use gtDelphiZXingQRCode. 51 | Simply add or correct the FMX.DelphiZXIngQRCode.pas & gtQRCodeGenFMX.pas paths to the SampleFMX Delphi project and compile. 52 | 53 | I'll update this later when I have a better sample project. 54 | 55 | -------------------------------------------------- 56 | 57 | **The original code: https://github.com/foxitsoftware/DelphiZXingQRCode** 58 | 59 | The original code hasn't been updated in 9 years and won't accept pull requests! 60 | 61 | **From the original code's README.MD:** 62 | 63 | DelphiZXingQRCode is a Delphi port of the QR Code functionality from ZXing, an open source 64 | barcode image processing library. The code was ported to Delphi by Senior Debenu Developer, 65 | Kevin Newman. The port retains the original Apache License (v2.0). 66 | 67 | DelphiZXingQRCode Project 68 | 69 | ~~http://www.debenu.com/open-source/delphizxingqrcode-open-source-delphi-qr-code-generator/~~ 70 | **webpage no longer exists** 71 | 72 | ZXing 73 | 74 | https://github.com/zxing/zxing 75 | 76 | [Provided by Debenu] 77 | -------------------------------------------------------------------------------- /gtDelphiZXingQRCode/TestApp/FMXapp/sample.pas: -------------------------------------------------------------------------------- 1 | unit view.main; 2 | 3 | // Suppose to be a visual application, but I'm still working on that part. At least you have working code here. 4 | 5 | interface 6 | 7 | { 8 | Version 1.0 9 | 10 | - Problems with visualization of qrcode image, set DisableInterpolation := True on TImage control 11 | - Generated QRCode can be saved from JSiQRCodeGenFMX1.QRCode 12 | } 13 | 14 | uses 15 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 16 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ScrollBox, 17 | FMX.Memo, FMX.Objects, FMX.EditBox, FMX.SpinBox, FMX.ListBox, 18 | FMX.StdCtrls, FMX.Edit, FMX.Controls.Presentation, FMX.Memo.Types, 19 | gtQRCodeGenFMX; 20 | 21 | type 22 | TviewMain = class(TForm) 23 | btnGen: TButton; 24 | edtData: TEdit; 25 | Label1: TLabel; 26 | grpConfig: TGroupBox; 27 | edtEncoding: TComboBox; 28 | Label2: TLabel; 29 | Label3: TLabel; 30 | edtQZone: TSpinBox; 31 | lblTime: TLabel; 32 | imgQRCode: TImage; 33 | mLog: TMemo; 34 | btnSave: TButton; 35 | SD: TSaveDialog; 36 | gtQRCodeGenFMX1: TgtQRCodeGenFMX; 37 | Label4: TLabel; 38 | procedure btnGenClick(Sender: TObject); 39 | procedure btnSaveClick(Sender: TObject); 40 | procedure FormCreate(Sender: TObject); 41 | procedure gtQRCodeGenFMX1Error(Sender: TObject; Error: string); 42 | procedure gtQRCodeGenFMX1ImageControlFinish(Sender: TObject); 43 | procedure FormDestroy(Sender: TObject); 44 | procedure gtQRCodeGenFMX1GenerateAfter(Sender: TObject; 45 | const aQRCode: TBitmap); 46 | procedure gtQRCodeGenFMX1GenerateDuring(Sender: TObject; 47 | const aQRCode: TBitmap); 48 | procedure gtQRCodeGenFMX1GenerateBefore(Sender: TObject; 49 | const aQRCode: TBitmap); 50 | private 51 | 52 | public 53 | 54 | end; 55 | 56 | var 57 | viewMain: TviewMain; 58 | myBitmap: TBitMap; 59 | iCount: integer; 60 | 61 | implementation 62 | 63 | {$R *.fmx} 64 | 65 | procedure TviewMain.btnGenClick(Sender: TObject); 66 | begin 67 | mLog.Lines.Clear; 68 | 69 | if trim(edtData.Text) = '' then 70 | begin 71 | ShowMessage('Enter with QRCode data'); 72 | edtData.SetFocus; 73 | exit; 74 | end; 75 | btnSave.Enabled := False; 76 | With gtQRCodeGenFMX1 do 77 | begin 78 | Data := Trim(edtData.Text); 79 | Encoding := TQRCodeEncoding(edtEncoding.Selected.Index); 80 | QuietZone := StrToIntDef(edtQZone.Text,4); 81 | GenerateQRCode; 82 | end; 83 | end; 84 | 85 | procedure TviewMain.btnSaveClick(Sender: TObject); 86 | begin 87 | if not myBitmap.IsEmpty then 88 | begin 89 | if SD.Execute then 90 | begin 91 | myBitmap.SaveToFile(SD.FileName); 92 | end; 93 | end; 94 | end; 95 | 96 | procedure TviewMain.FormCreate(Sender: TObject); 97 | begin 98 | //myBitmap := TBitmap.Create; 99 | end; 100 | 101 | procedure TviewMain.FormDestroy(Sender: TObject); 102 | begin 103 | //myBitmap.Free; 104 | end; 105 | 106 | procedure TviewMain.gtQRCodeGenFMX1Error(Sender: TObject; Error: string); 107 | begin 108 | mLog.Lines.Add('An Error Occur: ' + Error); 109 | end; 110 | 111 | procedure TviewMain.gtQRCodeGenFMX1GenerateAfter(Sender: TObject; 112 | const aQRCode: TBitmap); 113 | begin 114 | //imgQRCode.Bitmap.Assign(aQRCode); 115 | myBitmap := aQRCode; 116 | end; 117 | 118 | procedure TviewMain.gtQRCodeGenFMX1GenerateBefore(Sender: TObject; 119 | const aQRCode: TBitmap); 120 | begin 121 | iCount := 0; 122 | end; 123 | 124 | procedure TviewMain.gtQRCodeGenFMX1GenerateDuring(Sender: TObject; 125 | const aQRCode: TBitmap); 126 | // var rSrc: TRectF; 127 | // var rDest: TRectF; 128 | begin 129 | { imgQRCode.DisableInterpolation := true; 130 | imgQRCode.WrapMode := TImageWrapMode.Stretch; // was iwStretch 131 | imgQRCode.Bitmap.SetSize(aQRCode.Width, aQRCode.Height); 132 | 133 | rSrc := TRectF.Create(0, 0, aQRCode.Width, aQRCode.Height); 134 | rDest := TRectF.Create(0, 0, imgQRCode.Bitmap.Width, imgQRCode.Bitmap.Height); 135 | 136 | if imgQRCode.Bitmap.Canvas.BeginScene then 137 | try 138 | imgQRCode.Bitmap.Canvas.Clear(TAlphaColors.White); 139 | 140 | imgQRCode.Bitmap.Canvas.DrawBitmap(aQRCode, rSrc, rDest, 1); 141 | finally 142 | imgQRCode.Bitmap.Canvas.EndScene; 143 | end; } 144 | inc(iCount); 145 | label4.Text := iCount.ToString; 146 | end; 147 | 148 | procedure TviewMain.gtQRCodeGenFMX1ImageControlFinish(Sender: TObject); 149 | begin 150 | mLog.Lines.Add('QRCode Generated'); 151 | btnSave.Enabled := True; 152 | end; 153 | 154 | end. 155 | -------------------------------------------------------------------------------- /CSV/gtDelphiCSV.pas: -------------------------------------------------------------------------------- 1 | unit gtDelphiCSV; 2 | 3 | interface 4 | 5 | uses 6 | System.SysUtils, System.Classes; 7 | 8 | { 9 | Created in 2019 by El Diablo using Delphi 10.3.3 10 | https://github.com/War3Evo 11 | 12 | gtDelphiCSV is a component is meant to break down CSV files 13 | by reading each line of the csv file. You can change the CSV file contents 14 | line by line if the isModified is set to true via the OnProcess procedure. 15 | 16 | Roadmap: 17 | 18 | - Create package files for redistribute for others to use in all delphi platforms 19 | 20 | - Create a demo application with source code 21 | 22 | - Add Multi-Threading ability cross platform 23 | 24 | - OnProgress add PrecentageDone : byte 0 - 100 % 25 | 26 | - Add more ways to process files 27 | 28 | - TPersistent class for multi-threading properties 29 | https://flixengineering.com/archives/108 30 | https://stackoverflow.com/questions/8406567/creating-a-component-with-named-sub-components 31 | 32 | } 33 | 34 | type 35 | TOnBeforeProcess = procedure of object; 36 | TOnProcess = procedure(const LineNumber, TotalLines : integer; var Strings : TStringList; var isModified : boolean) of object; 37 | TOnProcessEnd = procedure(FinalMemoryStream : TMemoryStream) of object; 38 | 39 | 40 | TgtDelphiCSV = class(TComponent) 41 | private 42 | { Private declarations } 43 | FBreakString: String; 44 | 45 | FStoppingCount: integer; 46 | 47 | FAutoSaveBeforeOnProcessEnd: Boolean; 48 | FAutoSaveAsYouModifyData: Boolean; 49 | 50 | FOnProcess : TOnProcess; 51 | FOnBeforeProcess : TOnBeforeProcess; 52 | FOnProcessEnd : TOnProcessEnd; 53 | 54 | FisFileLocationAndName : Boolean; 55 | FisTMemoryStream : Boolean; 56 | 57 | sSaveAsDifferentFileLocationAndName: String; 58 | FSaveAsDifferentFileLocationAndName: Boolean; 59 | 60 | function gtBreakStringIsStored: Boolean; 61 | procedure SetBreakString(const Value: String); 62 | protected 63 | { Protected declarations } 64 | procedure ProcessCSV(var gtMemoryStream : TMemoryStream); 65 | public 66 | { Public declarations } 67 | constructor Create(AOwner: TComponent); override; 68 | procedure Start(memStream : TMemoryStream); Overload; 69 | published 70 | { Published declarations } 71 | procedure Start(FileLocationAndName, SaveAsDifferentFileLocationAndName : String); Overload; 72 | 73 | property BreakString: String read FBreakString write SetBreakString stored gtBreakStringIsStored; 74 | 75 | property StoppingCount: integer read FStoppingCount write FStoppingCount default -1; 76 | 77 | property AutoSaveBeforeOnProcessEnd: Boolean read FAutoSaveBeforeOnProcessEnd write FAutoSaveBeforeOnProcessEnd; 78 | property AutoSaveAsYouModifyData: Boolean read FAutoSaveAsYouModifyData write FAutoSaveAsYouModifyData; 79 | 80 | property SaveAsDifferentFileLocationAndName: Boolean read FSaveAsDifferentFileLocationAndName write FSaveAsDifferentFileLocationAndName; 81 | 82 | property isFileLocationAndName: Boolean read FisFileLocationAndName; 83 | property isTMemoryStream: Boolean read FisTMemoryStream; 84 | 85 | property OnBeforeProcess: TOnBeforeProcess read FOnBeforeProcess write FOnBeforeProcess; 86 | property OnProcess: TOnProcess read FOnProcess write FOnProcess; 87 | property OnProcessEnd: TOnProcessEnd read FOnProcessEnd write FOnProcessEnd; 88 | end; 89 | 90 | var 91 | sFileLocationAndName: String; 92 | 93 | procedure Register; 94 | 95 | implementation 96 | 97 | procedure Register; 98 | begin 99 | RegisterComponents('gtDelphi', [TgtDelphiCSV]); 100 | end; 101 | 102 | constructor TgtDelphiCSV.Create(AOwner: TComponent); 103 | begin 104 | Inherited; 105 | FBreakString := ','; 106 | FStoppingCount := -1; 107 | end; 108 | 109 | procedure TgtDelphiCSV.SetBreakString(const Value: String); 110 | begin 111 | if FBreakString <> Value then 112 | begin 113 | FBreakString := Value; 114 | end; 115 | end; 116 | 117 | function TgtDelphiCSV.gtBreakStringIsStored: Boolean; 118 | begin 119 | Result := FBreakString <> ','; 120 | end; 121 | 122 | function ReverseSplit(BreakString: String; StringList: TStrings): String; 123 | var 124 | I: integer; 125 | sString: String; 126 | begin 127 | sString := StringList[1]; 128 | for I := 1 to StringList.Count-1 do 129 | begin 130 | sString := Concat(sString,BreakString,StringList[I]); 131 | end; 132 | result := sString; 133 | end; 134 | 135 | procedure pSplitIT(BreakString, BaseString: string; StringList: TStrings; ForceRightSideOfBreakString: boolean = false; Offset: integer = 1); 136 | var 137 | EndOfCurrentString: byte; 138 | //TempStr: string; 139 | iLengthenBreakString: integer; 140 | begin 141 | StringList.Clear; 142 | 143 | iLengthenBreakString := 0; 144 | 145 | // if the BreakString is greater than 1, it will force the break to be on the right side 146 | // of the BreakString instead of the left side 147 | if ForceRightSideOfBreakString = true then 148 | if length(BreakString) > 0 then iLengthenBreakString := length(BreakString); 149 | 150 | repeat 151 | if Offset = 1 then 152 | EndOfCurrentString := Pos(BreakString, BaseString) + iLengthenBreakString 153 | else 154 | EndOfCurrentString := Pos(BreakString, BaseString, Offset) + iLengthenBreakString; 155 | 156 | if EndOfCurrentString > length(BaseString) then EndOfCurrentString := length(BaseString); 157 | 158 | if EndOfCurrentString = 0 then 159 | StringList.add(BaseString) 160 | else 161 | StringList.add(Copy(BaseString, 1, EndOfCurrentString - 1)); 162 | BaseString := Copy(BaseString, EndOfCurrentString + length(BreakString), length(BaseString) - EndOfCurrentString); 163 | until EndOfCurrentString = 0; 164 | end; 165 | 166 | procedure TgtDelphiCSV.ProcessCSV(var gtMemoryStream : TMemoryStream); 167 | var 168 | //FinalMemoryStream : TMemoryStream; 169 | gtStringList, TmpStringList: TStringList; 170 | StringCount: integer; 171 | I: Integer; 172 | isModified : boolean; 173 | 174 | procedure gtSave(); 175 | begin 176 | if FileExists(sFileLocationAndName) then 177 | begin 178 | if SaveAsDifferentFileLocationAndName = true then 179 | begin 180 | gtStringList.SaveToFile(sSaveAsDifferentFileLocationAndName); 181 | end 182 | else 183 | begin 184 | gtStringList.SaveToFile(sFileLocationAndName); 185 | end; 186 | end 187 | else 188 | begin 189 | gtStringList.SaveToStream(gtMemoryStream); 190 | end; 191 | end; 192 | 193 | begin 194 | if assigned(FOnBeforeProcess) then 195 | begin 196 | FOnBeforeProcess(); 197 | end; 198 | 199 | gtStringList := TStringList.Create; 200 | gtStringList.Clear; 201 | TmpStringList := TStringList.Create; 202 | TmpStringList.Clear; 203 | 204 | gtStringList.LoadFromStream(gtMemoryStream); 205 | 206 | StringCount := gtStringList.Count; 207 | 208 | for I := 0 to StringCount-1 do 209 | begin 210 | pSplitIT(FBreakString,gtStringList.Strings[I],TmpStringList,false,1); 211 | isModified := false; 212 | if assigned(FOnProcess) = true then FOnProcess(I,StringCount,TmpStringList,isModified); 213 | if isModified = true then 214 | begin 215 | gtStringList.Strings[I] := ReverseSplit(FBreakString,TmpStringList); 216 | 217 | if FAutoSaveAsYouModifyData = true then 218 | begin 219 | gtSave; 220 | end; 221 | end; 222 | if FStoppingCount = I then break; 223 | if gtStringList.Count <> StringCount then StringCount := gtStringList.Count; 224 | end; 225 | 226 | TmpStringList.Free; 227 | 228 | if FAutoSaveBeforeOnProcessEnd = true then 229 | begin 230 | gtSave; 231 | end; 232 | 233 | if FileExists(sFileLocationAndName) then 234 | begin 235 | if SaveAsDifferentFileLocationAndName = true then 236 | begin 237 | gtStringList.SaveToFile(sSaveAsDifferentFileLocationAndName); 238 | end; 239 | end; 240 | 241 | if assigned(FOnProcessEnd) then 242 | begin 243 | gtStringList.SaveToStream(gtMemoryStream); 244 | FOnProcessEnd(gtMemoryStream); 245 | end; 246 | 247 | gtStringList.Free; 248 | end; 249 | 250 | 251 | procedure TgtDelphiCSV.Start(memStream : TMemoryStream); 252 | var 253 | ProcessMemoryStream: TMemoryStream; 254 | begin 255 | FisTMemoryStream := true; 256 | FisFileLocationAndName := false; 257 | sFileLocationAndName := ''; 258 | ProcessMemoryStream := TMemoryStream.Create; 259 | ProcessMemoryStream.LoadFromStream(memStream); 260 | ProcessCSV(ProcessMemoryStream); 261 | ProcessMemoryStream.Free; 262 | end; 263 | 264 | procedure TgtDelphiCSV.Start(FileLocationAndName, SaveAsDifferentFileLocationAndName : String); 265 | var 266 | ProcessMemoryStream: TMemoryStream; 267 | begin 268 | FisTMemoryStream := false; 269 | FisFileLocationAndName := true; 270 | sFileLocationAndName := FileLocationAndName; 271 | sSaveAsDifferentFileLocationAndName := SaveAsDifferentFileLocationAndName; 272 | ProcessMemoryStream := TMemoryStream.Create; 273 | ProcessMemoryStream.LoadFromFile(FileLocationAndName); 274 | ProcessCSV(ProcessMemoryStream); 275 | ProcessMemoryStream.Free; 276 | end; 277 | 278 | end. 279 | 280 | -------------------------------------------------------------------------------- /CommandPrompt/gtCommandPrompt.pas: -------------------------------------------------------------------------------- 1 | { 2 | Created this component based on the information from 3 | https://stackoverflow.com/users/800214/whosrdaddy: 4 | 5 | For non unicode aware Delphi versions go here: 6 | https://stackoverflow.com/questions/10598313/communicate-with-command-prompt-through-delphi 7 | } 8 | 9 | unit gtCommandPrompt; 10 | 11 | interface 12 | 13 | uses 14 | System.SysUtils, System.Classes, Windows; 15 | 16 | type 17 | TTmonitorUpdate = procedure(OutPut, Error: AnsiString) of object; 18 | 19 | TTmonitor = class(TThread) // pipe monitoring thread for console output 20 | private 21 | iThreadSleep: Cardinal; 22 | TextString: AnsiString; 23 | ErrorString: AnsiString; 24 | FTTmonitorUpdate: TTmonitorUpdate; 25 | procedure UpdateComponent; 26 | protected 27 | procedure Execute; override; 28 | public 29 | property OnUpdateComponent: TTmonitorUpdate read FTTmonitorUpdate write FTTmonitorUpdate; 30 | end; 31 | 32 | TOnReadCommandPrompt = procedure(OutPut: String) of object; 33 | TOnWriteCommandPrompt = procedure(OutPut: String) of object; 34 | 35 | TOnError = procedure(OutPut: String) of object; 36 | 37 | TgtCommandPrompt = class(TComponent) 38 | private 39 | { Private declarations } 40 | FThreadDone: Boolean; 41 | FThreadSleep: Cardinal; 42 | 43 | FComponentThread: TTmonitor; 44 | 45 | FOnError: TOnError; 46 | 47 | FOnReadCommandPrompt : TOnReadCommandPrompt; 48 | FOnWriteCommandPrompt : TOnWriteCommandPrompt; 49 | 50 | procedure OnThreadUpdate(OutPut, Error: AnsiString); 51 | protected 52 | { Protected declarations } 53 | public 54 | { Public declarations } 55 | procedure Start(); 56 | procedure Stop(); 57 | 58 | procedure cmdWriteln(text: String); 59 | 60 | // constructors are always public / syntax is always the same 61 | constructor Create(AOwner: TComponent); override; 62 | published 63 | { Published declarations } 64 | property ThreadSleep: Cardinal read FThreadSleep write FThreadSleep default 40; 65 | 66 | property OnReadCommandPrompt: TOnReadCommandPrompt read FOnReadCommandPrompt write FOnReadCommandPrompt; 67 | property OnWriteCommandPrompt: TOnWriteCommandPrompt read FOnWriteCommandPrompt write FOnWriteCommandPrompt; 68 | 69 | property OnError: TOnError read FOnError write FOnError; 70 | 71 | Destructor Destroy; override; 72 | end; 73 | 74 | procedure Register; 75 | 76 | var 77 | InputPipeRead, InputPipeWrite: THandle; 78 | OutputPipeRead, OutputPipeWrite: THandle; 79 | ErrorPipeRead, ErrorPipeWrite: THandle; 80 | ProcessInfo : TProcessInformation; 81 | 82 | implementation 83 | 84 | procedure Register; 85 | begin 86 | RegisterComponents('gtDelphi', [TgtCommandPrompt]); 87 | end; 88 | 89 | constructor TgtCommandPrompt.Create(AOwner: TComponent); 90 | begin 91 | inherited Create(AOwner); //ALWAYS do this first! 92 | 93 | FThreadDone := true; 94 | FThreadSleep := 40; 95 | end; 96 | 97 | procedure WritePipeOut(OutputPipe: THandle; InString: AnsiString); 98 | // writes Instring to the pipe handle described by OutputPipe 99 | var 100 | byteswritten: Cardinal; 101 | begin 102 | // most console programs require CR/LF after their input. 103 | InString := InString + #13#10; 104 | WriteFile(OutputPipe, Instring[1], Length(Instring), byteswritten, nil); 105 | end; 106 | 107 | function ReadPipeInput(InputPipe: THandle; var BytesRem: Cardinal): AnsiString; 108 | { 109 | reads console output from InputPipe. Returns the input in function 110 | result. Returns bytes of remaining information to BytesRem 111 | } 112 | var 113 | cTextBuffer: array[1..32767] of AnsiChar; 114 | sTextString: AnsiString; 115 | cBytesRead: Cardinal; 116 | cPipeSize: Cardinal; 117 | begin 118 | Result := ''; 119 | cBytesRead := 0; 120 | cPipeSize := Sizeof(cTextBuffer); 121 | // check if there is something to read in pipe 122 | PeekNamedPipe(InputPipe, nil, cPipeSize, @cBytesRead, @cPipeSize, @BytesRem); 123 | if cBytesRead > 0 then 124 | begin 125 | ReadFile(InputPipe, cTextBuffer, cPipeSize, cBytesRead, nil); 126 | // a requirement for Windows OS system components 127 | OemToCharA(@cTextBuffer, @cTextBuffer); 128 | sTextString := AnsiString(cTextBuffer); 129 | SetLength(sTextString, cBytesRead); 130 | Result := sTextString; 131 | end; 132 | end; 133 | 134 | procedure TTmonitor.Execute; 135 | { monitor thread execution for console output. This must be threaded. 136 | checks the error and output pipes for information every 40 ms, pulls the 137 | data in and updates the memo on the form with the output } 138 | var 139 | BytesRem: Cardinal; 140 | SyncIT: Boolean; 141 | begin 142 | while not Terminated do 143 | begin 144 | SyncIT := false; 145 | TextString := ''; 146 | ErrorString := ''; 147 | // read regular output stream. 148 | TextString := ReadPipeInput(OutputPipeRead, BytesRem); 149 | if TextString <> '' then SyncIT := true; 150 | // now read error stream. 151 | ErrorString := ReadPipeInput(ErrorPipeRead, BytesRem); 152 | if ErrorString <> '' then SyncIT := true; 153 | 154 | if SyncIT = true then Synchronize(UpdateComponent); 155 | sleep(iThreadSleep); 156 | end; 157 | end; 158 | 159 | procedure TTmonitor.UpdateComponent; 160 | // synchronize procedure for monitor thread 161 | begin 162 | if assigned(FTTmonitorUpdate) = true then 163 | FTTmonitorUpdate(TextString, ErrorString); 164 | // clear buffer 165 | TextString := ''; 166 | ErrorString := ''; 167 | end; 168 | 169 | procedure TgtCommandPrompt.OnThreadUpdate(OutPut, Error: AnsiString); 170 | // synchronize procedure for monitor thread 171 | begin 172 | if assigned(FOnReadCommandPrompt) = true then 173 | if OutPut <> '' then FOnReadCommandPrompt(String(OutPut)); 174 | if assigned(FOnError) = true then 175 | if Error <> '' then FOnError(String(Error)); 176 | end; 177 | 178 | Destructor TgtCommandPrompt.Destroy; 179 | begin 180 | WritePipeOut(InputPipeWrite, 'EXIT'); // quit the CMD we started 181 | 182 | // close process handles 183 | CloseHandle(ProcessInfo.hProcess); 184 | CloseHandle(ProcessInfo.hThread); 185 | // close pipe handles 186 | CloseHandle(InputPipeRead); 187 | CloseHandle(InputPipeWrite); 188 | CloseHandle(OutputPipeRead); 189 | CloseHandle(OutputPipeWrite); 190 | CloseHandle(ErrorPipeRead); 191 | CloseHandle(ErrorPipeWrite); 192 | 193 | // Always call the parent destructor after running your own code 194 | inherited; 195 | end; 196 | 197 | 198 | procedure TgtCommandPrompt.cmdWriteln(text: String); 199 | begin 200 | WritePipeOut(InputPipeWrite, AnsiString(text)); 201 | if assigned(FOnWriteCommandPrompt) = true then 202 | FOnWriteCommandPrompt(text); 203 | end; 204 | 205 | procedure TgtCommandPrompt.Stop(); 206 | begin 207 | if FComponentThread.Terminated = false then FComponentThread.Terminate; 208 | FThreadDone := true; 209 | end; 210 | 211 | procedure TgtCommandPrompt.Start(); 212 | { upon form creation, this calls the command-interpreter, sets up the three 213 | pipes to catch input and output, and starts a thread to monitor and show 214 | the output of the command-interpreter } 215 | var 216 | DosApp: String; 217 | DosSize: Byte; // was integer 218 | Security : TSecurityAttributes; 219 | start : TStartUpInfo; 220 | begin 221 | if FThreadDone = false then 222 | begin 223 | if assigned(FOnError) = true then 224 | FOnError('Start Error: Thread already running!'); 225 | exit; 226 | end; 227 | 228 | //CommandText.Clear; 229 | // get COMSPEC variable, this is the path of the command-interpreter 230 | SetLength(Dosapp, 255); 231 | DosSize := GetEnvironmentVariable('COMSPEC', @DosApp[1], 255); 232 | SetLength(Dosapp, DosSize); 233 | 234 | // create pipes 235 | With Security do 236 | begin 237 | nlength := SizeOf(TSecurityAttributes) ; 238 | binherithandle := true; 239 | lpsecuritydescriptor := nil; 240 | end; 241 | CreatePipe(InputPipeRead, InputPipeWrite, @Security, 0); 242 | CreatePipe(OutputPipeRead, OutputPipeWrite, @Security, 0); 243 | CreatePipe(ErrorPipeRead, ErrorPipeWrite, @Security, 0); 244 | 245 | // start command-interpreter 246 | FillChar(Start,Sizeof(Start),#0) ; 247 | start.cb := SizeOf(start) ; 248 | start.hStdInput := InputPipeRead; 249 | start.hStdOutput := OutputPipeWrite; 250 | start.hStdError := ErrorPipeWrite; 251 | start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW; 252 | start.wShowWindow := SW_HIDE; 253 | if CreateProcess(nil, PChar(DosApp), @Security, @Security, true, 254 | CREATE_NEW_CONSOLE or SYNCHRONIZE, 255 | nil, nil, start, ProcessInfo) then 256 | begin 257 | FComponentThread := TTmonitor.Create(true); // don't start yet monitor thread 258 | try 259 | FComponentThread.Priority := tpHigher; 260 | FComponentThread.iThreadSleep := FThreadSleep; // default is 40 261 | FComponentThread.FreeOnTerminate := true; 262 | FComponentThread.OnUpdateComponent := OnThreadUpdate; 263 | FThreadDone := false; 264 | FComponentThread.Start; // start thread; 265 | except 266 | FComponentThread.Free; 267 | Raise Exception.Create('Could not create monitor thread!'); 268 | end; 269 | end; 270 | end; 271 | 272 | end. 273 | -------------------------------------------------------------------------------- /gtDelphiZXingQRCode/TestApp/SampleFMXapp/view.main.pas: -------------------------------------------------------------------------------- 1 | unit view.main; 2 | 3 | interface 4 | 5 | { 6 | 7 | There's no way with FMX (without a third-party library) that I can figure out how to save a stretched file without blurriness. 8 | 9 | Version 1.0 10 | 11 | - Problems with visualization of qrcode image, set DisableInterpolation := True on TImage control 12 | } 13 | 14 | uses 15 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 16 | System.IoUtils, 17 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ScrollBox, 18 | FMX.Memo, FMX.Objects, FMX.EditBox, FMX.SpinBox, FMX.ListBox, 19 | FMX.StdCtrls, FMX.Edit, FMX.Controls.Presentation, FMX.Memo.Types, 20 | gtQRCodeGenFMX, FMX.Layouts, FMX.Effects, FMX.Filter.Effects, FMX.Colors; 21 | 22 | 23 | type 24 | TviewMain = class(TForm) 25 | btnGen: TButton; 26 | grpConfig: TGroupBox; 27 | edtEncoding: TComboBox; 28 | Label2: TLabel; 29 | Label3: TLabel; 30 | edtQZone: TSpinBox; 31 | imgQRCode: TImage; 32 | mLog: TMemo; 33 | btnSave: TButton; 34 | SD: TSaveDialog; 35 | gtQRCodeGenFMX1: TgtQRCodeGenFMX; 36 | Label4: TLabel; 37 | WidthEdit: TEdit; 38 | Label5: TLabel; 39 | Label6: TLabel; 40 | HeightEdit: TEdit; 41 | ScrollBox1: TScrollBox; 42 | MemoHints: TMemo; 43 | MemoData: TMemo; 44 | Label1: TLabel; 45 | Label7: TLabel; 46 | SVGcheckbox: TCheckBox; 47 | BMPcheckbox: TCheckBox; 48 | Label8: TLabel; 49 | Label9: TLabel; 50 | Label10: TLabel; 51 | Label11: TLabel; 52 | ColorComboBox1: TColorComboBox; 53 | Label12: TLabel; 54 | ColorComboBox2: TColorComboBox; 55 | procedure btnGenClick(Sender: TObject); 56 | procedure btnSaveClick(Sender: TObject); 57 | procedure gtQRCodeGenFMX1Error(Sender: TObject; Error: string); 58 | procedure FormDestroy(Sender: TObject); 59 | procedure FormShow(Sender: TObject); 60 | procedure SVGcheckboxChange(Sender: TObject); 61 | procedure BMPcheckboxChange(Sender: TObject); 62 | procedure gtQRCodeGenFMX1GenerateFinally(Sender: TObject); 63 | procedure gtQRCodeGenFMX1GenerateBefore(Sender: TObject; const x, 64 | y: Integer; const aQRCode: TBitmap; const sSVGfile: string); 65 | procedure gtQRCodeGenFMX1GenerateDuring(Sender: TObject; const x, 66 | y: Integer; const aQRCode: TBitmap; const sSVGfile: string); 67 | procedure gtQRCodeGenFMX1GenerateAfter(Sender: TObject; const x, y: Integer; 68 | const aQRCode: TBitmap; const sSVGfile: string); 69 | procedure gtQRCodeGenFMX1FillColor(const x, y: Integer; 70 | var sFillColorSVG: string; var TAlphaColorBMP: TAlphaColor); 71 | private 72 | 73 | public 74 | 75 | end; 76 | 77 | var 78 | viewMain: TviewMain; 79 | myBitmap: TBitmap; 80 | //myImage: TImage; 81 | //iCount: integer; 82 | iHeight, iWidth: integer; 83 | sSVGFileContent: string; 84 | 85 | implementation 86 | 87 | {$R *.fmx} 88 | 89 | {$DEFINE USE_SCANLINE} 90 | 91 | procedure TviewMain.btnGenClick(Sender: TObject); 92 | begin 93 | mLog.Lines.Clear; 94 | 95 | if trim(MemoData.Text) = '' then 96 | begin 97 | ShowMessage('Enter with QRCode data'); 98 | MemoData.SetFocus; 99 | exit; 100 | end; 101 | btnSave.Enabled := False; 102 | With gtQRCodeGenFMX1 do 103 | begin 104 | Data := Trim(MemoData.Text); 105 | Encoding := TQRCodeEncoding(edtEncoding.Selected.Index); 106 | QuietZone := StrToIntDef(edtQZone.Text,4); 107 | GenerateQRCode; 108 | end; 109 | end; 110 | 111 | procedure TviewMain.btnSaveClick(Sender: TObject); 112 | var tmpS: string; 113 | begin 114 | if qrSVG in gtQRCodeGenFMX1.MultiSelectFileFormat then 115 | begin 116 | SD.DefaultExt := '*.svg'; 117 | SD.Filter := 'SVG (*.svg)|*.svg'; 118 | if SD.Execute then 119 | begin 120 | TFile.WriteAllText(SD.FileName, sSVGFileContent); 121 | end; 122 | end; 123 | 124 | if ((qrBMP in gtQRCodeGenFMX1.MultiSelectFileFormat) and (not myBitmap.IsEmpty)) then 125 | begin 126 | SD.DefaultExt := '*.bmp'; 127 | SD.Filter := 'Bitmap (*.bmp)|*.bmp'; 128 | if SD.Execute then 129 | begin 130 | //Currently saves a 32 by 32 pixel file 131 | 132 | //If windows 133 | //if Pos('windows',TOSVersion.ToString)>0 then 134 | //begin 135 | //windows work around 136 | //end; 137 | 138 | myBitmap.SaveToFile(SD.FileName); 139 | end; 140 | end; 141 | end; 142 | 143 | procedure TviewMain.FormDestroy(Sender: TObject); 144 | begin 145 | myBitmap.Free; 146 | end; 147 | 148 | procedure TviewMain.FormShow(Sender: TObject); 149 | begin 150 | myBitmap := TBitmap.Create; 151 | 152 | if qrSVG in gtQRCodeGenFMX1.MultiSelectFileFormat then 153 | SVGcheckbox.IsChecked := true 154 | else 155 | SVGcheckbox.IsChecked := false; 156 | if qrBMP in gtQRCodeGenFMX1.MultiSelectFileFormat then 157 | BMPcheckbox.IsChecked := true 158 | else 159 | BMPcheckbox.IsChecked := false; 160 | edtQZone.Value := gtQRCodeGenFMX1.QuietZone; 161 | end; 162 | 163 | procedure TviewMain.gtQRCodeGenFMX1Error(Sender: TObject; Error: string); 164 | begin 165 | mLog.Lines.Add('An Error Occur: ' + Error); 166 | end; 167 | 168 | procedure TviewMain.gtQRCodeGenFMX1FillColor(const x, y: Integer; 169 | var sFillColorSVG: string; var TAlphaColorBMP: TAlphaColor); 170 | begin 171 | if sFillColorSVG = 'black' then sFillColorSVG := ColorComboBox1.Selected.Text; 172 | if TAlphaColorBMP = talphacolors.Black then TAlphaColorBMP := ColorComboBox1.Color; 173 | 174 | if sFillColorSVG = 'white' then sFillColorSVG := ColorComboBox2.Selected.Text; 175 | if TAlphaColorBMP = talphacolors.White then TAlphaColorBMP := ColorComboBox2.Color; 176 | end; 177 | 178 | procedure TviewMain.gtQRCodeGenFMX1GenerateAfter(Sender: TObject; const x, 179 | y: Integer; const aQRCode: TBitmap; const sSVGfile: string); 180 | //var rSrc: TRectF; 181 | // rDest: TRectF; 182 | begin 183 | //imgQRCode.Bitmap.Assign(aQRCode); 184 | 185 | myBitmap.Assign(aQRCode); 186 | sSVGFileContent := sSVGfile; 187 | MLog.Lines.Add(''); 188 | MLog.Lines.Add(sSVGfile); 189 | 190 | // RESIZE BITMAP 191 | { 192 | try 193 | iWidth := StrToInt(Trim(WidthEdit.Text)); 194 | iHeight := StrToInt(Trim(HeightEdit.Text)); 195 | 196 | myImage.Width := iWidth; 197 | myImage.Height := iHeight; 198 | 199 | myImage.Size.Width := iWidth; 200 | myImage.Size.Height := iHeight; 201 | 202 | //myImage.Bitmap.Canvas.SetSize(iWidth,iHeight); 203 | 204 | myImage.DisableInterpolation := true; 205 | myImage.WrapMode := TImageWrapMode.Stretch; // was iwStretch 206 | myImage.Bitmap.SetSize(aQRCode.Width, aQRCode.Height); 207 | rSrc := TRectF.Create(0, 0, aQRCode.Width, aQRCode.Height); 208 | rDest := TRectF.Create(0, 0, myImage.Bitmap.Width, myImage.Bitmap.Height); 209 | 210 | if myImage.Bitmap.Canvas.BeginScene then 211 | try 212 | myImage.Bitmap.Canvas.Clear(TAlphaColors.White); 213 | 214 | myImage.Bitmap.Canvas.DrawBitmap(aQRCode, rSrc, rDest, 1); 215 | finally 216 | myImage.Bitmap.Canvas.EndScene; 217 | 218 | iWidth := StrToInt(Trim(WidthEdit.Text)); 219 | iHeight := StrToInt(Trim(HeightEdit.Text)); 220 | 221 | //myImage.Bitmap.Width := iWidth; 222 | //myImage.Bitmap.Height := iHeight; 223 | //myImage.Bitmap.Canvas. 224 | //myImage.Bitmap.Resize(iWidth,iHeight); 225 | end; 226 | 227 | //tmpImage.Bitmap 228 | //myBitmap.Resize(1024,1024); 229 | //myImage.Bitmap.SaveToFile(SD.FileName); 230 | finally 231 | //tmpImage.Free; 232 | end; } 233 | end; 234 | 235 | procedure TviewMain.gtQRCodeGenFMX1GenerateBefore(Sender: TObject; const x, 236 | y: Integer; const aQRCode: TBitmap; const sSVGfile: string); 237 | begin 238 | //iCount := 0; 239 | 240 | iWidth := StrToInt(Trim(WidthEdit.Text)); 241 | iHeight := StrToInt(Trim(HeightEdit.Text)); 242 | 243 | imgQRCode.Height := iHeight; 244 | imgQRCode.Width := iWidth; 245 | end; 246 | 247 | procedure TviewMain.gtQRCodeGenFMX1GenerateDuring(Sender: TObject; const x, 248 | y: Integer; const aQRCode: TBitmap; const sSVGfile: string); 249 | var rSrc: TRectF; 250 | var rDest: TRectF; 251 | begin 252 | imgQRCode.DisableInterpolation := true; 253 | imgQRCode.WrapMode := TImageWrapMode.Stretch; // was iwStretch 254 | imgQRCode.Bitmap.SetSize(aQRCode.Width, aQRCode.Height); 255 | 256 | rSrc := TRectF.Create(0, 0, aQRCode.Width, aQRCode.Height); 257 | rDest := TRectF.Create(0, 0, imgQRCode.Bitmap.Width, imgQRCode.Bitmap.Height); 258 | 259 | if imgQRCode.Bitmap.Canvas.BeginScene then 260 | try 261 | imgQRCode.Bitmap.Canvas.Clear(TAlphaColors.White); 262 | 263 | imgQRCode.Bitmap.Canvas.DrawBitmap(aQRCode, rSrc, rDest, 1); 264 | finally 265 | imgQRCode.Bitmap.Canvas.EndScene; 266 | end; 267 | 268 | //inc(iCount); 269 | label4.Text := x.ToString; 270 | Label8.Text := y.ToString; 271 | end; 272 | 273 | procedure TviewMain.gtQRCodeGenFMX1GenerateFinally(Sender: TObject); 274 | begin 275 | mLog.Lines.Add('QRCode Generated'); 276 | btnSave.Enabled := True; 277 | end; 278 | 279 | procedure TviewMain.SVGcheckboxChange(Sender: TObject); 280 | begin 281 | if SVGcheckbox.IsChecked = true then 282 | gtQRCodeGenFMX1.MultiSelectFileFormat := gtQRCodeGenFMX1.MultiSelectFileFormat + [qrSVG] 283 | else 284 | gtQRCodeGenFMX1.MultiSelectFileFormat := gtQRCodeGenFMX1.MultiSelectFileFormat - [qrSVG]; 285 | end; 286 | 287 | procedure TviewMain.BMPcheckboxChange(Sender: TObject); 288 | begin 289 | if BMPcheckbox.IsChecked = true then 290 | gtQRCodeGenFMX1.MultiSelectFileFormat := gtQRCodeGenFMX1.MultiSelectFileFormat + [qrBMP] 291 | else 292 | gtQRCodeGenFMX1.MultiSelectFileFormat := gtQRCodeGenFMX1.MultiSelectFileFormat - [qrBMP]; 293 | end; 294 | 295 | end. 296 | -------------------------------------------------------------------------------- /gtDelphiZXingQRCode/LICENSE.md: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | 203 | -------------------------------------------------------------------------------- /gtDelphiZXingQRCode/TestApp/SampleFMXapp/view.main.fmx: -------------------------------------------------------------------------------- 1 | object viewMain: TviewMain 2 | Left = 0 3 | Top = 0 4 | Caption = 'gtQRCodeGenFMX' 5 | ClientHeight = 764 6 | ClientWidth = 788 7 | FormFactor.Width = 320 8 | FormFactor.Height = 480 9 | FormFactor.Devices = [Desktop] 10 | OnDestroy = FormDestroy 11 | OnShow = FormShow 12 | DesignerMasterStyle = 0 13 | object grpConfig: TGroupBox 14 | Align = MostTop 15 | Size.Width = 788.000000000000000000 16 | Size.Height = 401.000000000000000000 17 | Size.PlatformDefault = False 18 | Text = 'Settings' 19 | TabOrder = 0 20 | object edtEncoding: TComboBox 21 | Items.Strings = ( 22 | 'Auto' 23 | 'Numeric' 24 | 'Alphanumeric' 25 | 'ISO88591' 26 | 'UTF8NoBOM' 27 | 'UTF8BOM') 28 | ItemIndex = 0 29 | Position.X = 88.000000000000000000 30 | Position.Y = 257.000000000000000000 31 | Size.Width = 193.000000000000000000 32 | Size.Height = 22.000000000000000000 33 | Size.PlatformDefault = False 34 | TabOrder = 1 35 | end 36 | object Label2: TLabel 37 | Position.X = 16.000000000000000000 38 | Position.Y = 257.000000000000000000 39 | Size.Width = 89.000000000000000000 40 | Size.Height = 17.000000000000000000 41 | Size.PlatformDefault = False 42 | Text = 'Encoding' 43 | TabOrder = 2 44 | end 45 | object Label3: TLabel 46 | Position.X = 16.000000000000000000 47 | Position.Y = 287.000000000000000000 48 | Text = 'Quiet Zone' 49 | TabOrder = 3 50 | end 51 | object edtQZone: TSpinBox 52 | Touch.InteractiveGestures = [LongTap, DoubleTap] 53 | TabOrder = 4 54 | Cursor = crIBeam 55 | Min = 1.000000000000000000 56 | Max = 6.000000000000000000 57 | Value = 4.000000000000000000 58 | Position.X = 88.000000000000000000 59 | Position.Y = 287.000000000000000000 60 | Size.Width = 84.000000000000000000 61 | Size.Height = 22.000000000000000000 62 | Size.PlatformDefault = False 63 | end 64 | object btnGen: TButton 65 | Position.X = 25.000000000000000000 66 | Position.Y = 371.000000000000000000 67 | TabOrder = 0 68 | Text = 'Generate' 69 | OnClick = btnGenClick 70 | end 71 | object btnSave: TButton 72 | Enabled = False 73 | Position.X = 248.000000000000000000 74 | Position.Y = 371.000000000000000000 75 | Size.Width = 80.000000000000000000 76 | Size.Height = 22.000000000000000000 77 | Size.PlatformDefault = False 78 | TabOrder = 8 79 | Text = 'Save to File' 80 | OnClick = btnSaveClick 81 | end 82 | object HeightEdit: TEdit 83 | Touch.InteractiveGestures = [LongTap, DoubleTap] 84 | TabOrder = 36 85 | Text = '512' 86 | Position.X = 178.000000000000000000 87 | Position.Y = 317.000000000000000000 88 | Size.Width = 53.000000000000000000 89 | Size.Height = 22.000000000000000000 90 | Size.PlatformDefault = False 91 | end 92 | object Label4: TLabel 93 | Position.X = 130.000000000000000000 94 | Position.Y = 376.000000000000000000 95 | Size.Width = 42.000000000000000000 96 | Size.Height = 17.000000000000000000 97 | Size.PlatformDefault = False 98 | Text = 'Label4' 99 | TabOrder = 11 100 | end 101 | object Label5: TLabel 102 | Position.X = 16.000000000000000000 103 | Position.Y = 312.000000000000000000 104 | Size.Width = 56.000000000000000000 105 | Size.Height = 17.000000000000000000 106 | Size.PlatformDefault = False 107 | Text = 'Width' 108 | TabOrder = 38 109 | end 110 | object Label6: TLabel 111 | Position.X = 130.000000000000000000 112 | Position.Y = 312.000000000000000000 113 | Size.Width = 40.000000000000000000 114 | Size.Height = 17.000000000000000000 115 | Size.PlatformDefault = False 116 | Text = 'Height' 117 | TabOrder = 16 118 | end 119 | object WidthEdit: TEdit 120 | Touch.InteractiveGestures = [LongTap, DoubleTap] 121 | TabOrder = 39 122 | Text = '512' 123 | Position.X = 56.000000000000000000 124 | Position.Y = 317.000000000000000000 125 | Size.Width = 49.000000000000000000 126 | Size.Height = 22.000000000000000000 127 | Size.PlatformDefault = False 128 | end 129 | object MemoHints: TMemo 130 | Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] 131 | DataDetectorTypes = [] 132 | Lines.Strings = ( 133 | 'tel:+11234567890' 134 | '' 135 | 'Joining a Wi'#8209'Fi network' 136 | 137 | 'Common format: WIFI:S:;T:;P:;H:;;' 139 | 'Sample: WIFI:S:MySSID;T:WPA;P:MyPassW0rd;;' 140 | '' 141 | 'https://en.wikipedia.org/wiki/VCard' 142 | '' 143 | 'BEGIN:VCARD' 144 | 'VERSION:3.0' 145 | 'N:Lastname;Firstname' 146 | 'FN:Firstname Lastname' 147 | 'ORG:CompanyName' 148 | 'TITLE:JobTitle' 149 | 'ADR:;;123 Sesame St;SomeCity;CA;12345;USA' 150 | 'TEL;WORK;VOICE:1234567890' 151 | 'TEL;CELL:Mobile' 152 | 'TEL;FAX:' 153 | 'EMAIL;WORK;INTERNET:foo@email.com' 154 | 'URL:http://website.com' 155 | 'END:VCARD' 156 | '' 157 | 'BEGIN:VCARD' 158 | 'VERSION:2.1' 159 | 'N:Scott C. Dunn' 160 | 'ORG:Me' 161 | 'TITLE:Writer' 162 | 'TEL;MOBILE;VOICE:123-456-7890' 163 | 'ADR:123 No Name Street' 164 | 'Salt Lake City, Utah 84119' 165 | 'EMAIL:scott@scottcdunn.com' 166 | 'URL:https://steemit.com/@digitalfirehose' 167 | 'URL:https://medium.com/@scottcdunn' 168 | 'URL:https://thedigitalfirehose.blogspot.com/' 169 | 'END:VCARD' 170 | '' 171 | 'https://en.wikipedia.org/wiki/MeCard_(QR_code)' 172 | '' 173 | 'MECARD:N:Doe,John;TEL:13035551212;EMAIL:john.doe@example.com;;' 174 | '') 175 | Position.X = 527.000000000000000000 176 | Position.Y = 48.000000000000000000 177 | Size.Width = 253.000000000000000000 178 | Size.Height = 243.000000000000000000 179 | Size.PlatformDefault = False 180 | TabOrder = 40 181 | Viewport.Width = 233.000000000000000000 182 | Viewport.Height = 223.000000000000000000 183 | end 184 | object MemoData: TMemo 185 | Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] 186 | DataDetectorTypes = [] 187 | Lines.Strings = ( 188 | 'BEGIN:VCARD' 189 | 'VERSION:3.0' 190 | 'N:Lastname;Firstname' 191 | 'FN:Firstname Lastname' 192 | 'ORG:CompanyName' 193 | 'TITLE:JobTitle' 194 | 'ADR:;;123 Sesame St;SomeCity;CA;12345;USA' 195 | 'TEL;WORK;VOICE:1234567890' 196 | 'TEL;CELL:Mobile' 197 | 'TEL;FAX:' 198 | 'EMAIL;WORK;INTERNET:foo@email.com' 199 | 'URL:http://website.com' 200 | 'END:VCARD') 201 | Position.X = 8.000000000000000000 202 | Position.Y = 48.000000000000000000 203 | Size.Width = 511.000000000000000000 204 | Size.Height = 201.000000000000000000 205 | Size.PlatformDefault = False 206 | TabOrder = 41 207 | Viewport.Width = 491.000000000000000000 208 | Viewport.Height = 197.000000000000000000 209 | end 210 | object Label1: TLabel 211 | Position.X = 8.000000000000000000 212 | Position.Y = 23.000000000000000000 213 | Size.Width = 329.000000000000000000 214 | Size.Height = 17.000000000000000000 215 | Size.PlatformDefault = False 216 | Text = 'Enter QRcode text below:' 217 | TabOrder = 42 218 | end 219 | object Label7: TLabel 220 | Position.X = 527.000000000000000000 221 | Position.Y = 23.000000000000000000 222 | Size.Width = 253.000000000000000000 223 | Size.Height = 17.000000000000000000 224 | Size.PlatformDefault = False 225 | Text = 'Hints / Codes I'#39've found' 226 | TabOrder = 43 227 | end 228 | object SVGcheckbox: TCheckBox 229 | StyledSettings = [Family, Size, FontColor] 230 | Position.X = 537.000000000000000000 231 | Position.Y = 299.000000000000000000 232 | Size.Width = 147.000000000000000000 233 | Size.Height = 19.000000000000000000 234 | Size.PlatformDefault = False 235 | TabOrder = 44 236 | Text = 'Generate SVG File' 237 | TextSettings.Font.StyleExt = {00070000000000000004000000} 238 | OnChange = SVGcheckboxChange 239 | object BMPcheckbox: TCheckBox 240 | StyledSettings = [Family, Size, FontColor] 241 | Position.Y = 27.000000000000000000 242 | Size.Width = 147.000000000000000000 243 | Size.Height = 19.000000000000000000 244 | Size.PlatformDefault = False 245 | TabOrder = 25 246 | Text = 'Generate BMP File' 247 | TextSettings.Font.StyleExt = {00070000000000000004000000} 248 | OnChange = BMPcheckboxChange 249 | end 250 | end 251 | object Label8: TLabel 252 | Position.X = 180.000000000000000000 253 | Position.Y = 376.000000000000000000 254 | Size.Width = 49.000000000000000000 255 | Size.Height = 17.000000000000000000 256 | Size.PlatformDefault = False 257 | Text = 'Label8' 258 | TabOrder = 45 259 | end 260 | object Label9: TLabel 261 | Position.X = 130.000000000000000000 262 | Position.Y = 360.000000000000000000 263 | Size.Width = 26.000000000000000000 264 | Size.Height = 17.000000000000000000 265 | Size.PlatformDefault = False 266 | Text = 'X' 267 | TabOrder = 46 268 | object Label10: TLabel 269 | Position.X = 50.000000000000000000 270 | Size.Width = 26.000000000000000000 271 | Size.Height = 17.000000000000000000 272 | Size.PlatformDefault = False 273 | Text = 'Y' 274 | TabOrder = 35 275 | end 276 | end 277 | object Label11: TLabel 278 | Position.X = 296.000000000000000000 279 | Position.Y = 257.000000000000000000 280 | Size.Width = 73.000000000000000000 281 | Size.Height = 17.000000000000000000 282 | Size.PlatformDefault = False 283 | Text = 'Black Color:' 284 | TabOrder = 49 285 | end 286 | object ColorComboBox1: TColorComboBox 287 | DropDownKind = Custom 288 | Color = claBlack 289 | DisableFocusEffect = False 290 | ItemIndex = 7 291 | Position.X = 368.000000000000000000 292 | Position.Y = 257.000000000000000000 293 | Size.Width = 151.000000000000000000 294 | Size.Height = 22.000000000000000000 295 | Size.PlatformDefault = False 296 | TabOrder = 50 297 | end 298 | object Label12: TLabel 299 | Position.X = 296.000000000000000000 300 | Position.Y = 282.000000000000000000 301 | Size.Width = 73.000000000000000000 302 | Size.Height = 17.000000000000000000 303 | Size.PlatformDefault = False 304 | Text = 'White Color:' 305 | TabOrder = 47 306 | end 307 | object ColorComboBox2: TColorComboBox 308 | DropDownKind = Custom 309 | Color = claWhite 310 | DisableFocusEffect = False 311 | ItemIndex = 143 312 | Position.X = 368.000000000000000000 313 | Position.Y = 282.000000000000000000 314 | Size.Width = 151.000000000000000000 315 | Size.Height = 22.000000000000000000 316 | Size.PlatformDefault = False 317 | TabOrder = 48 318 | end 319 | end 320 | object mLog: TMemo 321 | Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] 322 | DataDetectorTypes = [] 323 | Align = MostBottom 324 | Margins.Left = 10.000000000000000000 325 | Margins.Right = 10.000000000000000000 326 | Position.X = 10.000000000000000000 327 | Position.Y = 613.000000000000000000 328 | Size.Width = 768.000000000000000000 329 | Size.Height = 151.000000000000000000 330 | Size.PlatformDefault = False 331 | TabOrder = 3 332 | Viewport.Width = 764.000000000000000000 333 | Viewport.Height = 147.000000000000000000 334 | end 335 | object SD: TSaveDialog 336 | DefaultExt = '*.bmp' 337 | Filter = 'Bitmap (*.bmp)|*.bmp' 338 | Left = 400 339 | Top = 96 340 | end 341 | object ScrollBox1: TScrollBox 342 | Align = Client 343 | Size.Width = 788.000000000000000000 344 | Size.Height = 212.000000000000000000 345 | Size.PlatformDefault = False 346 | TabOrder = 8 347 | Viewport.Width = 772.000000000000000000 348 | Viewport.Height = 212.000000000000000000 349 | object imgQRCode: TImage 350 | MultiResBitmap = < 351 | item 352 | end> 353 | DisableInterpolation = True 354 | Position.Y = 8.000000000000000000 355 | Size.Width = 621.000000000000000000 356 | Size.Height = 423.000000000000000000 357 | Size.PlatformDefault = False 358 | end 359 | end 360 | object gtQRCodeGenFMX1: TgtQRCodeGenFMX 361 | MultiSelectFileFormat = [qrSVG, qrBMP] 362 | UseInnerStyleSVG = False 363 | Encoding = qrAuto 364 | ErrorCorrectionLevel = 3 365 | QuietZone = 4 366 | ImageControl = imgQRCode 367 | ThreadSleep = 0 368 | OnGenerateBefore = gtQRCodeGenFMX1GenerateBefore 369 | OnGenerateDuring = gtQRCodeGenFMX1GenerateDuring 370 | OnGenerateAfter = gtQRCodeGenFMX1GenerateAfter 371 | OnError = gtQRCodeGenFMX1Error 372 | OnGenerateFinally = gtQRCodeGenFMX1GenerateFinally 373 | OnFillColor = gtQRCodeGenFMX1FillColor 374 | Left = 328 375 | Top = 176 376 | end 377 | end 378 | -------------------------------------------------------------------------------- /gtDelphiZXingQRCode/TestApp/SampleFMXwithSKIAapp/view.main.pas: -------------------------------------------------------------------------------- 1 | unit view.main; 2 | 3 | interface 4 | 5 | { 6 | 7 | TviewMain Skia4Delphi source code 8 | 9 | Skia4Delphi: https://github.com/skia4delphi/skia4delphi 10 | 11 | - The Android code maybe outdated 12 | 13 | There's no way with FMX (without a third-party library) that I can figure out how to save a stretched file without blurriness. 14 | 15 | Version 1.0 16 | 17 | - Problems with visualization of qrcode image, set DisableInterpolation := True on TImage control 18 | } 19 | 20 | uses 21 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 22 | System.IoUtils, 23 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ScrollBox, 24 | FMX.Memo, FMX.Objects, FMX.EditBox, FMX.SpinBox, FMX.ListBox, 25 | FMX.StdCtrls, FMX.Edit, FMX.Controls.Presentation, FMX.Memo.Types, 26 | gtQRCodeGenFMX, FMX.Layouts, FMX.Effects, FMX.Filter.Effects, FMX.Colors, 27 | Skia, Skia.FMX, gtCommandPrompt; 28 | 29 | 30 | type 31 | TviewMain = class(TForm) 32 | btnGen: TButton; 33 | grpConfig: TGroupBox; 34 | edtEncoding: TComboBox; 35 | Label2: TLabel; 36 | Label3: TLabel; 37 | edtQZone: TSpinBox; 38 | imgQRCode: TImage; 39 | mLog: TMemo; 40 | btnSave: TButton; 41 | SD: TSaveDialog; 42 | gtQRCodeGenFMX1: TgtQRCodeGenFMX; 43 | Label4: TLabel; 44 | WidthEdit: TEdit; 45 | Label5: TLabel; 46 | Label6: TLabel; 47 | HeightEdit: TEdit; 48 | ScrollBox1: TScrollBox; 49 | MemoHints: TMemo; 50 | MemoData: TMemo; 51 | Label1: TLabel; 52 | Label7: TLabel; 53 | SVGcheckbox: TCheckBox; 54 | BMPcheckbox: TCheckBox; 55 | Label8: TLabel; 56 | Label9: TLabel; 57 | Label10: TLabel; 58 | Label11: TLabel; 59 | ColorComboBox1: TColorComboBox; 60 | Label12: TLabel; 61 | ColorComboBox2: TColorComboBox; 62 | SkLabel1: TSkLabel; 63 | SkSvg1: TSkSvg; 64 | StopButton: TButton; 65 | DONATE: TButton; 66 | gtCommandPrompt1: TgtCommandPrompt; 67 | Label14: TLabel; 68 | Button1: TButton; 69 | maxspeedCheckbox: TCheckBox; 70 | Label13: TLabel; 71 | Label15: TLabel; 72 | procedure btnGenClick(Sender: TObject); 73 | procedure btnSaveClick(Sender: TObject); 74 | procedure gtQRCodeGenFMX1Error(Sender: TObject; Error: string); 75 | procedure FormDestroy(Sender: TObject); 76 | procedure FormShow(Sender: TObject); 77 | procedure SVGcheckboxChange(Sender: TObject); 78 | procedure BMPcheckboxChange(Sender: TObject); 79 | procedure gtQRCodeGenFMX1GenerateFinally(Sender: TObject); 80 | procedure gtQRCodeGenFMX1GenerateBefore(Sender: TObject; const x, 81 | y: Integer; const aQRCode: TBitmap; const sSVGfile: string); 82 | procedure gtQRCodeGenFMX1GenerateDuring(Sender: TObject; const x, 83 | y: Integer; const aQRCode: TBitmap; const sSVGfile: string); 84 | procedure gtQRCodeGenFMX1GenerateAfter(Sender: TObject; const x, y: Integer; 85 | const aQRCode: TBitmap; const sSVGfile: string); 86 | procedure gtQRCodeGenFMX1FillColor(const x, y: Integer; 87 | var sFillColorSVG: string; var TAlphaColorBMP: TAlphaColor); 88 | procedure StopButtonClick(Sender: TObject); 89 | procedure DONATEClick(Sender: TObject); 90 | procedure gtCommandPrompt1ReadCommandPrompt(OutPut: string); 91 | procedure Button1Click(Sender: TObject); 92 | private 93 | 94 | public 95 | 96 | end; 97 | 98 | type 99 | TMisc = class 100 | class procedure OpenURL(sCommand: string); 101 | end; 102 | 103 | var 104 | viewMain: TviewMain; 105 | myBitmap: TBitmap; 106 | //myImage: TImage; 107 | //iCount: integer; 108 | iHeight, iWidth, iButton: integer; 109 | sSVGFileContent: string; 110 | 111 | implementation 112 | 113 | {$R *.fmx} 114 | 115 | {$DEFINE USE_SCANLINE} 116 | 117 | class procedure TMisc.OpenURL(sCommand: string); 118 | begin 119 | {$IFDEF MSWINDOWS} 120 | //ShellExecute(0, 'OPEN', PChar(sCommand), '', '', SW_SHOWNORMAL); 121 | {$ENDIF MSWINDOWS} 122 | {$IFDEF POSIX} 123 | _system(PAnsiChar('open ' + AnsiString(sCommand))); 124 | {$ENDIF POSIX} 125 | end; 126 | 127 | procedure TviewMain.btnGenClick(Sender: TObject); 128 | begin 129 | mLog.Lines.Clear; 130 | 131 | if trim(MemoData.Text) = '' then 132 | begin 133 | ShowMessage('Enter with QRCode data'); 134 | MemoData.SetFocus; 135 | exit; 136 | end; 137 | StopButton.Enabled := true; 138 | btnSave.Enabled := False; 139 | btnGen.Enabled := false; 140 | With gtQRCodeGenFMX1 do 141 | begin 142 | Data := Trim(MemoData.Text); 143 | Encoding := TQRCodeEncoding(edtEncoding.Selected.Index); 144 | QuietZone := StrToIntDef(edtQZone.Text,4); 145 | GenerateQRCode; 146 | end; 147 | end; 148 | 149 | procedure TviewMain.btnSaveClick(Sender: TObject); 150 | //var tmpS: string; 151 | begin 152 | if qrSVG in gtQRCodeGenFMX1.MultiSelectFileFormat then 153 | begin 154 | SD.DefaultExt := '*.svg'; 155 | SD.Filter := 'SVG (*.svg)|*.svg'; 156 | if SD.Execute then 157 | begin 158 | TFile.WriteAllText(SD.FileName, sSVGFileContent); 159 | end; 160 | end; 161 | 162 | if ((qrBMP in gtQRCodeGenFMX1.MultiSelectFileFormat) and (not myBitmap.IsEmpty)) then 163 | begin 164 | SD.DefaultExt := '*.bmp'; 165 | SD.Filter := 'Bitmap (*.bmp)|*.bmp'; 166 | if SD.Execute then 167 | begin 168 | //Currently saves a 32 by 32 pixel file 169 | 170 | //If windows 171 | //if Pos('windows',TOSVersion.ToString)>0 then 172 | //begin 173 | //windows work around 174 | //end; 175 | 176 | myBitmap.SaveToFile(SD.FileName); 177 | end; 178 | end; 179 | end; 180 | 181 | procedure TviewMain.Button1Click(Sender: TObject); 182 | begin 183 | iButton := 2; 184 | gtCommandPrompt1.Start; 185 | end; 186 | 187 | procedure TviewMain.DONATEClick(Sender: TObject); 188 | begin 189 | iButton := 1; 190 | gtCommandPrompt1.Start; 191 | end; 192 | 193 | procedure TviewMain.FormDestroy(Sender: TObject); 194 | begin 195 | myBitmap.Free; 196 | end; 197 | 198 | procedure TviewMain.FormShow(Sender: TObject); 199 | begin 200 | iButton := 0; 201 | myBitmap := TBitmap.Create; 202 | gtQRCodeGenFMX1.UseInnerStyleSVG := false; /////////////////////////////////////////////////////////////////////////////// 203 | 204 | if qrSVG in gtQRCodeGenFMX1.MultiSelectFileFormat then 205 | SVGcheckbox.IsChecked := true 206 | else 207 | SVGcheckbox.IsChecked := false; 208 | if qrBMP in gtQRCodeGenFMX1.MultiSelectFileFormat then 209 | BMPcheckbox.IsChecked := true 210 | else 211 | BMPcheckbox.IsChecked := false; 212 | edtQZone.Value := gtQRCodeGenFMX1.QuietZone; 213 | end; 214 | 215 | procedure TviewMain.gtCommandPrompt1ReadCommandPrompt(OutPut: string); 216 | begin 217 | if iButton = 1 then 218 | gtCommandPrompt1.cmdWriteln('start https://www.timmons.pro/donate.php') 219 | else if iButton = 2 then 220 | gtCommandPrompt1.cmdWriteln('start https://github.com/War3Evo/gtDelphi/tree/master/gtDelphiZXingQRCode'); 221 | 222 | gtCommandPrompt1.Stop; 223 | end; 224 | 225 | procedure TviewMain.gtQRCodeGenFMX1Error(Sender: TObject; Error: string); 226 | begin 227 | mLog.Lines.Add('An Error Occur: ' + Error); 228 | end; 229 | 230 | procedure TviewMain.gtQRCodeGenFMX1FillColor(const x, y: Integer; 231 | var sFillColorSVG: string; var TAlphaColorBMP: TAlphaColor); 232 | begin 233 | //mLog.Lines.Add('sFillColorSVG before ' + sFillColorSVG); 234 | if ColorComboBox1.ItemIndex > -1 then 235 | if sFillColorSVG = 'black' then sFillColorSVG := ColorComboBox1.Items[ColorComboBox1.ItemIndex].Trim.ToLower; 236 | //mLog.Lines.Add('sFillColorSVG after ' + sFillColorSVG); 237 | if TAlphaColorBMP = TAlphaColorRec.Black then TAlphaColorBMP := ColorComboBox1.Color; 238 | 239 | if ColorComboBox2.ItemIndex > -1 then 240 | if sFillColorSVG = 'white' then sFillColorSVG := ColorComboBox2.Items[ColorComboBox2.ItemIndex].Trim.ToLower; 241 | if TAlphaColorBMP = TAlphaColorRec.White then TAlphaColorBMP := ColorComboBox2.Color; 242 | end; 243 | 244 | procedure TviewMain.gtQRCodeGenFMX1GenerateAfter(Sender: TObject; const x, 245 | y: Integer; const aQRCode: TBitmap; const sSVGfile: string); 246 | //var rSrc: TRectF; 247 | // rDest: TRectF; 248 | begin 249 | //imgQRCode.Bitmap.Assign(aQRCode); 250 | //tmpStr := sSVGfile + ''; 251 | //SkSvg1.Svg.WrapMode := TSkSvgWrapMode.Fit; 252 | //SkSvg1.Svg.Source := sSVGfile; 253 | 254 | myBitmap.Assign(aQRCode); 255 | sSVGFileContent := sSVGfile; 256 | 257 | SkSvg1.Svg.WrapMode := TSkSvgWrapMode.Fit; 258 | //SkSvg1.Svg. 259 | SkSvg1.Svg.Source := sSVGfile; 260 | //SkSvg1.Parent := self; 261 | 262 | //MLog.Lines.Add(''); 263 | //MLog.Lines.Add(sSVGfile); 264 | 265 | // RESIZE BITMAP 266 | { 267 | try 268 | iWidth := StrToInt(Trim(WidthEdit.Text)); 269 | iHeight := StrToInt(Trim(HeightEdit.Text)); 270 | 271 | myImage.Width := iWidth; 272 | myImage.Height := iHeight; 273 | 274 | myImage.Size.Width := iWidth; 275 | myImage.Size.Height := iHeight; 276 | 277 | //myImage.Bitmap.Canvas.SetSize(iWidth,iHeight); 278 | 279 | myImage.DisableInterpolation := true; 280 | myImage.WrapMode := TImageWrapMode.Stretch; // was iwStretch 281 | myImage.Bitmap.SetSize(aQRCode.Width, aQRCode.Height); 282 | rSrc := TRectF.Create(0, 0, aQRCode.Width, aQRCode.Height); 283 | rDest := TRectF.Create(0, 0, myImage.Bitmap.Width, myImage.Bitmap.Height); 284 | 285 | if myImage.Bitmap.Canvas.BeginScene then 286 | try 287 | myImage.Bitmap.Canvas.Clear(TAlphaColors.White); 288 | 289 | myImage.Bitmap.Canvas.DrawBitmap(aQRCode, rSrc, rDest, 1); 290 | finally 291 | myImage.Bitmap.Canvas.EndScene; 292 | 293 | iWidth := StrToInt(Trim(WidthEdit.Text)); 294 | iHeight := StrToInt(Trim(HeightEdit.Text)); 295 | 296 | //myImage.Bitmap.Width := iWidth; 297 | //myImage.Bitmap.Height := iHeight; 298 | //myImage.Bitmap.Canvas. 299 | //myImage.Bitmap.Resize(iWidth,iHeight); 300 | end; 301 | 302 | //tmpImage.Bitmap 303 | //myBitmap.Resize(1024,1024); 304 | //myImage.Bitmap.SaveToFile(SD.FileName); 305 | finally 306 | //tmpImage.Free; 307 | end; } 308 | end; 309 | 310 | procedure TviewMain.gtQRCodeGenFMX1GenerateBefore(Sender: TObject; const x, 311 | y: Integer; const aQRCode: TBitmap; const sSVGfile: string); 312 | begin 313 | //iCount := 0; 314 | 315 | iWidth := StrToInt(Trim(WidthEdit.Text)); 316 | iHeight := StrToInt(Trim(HeightEdit.Text)); 317 | 318 | imgQRCode.Height := iHeight; 319 | imgQRCode.Width := iWidth; 320 | end; 321 | 322 | procedure TviewMain.gtQRCodeGenFMX1GenerateDuring(Sender: TObject; const x, 323 | y: Integer; const aQRCode: TBitmap; const sSVGfile: string); 324 | var rSrc: TRectF; 325 | rDest: TRectF; 326 | tmpStr: string; 327 | begin 328 | if maxspeedCheckbox.IsChecked = true then 329 | begin 330 | //inc(iCount); 331 | label4.Text := x.ToString; 332 | Label8.Text := y.ToString; 333 | exit; 334 | end; 335 | 336 | imgQRCode.DisableInterpolation := true; 337 | imgQRCode.WrapMode := TImageWrapMode.Stretch; // was iwStretch 338 | imgQRCode.Bitmap.SetSize(aQRCode.Width, aQRCode.Height); 339 | 340 | rSrc := TRectF.Create(0, 0, aQRCode.Width, aQRCode.Height); 341 | rDest := TRectF.Create(0, 0, imgQRCode.Bitmap.Width, imgQRCode.Bitmap.Height); 342 | 343 | if imgQRCode.Bitmap.Canvas.BeginScene then 344 | try 345 | imgQRCode.Bitmap.Canvas.Clear(TAlphaColors.White); 346 | 347 | imgQRCode.Bitmap.Canvas.DrawBitmap(aQRCode, rSrc, rDest, 1); 348 | finally 349 | imgQRCode.Bitmap.Canvas.EndScene; 350 | end; 351 | 352 | tmpStr := sSVGfile + ''; 353 | //SkSvg1.Svg.Source := tmpStr; 354 | 355 | SkSvg1.Svg.WrapMode := TSkSvgWrapMode.Fit; 356 | //SkSvg1.Svg. 357 | SkSvg1.Svg.Source := tmpStr; 358 | //SkSvg1.Parent := self; 359 | 360 | //inc(iCount); 361 | label4.Text := x.ToString; 362 | Label8.Text := y.ToString; 363 | end; 364 | 365 | procedure TviewMain.gtQRCodeGenFMX1GenerateFinally(Sender: TObject); 366 | begin 367 | mLog.Lines.Add('QRCode Generated'); 368 | btnSave.Enabled := True; 369 | btnGen.Enabled := true; 370 | StopButton.Enabled := false; 371 | end; 372 | 373 | procedure TviewMain.StopButtonClick(Sender: TObject); 374 | begin 375 | mLog.Lines.Add('STOPPED'); 376 | gtQRCodeGenFMX1.Stop; 377 | StopButton.Enabled := false; 378 | btnGen.Enabled := true; 379 | end; 380 | 381 | procedure TviewMain.SVGcheckboxChange(Sender: TObject); 382 | begin 383 | if SVGcheckbox.IsChecked = true then 384 | gtQRCodeGenFMX1.MultiSelectFileFormat := gtQRCodeGenFMX1.MultiSelectFileFormat + [qrSVG] 385 | else 386 | gtQRCodeGenFMX1.MultiSelectFileFormat := gtQRCodeGenFMX1.MultiSelectFileFormat - [qrSVG]; 387 | end; 388 | 389 | procedure TviewMain.BMPcheckboxChange(Sender: TObject); 390 | begin 391 | if BMPcheckbox.IsChecked = true then 392 | gtQRCodeGenFMX1.MultiSelectFileFormat := gtQRCodeGenFMX1.MultiSelectFileFormat + [qrBMP] 393 | else 394 | gtQRCodeGenFMX1.MultiSelectFileFormat := gtQRCodeGenFMX1.MultiSelectFileFormat - [qrBMP]; 395 | end; 396 | 397 | end. 398 | -------------------------------------------------------------------------------- /gtDelphiZXingQRCode/Source/gtQRCodeGenFMX.pas: -------------------------------------------------------------------------------- 1 | unit gtQRCodeGenFMX; 2 | 3 | interface 4 | 5 | uses 6 | System.SysUtils, 7 | System.Classes, 8 | System.Types, 9 | System.UITypes, 10 | FMX.DelphiZXIngQRCode, 11 | FMX.Graphics, 12 | FMX.Objects; 13 | 14 | type 15 | TQRCodeEncoding = (qrAuto, qrNumeric, qrAlphanumeric, qrISO88591, qrUTF8NoBOM, qrUTF8BOM); 16 | 17 | TQRCodeFileFormat = set of (qrSVG, qrBMP); // choose to create one or both at the same time 18 | 19 | TOnFillColor = procedure(const x,y: integer; var sFillColorSVG: string; var TAlphaColorBMP: TAlphaColor) of object; 20 | 21 | //TOnGenerate = procedure(Sender: TObject; Tempo: Integer; const aQRCode: TBitmap) of object; 22 | 23 | TOnGenerate = procedure(Sender: TObject; const x,y: integer; const aQRCode: TBitmap; const sSVGfile: string) of object; 24 | TOnError = procedure(Sender: TObject; Error: String) of object; 25 | TOnFinish = procedure(Sender: TObject) of object; 26 | 27 | TOnLoad = procedure(Sender: TObject) of object; 28 | 29 | // Add threading 30 | TTmonitorUpdate = procedure(const Phase: integer; const Error: String; const x,y: integer; const aQRCode: TBitmap; const sSVGfile: string) of object; 31 | 32 | TThreadingQRCodeGen = class(TThread) // pipe monitoring thread for console output 33 | private 34 | iThreadSleep: Cardinal; 35 | iPhase: integer; 36 | ErrorString: String; 37 | TTFQRBitmap: TBitmap; 38 | FTTmonitorUpdate: TTmonitorUpdate; 39 | 40 | sThreadSVGfile: String; 41 | FThreadQRCodeFileFormat: TQRCodeFileFormat; 42 | FThreadUseInnerStyleSVG: boolean; 43 | FTOnFillColor: TOnFillColor; 44 | FsFillColor: string; 45 | FiFillColorX: integer; 46 | FiFillColorY: integer; 47 | FThreadbCanChangeFillColor: boolean; 48 | FTAlphaColorBMP: TAlphaColor; 49 | 50 | FQR: TDelphiZXingQRCode; //where the magic happens 51 | 52 | procedure UpdateComponent; 53 | procedure UpdateFillColor; 54 | protected 55 | procedure Execute; override; 56 | public 57 | property OnUpdateComponent: TTmonitorUpdate read FTTmonitorUpdate write FTTmonitorUpdate; 58 | property OnFillColorUpdateComponent: TOnFillColor read FTOnFillColor write FTOnFillColor; 59 | end; 60 | 61 | TgtQRCodeGenFMX = class(TComponent) 62 | private 63 | FThreadDone: Boolean; 64 | FThreadSleep: Cardinal; 65 | 66 | FComponentThread: TThreadingQRCodeGen; 67 | 68 | FQRCodeFileFormat: TQRCodeFileFormat; 69 | FUseInnerStyleSVG: boolean; 70 | FOnFillColor: TOnFillColor; 71 | FbCanChangeFillColor: boolean; 72 | 73 | FOnLoad: TOnLoad; 74 | 75 | FData: String; //QR code information 76 | FEncoding: TQRCodeEncoding; //Kind of text 77 | FqrErrorCorrectionLevel: integer; 78 | FQZone: Integer; //QR Code "Edge" 79 | //FQRBitmap: TBitmap; //LINK - Bitmap for QR code return // make the program have it's own bitmap & save memory 80 | FImageControl: TImage; //LINK - control for displaying the QR Code 81 | FOnError: TOnError; 82 | FOnFinish: TOnFinish; 83 | FOnGenerateBefore: TOnGenerate; 84 | FOnGenerateDuring: TOnGenerate; 85 | FOnGenerateAfter: TOnGenerate; 86 | procedure DoGenQRCode(const aQRCode: TBitmap); 87 | procedure setImageControl(const Value: TImage); 88 | 89 | procedure OnThreadUpdate(const Phase: integer; const Error: String; const x,y: integer; const aQRCode: TBitmap; const sSVGfile: string); 90 | procedure OnThreadFillColorUpdate(const x,y: integer; var sFillColorSVG: string; var TAlphaColorBMP: TAlphaColor); 91 | protected 92 | procedure DoOnError(ErrorMsg: String); 93 | procedure fDoSetErrorCorrectionLevel(value: integer); 94 | public 95 | constructor Create(aOwner: TComponent); override; 96 | //destructor Destroy; override; 97 | procedure GenerateQRCode; 98 | procedure Stop; 99 | published 100 | property MultiSelectFileFormat: TQRCodeFileFormat read FQRCodeFileFormat write FQRCodeFileFormat; 101 | 102 | property UseInnerStyleSVG: boolean read FUseInnerStyleSVG write FUseInnerStyleSVG; 103 | 104 | property CanChangeFillColor: boolean read FbCanChangeFillColor write FbCanChangeFillColor default false; 105 | 106 | property Data: String read FData write FData; 107 | property Encoding: TQRCodeEncoding read FEncoding write FEncoding; 108 | property ErrorCorrectionLevel: integer read FqrErrorCorrectionLevel write fDoSetErrorCorrectionLevel; 109 | property QuietZone: Integer read FQZone write FQZone; 110 | property ImageControl: TImage read FImageControl write setImageControl; 111 | 112 | property ThreadSleep: Cardinal read FThreadSleep write FThreadSleep default 40; 113 | 114 | property OnGenerateBefore: TOnGenerate read FOnGenerateBefore write FOnGenerateBefore; // before execute of thread 115 | property OnGenerateDuring: TOnGenerate read FOnGenerateDuring write FOnGenerateDuring; // As the Bitmap is updated 116 | property OnGenerateAfter: TOnGenerate read FOnGenerateAfter write FOnGenerateAfter; // Done 117 | property OnError: TOnError read FOnError write FOnError; 118 | property OnGenerateFinally: TOnFinish read FOnFinish write FOnFinish; 119 | property OnFillColor: TOnFillColor read FOnFillColor write FOnFillColor; // only if CanChangeFillColor is true 120 | property OnLoad: TOnLoad read FOnLoad write FOnLoad; 121 | end; 122 | 123 | procedure Register; 124 | 125 | implementation 126 | 127 | procedure Register; 128 | begin 129 | RegisterComponents('gtDelphi', [TgtQRCodeGenFMX]); 130 | end; 131 | 132 | { TThreadingQRCodeGen } 133 | 134 | procedure TThreadingQRCodeGen.Execute; 135 | { Threading the QRCode } 136 | var 137 | bitdata: TBitmapData; 138 | Col, Row: Integer; 139 | PixelC: TAlphaColor; 140 | FillString: string; 141 | begin 142 | sThreadSVGfile := ''; 143 | try 144 | TTFQRBitmap := TBitmap.Create; 145 | iPhase := 1; // before 146 | Synchronize(UpdateComponent); 147 | sleep(iThreadSleep); 148 | try 149 | TTFQRBitmap.SetSize(FQR.Rows, FQR.Columns); 150 | if qrSVG in FThreadQRCodeFileFormat then 151 | sThreadSVGfile := sThreadSVGfile + ''; 152 | iPhase := 2; // during 153 | for Row := 0 to Pred(FQR.Rows) do 154 | begin 155 | if Terminated = true then exit; 156 | FiFillColorX := Row; 157 | for Col := 0 to Pred(FQR.Columns) do 158 | begin 159 | if Terminated = true then exit; 160 | FiFillColorY := Col; 161 | if qrSVG in FThreadQRCodeFileFormat then 162 | begin 163 | if FQR.IsBlack[Row,Col] then 164 | FillString := 'black' 165 | else 166 | FillString := 'white'; 167 | // Ability to change Fill Color 168 | //if FThreadbCanChangeFillColor = true then //May use this if the other doesn't work 169 | if assigned(FTOnFillColor) then 170 | begin 171 | // Assign Fill color 172 | FsFillColor := FillString; 173 | Synchronize(UpdateFillColor); 174 | // Reassign Fill color 175 | FillString := FsFillColor; 176 | end; 177 | // Create SVG Rect 178 | sThreadSVGfile := sThreadSVGfile + ''; 188 | end 189 | else 190 | begin // To be compatible with Skia4Delphi (Credit to viniciusfbb https://github.com/viniciusfbb) 191 | sThreadSVGfile := sThreadSVGfile + 'fill="' + FillString + '" '; 192 | sThreadSVGfile := sThreadSVGfile + 'stroke="' + FillString + '" '; 193 | sThreadSVGfile := sThreadSVGfile + 'stroke-width="1" />'; 194 | end; 195 | end; 196 | 197 | if qrBMP in FThreadQRCodeFileFormat then 198 | begin 199 | if FQR.IsBlack[Row,Col] then 200 | PixelC := talphacolors.Black 201 | else 202 | PixelC := talphacolors.White; 203 | if assigned(FTOnFillColor) then 204 | begin 205 | // Assign Fill color 206 | FTAlphaColorBMP := PixelC; 207 | Synchronize(UpdateFillColor); 208 | // Reassign Fill color 209 | PixelC:= FTAlphaColorBMP; 210 | end; 211 | if TTFQRBitmap.Map(TMapAccess.Write, bitdata) then 212 | begin 213 | Try 214 | bitdata.SetPixel(Col,Row, PixelC); 215 | Finally 216 | TTFQRBitmap.Unmap(bitdata); 217 | End; 218 | end; 219 | end; 220 | Synchronize(UpdateComponent); 221 | sleep(iThreadSleep); 222 | end; 223 | Synchronize(UpdateComponent); 224 | sleep(iThreadSleep); 225 | end; 226 | if qrSVG in FThreadQRCodeFileFormat then 227 | sThreadSVGfile := sThreadSVGfile + ''; 228 | except on E:Exception do 229 | ErrorString := 'Code could not be created (' + E.Message + ')'; 230 | end; 231 | 232 | iPhase := 3; // after 233 | Synchronize(UpdateComponent); 234 | sleep(iThreadSleep); 235 | finally 236 | TTFQRBitmap.Free; 237 | FQR.Free; 238 | end; 239 | //Synchronize(UpdateComponent); 240 | //sleep(iThreadSleep); 241 | //end; 242 | end; 243 | 244 | procedure TThreadingQRCodeGen.UpdateComponent; 245 | // synchronize procedure for thread 246 | begin 247 | if assigned(FTTmonitorUpdate) = true then 248 | FTTmonitorUpdate(iPhase, ErrorString, FiFillColorX, FiFillColorY, TTFQRBitmap, sThreadSVGfile); 249 | // clear buffer 250 | ErrorString := ''; 251 | end; 252 | 253 | procedure TThreadingQRCodeGen.UpdateFillColor; 254 | // synchronize procedure for thread 255 | begin 256 | if assigned(FTOnFillColor) = true then 257 | FTOnFillColor(FiFillColorX,FiFillColorY,FsFillColor,FTAlphaColorBMP); 258 | end; 259 | 260 | procedure TgtQRCodeGenFMX.fDoSetErrorCorrectionLevel(value: integer); 261 | begin 262 | if (value < 0) then 263 | begin 264 | FqrErrorCorrectionLevel:=0; 265 | end 266 | else if (value > 3) then 267 | begin 268 | FqrErrorCorrectionLevel:=3; 269 | end 270 | else FqrErrorCorrectionLevel := value; 271 | end; 272 | 273 | { TgtQRCodeGenFMX & TThreadingQRCodeGen } 274 | 275 | procedure TgtQRCodeGenFMX.OnThreadUpdate(const Phase: integer; const Error: String; const x,y: integer; const aQRCode: TBitmap; const sSVGfile: string); 276 | // synchronize procedure for thread 277 | begin 278 | if (Phase = 1) and (assigned(FOnGenerateBefore) = true) then 279 | FOnGenerateBefore(self,x,y,aQRCode,sSVGfile); 280 | if (Phase = 2) and (assigned(FOnGenerateDuring) = true) then 281 | FOnGenerateDuring(self,x,y,aQRCode,sSVGfile); 282 | if (Phase = 3) and (assigned(FOnGenerateAfter) = true) then 283 | begin 284 | FOnGenerateAfter(self,x,y,aQRCode,sSVGfile); 285 | DoGenQRCode(aQRCode); 286 | end; 287 | 288 | if assigned(FOnError) = true then 289 | if Error <> '' then FOnError(self, String(Error)); 290 | end; 291 | 292 | procedure TgtQRCodeGenFMX.OnThreadFillColorUpdate(const x,y: integer; var sFillColorSVG: string; var TAlphaColorBMP: TAlphaColor); 293 | begin 294 | if assigned(FOnFillColor) = true then 295 | begin 296 | FOnFillColor(x,y,sFillColorSVG,TAlphaColorBMP); 297 | end; 298 | end; 299 | 300 | { TgtQRCodeGenFMX } 301 | 302 | constructor TgtQRCodeGenFMX.Create(aOwner: TComponent); 303 | begin 304 | inherited Create(aOwner); 305 | FbCanChangeFillColor := false; // unused right now 306 | FUseInnerStyleSVG := true; // change to false if using Skia4Delphi 307 | FQRCodeFileFormat := [qrSVG]; 308 | FThreadDone := true; 309 | FThreadSleep := 40; 310 | if assigned(FOnLoad) then 311 | FOnLoad(aOwner); 312 | end; 313 | 314 | {destructor TgtQRCodeGenFMX.Destroy; 315 | begin 316 | inherited; 317 | end;} 318 | 319 | procedure TgtQRCodeGenFMX.DoGenQRCode(const aQRCode: TBitmap); 320 | begin 321 | try 322 | try 323 | if Assigned(FImageControl) then //linked control, so it already displays the result 324 | begin 325 | var rSrc: TRectF; 326 | var rDest: TRectF; 327 | FImageControl.DisableInterpolation := true; 328 | FImageControl.WrapMode := TImageWrapMode.Stretch; // was iwStretch 329 | FImageControl.Bitmap.SetSize(aQRCode.Width, aQRCode.Height); 330 | 331 | rSrc := TRectF.Create(0, 0, aQRCode.Width, aQRCode.Height); 332 | rDest := TRectF.Create(0, 0, FImageControl.Bitmap.Width, FImageControl.Bitmap.Height); 333 | 334 | if FImageControl.Bitmap.Canvas.BeginScene then 335 | try 336 | FImageControl.Bitmap.Canvas.Clear(TAlphaColors.White); 337 | 338 | FImageControl.Bitmap.Canvas.DrawBitmap(aQRCode, rSrc, rDest, 1); 339 | finally 340 | FImageControl.Bitmap.Canvas.EndScene; 341 | end; 342 | end; 343 | except on E:Exception do 344 | DoOnError('Code could not be created (' + E.Message + ')'); 345 | end; 346 | finally 347 | if Assigned(FOnFinish) = true then 348 | FOnFinish(Self); 349 | end; 350 | end; 351 | 352 | procedure TgtQRCodeGenFMX.DoOnError(ErrorMsg: String); 353 | begin 354 | if Assigned(FOnError) = true then 355 | FOnError(Self, ErrorMsg); 356 | end; 357 | 358 | procedure TgtQRCodeGenFMX.GenerateQRCode; 359 | begin 360 | FComponentThread := TThreadingQRCodeGen.Create(true); // don't start yet monitor thread; 361 | try 362 | FComponentThread.FThreadQRCodeFileFormat := FQRCodeFileFormat; 363 | FComponentThread.FThreadUseInnerStyleSVG := FUseInnerStyleSVG; 364 | FComponentThread.FThreadbCanChangeFillColor := FbCanChangeFillColor; 365 | FComponentThread.FQR := TDelphiZXingQRCode.Create; 366 | FComponentThread.FQR.Data := FData; 367 | FComponentThread.FQR.Encoding := FMX.DelphiZXIngQRCode.TQRCodeEncoding(Ord(FEncoding)); 368 | FComponentThread.FQR.QuietZone := FQZone; 369 | FComponentThread.FQR.ErrorCorrectionLevel := FqrErrorCorrectionLevel; 370 | FComponentThread.Priority := tpHigher; 371 | FComponentThread.iThreadSleep := FThreadSleep; // default is 40 372 | FComponentThread.FreeOnTerminate := true; 373 | FComponentThread.OnUpdateComponent := OnThreadUpdate; 374 | FComponentThread.OnFillColorUpdateComponent := OnThreadFillColorUpdate; 375 | FThreadDone := false; 376 | FComponentThread.Start; // start thread; 377 | except 378 | FComponentThread.Free; 379 | Raise Exception.Create('Could not create monitor thread!'); 380 | end; 381 | end; 382 | 383 | procedure TgtQRCodeGenFMX.Stop; 384 | begin 385 | if FComponentThread.Terminated = false then FComponentThread.Terminate; 386 | FThreadDone := true; 387 | end; 388 | 389 | procedure TgtQRCodeGenFMX.setImageControl(const Value: TImage); 390 | begin 391 | FImageControl := Value; 392 | end; 393 | 394 | end. 395 | -------------------------------------------------------------------------------- /gtDelphiZXingQRCode/TestApp/SampleFMXwithSKIAapp/view.main.fmx: -------------------------------------------------------------------------------- 1 | object viewMain: TviewMain 2 | Left = 0 3 | Top = 0 4 | Caption = 'gtQRCodeFMX_Skia' 5 | ClientHeight = 743 6 | ClientWidth = 762 7 | FormFactor.Width = 320 8 | FormFactor.Height = 480 9 | FormFactor.Devices = [Desktop] 10 | OnDestroy = FormDestroy 11 | OnShow = FormShow 12 | DesignerMasterStyle = 0 13 | object grpConfig: TGroupBox 14 | Align = MostTop 15 | Size.Width = 762.000000000000000000 16 | Size.Height = 369.000000000000000000 17 | Size.PlatformDefault = False 18 | Text = 'Settings' 19 | TabOrder = 0 20 | object edtEncoding: TComboBox 21 | Items.Strings = ( 22 | 'Auto' 23 | 'Numeric' 24 | 'Alphanumeric' 25 | 'ISO88591' 26 | 'UTF8NoBOM' 27 | 'UTF8BOM') 28 | ItemIndex = 0 29 | Position.X = 88.000000000000000000 30 | Position.Y = 257.000000000000000000 31 | Size.Width = 193.000000000000000000 32 | Size.Height = 22.000000000000000000 33 | Size.PlatformDefault = False 34 | TabOrder = 1 35 | end 36 | object Label2: TLabel 37 | Position.X = 16.000000000000000000 38 | Position.Y = 257.000000000000000000 39 | Size.Width = 89.000000000000000000 40 | Size.Height = 17.000000000000000000 41 | Size.PlatformDefault = False 42 | Text = 'Encoding' 43 | TabOrder = 2 44 | end 45 | object Label3: TLabel 46 | Position.X = 16.000000000000000000 47 | Position.Y = 287.000000000000000000 48 | Text = 'Quiet Zone' 49 | TabOrder = 3 50 | end 51 | object edtQZone: TSpinBox 52 | Touch.InteractiveGestures = [LongTap, DoubleTap] 53 | TabOrder = 4 54 | Cursor = crIBeam 55 | Min = 1.000000000000000000 56 | Max = 6.000000000000000000 57 | Value = 4.000000000000000000 58 | Position.X = 88.000000000000000000 59 | Position.Y = 287.000000000000000000 60 | Size.Width = 84.000000000000000000 61 | Size.Height = 22.000000000000000000 62 | Size.PlatformDefault = False 63 | end 64 | object btnGen: TButton 65 | Position.X = 372.000000000000000000 66 | Position.Y = 309.000000000000000000 67 | Size.Width = 125.000000000000000000 68 | Size.Height = 22.000000000000000000 69 | Size.PlatformDefault = False 70 | TabOrder = 0 71 | Text = 'Generate' 72 | OnClick = btnGenClick 73 | end 74 | object btnSave: TButton 75 | Enabled = False 76 | Position.X = 372.000000000000000000 77 | Position.Y = 339.000000000000000000 78 | Size.Width = 125.000000000000000000 79 | Size.Height = 22.000000000000000000 80 | Size.PlatformDefault = False 81 | TabOrder = 8 82 | Text = 'Save to File' 83 | OnClick = btnSaveClick 84 | end 85 | object HeightEdit: TEdit 86 | Touch.InteractiveGestures = [LongTap, DoubleTap] 87 | TabOrder = 36 88 | Text = '256' 89 | Position.X = 178.000000000000000000 90 | Position.Y = 317.000000000000000000 91 | Enabled = False 92 | Size.Width = 53.000000000000000000 93 | Size.Height = 22.000000000000000000 94 | Size.PlatformDefault = False 95 | end 96 | object Label4: TLabel 97 | Position.X = 527.000000000000000000 98 | Position.Y = 270.000000000000000000 99 | Size.Width = 42.000000000000000000 100 | Size.Height = 17.000000000000000000 101 | Size.PlatformDefault = False 102 | Text = 'Label4' 103 | TabOrder = 11 104 | end 105 | object Label5: TLabel 106 | Position.X = 16.000000000000000000 107 | Position.Y = 312.000000000000000000 108 | Size.Width = 56.000000000000000000 109 | Size.Height = 17.000000000000000000 110 | Size.PlatformDefault = False 111 | Text = 'Width' 112 | TabOrder = 38 113 | end 114 | object Label6: TLabel 115 | Position.X = 130.000000000000000000 116 | Position.Y = 312.000000000000000000 117 | Size.Width = 40.000000000000000000 118 | Size.Height = 17.000000000000000000 119 | Size.PlatformDefault = False 120 | Text = 'Height' 121 | TabOrder = 16 122 | end 123 | object WidthEdit: TEdit 124 | Touch.InteractiveGestures = [LongTap, DoubleTap] 125 | TabOrder = 39 126 | Text = '256' 127 | Position.X = 56.000000000000000000 128 | Position.Y = 317.000000000000000000 129 | Enabled = False 130 | Size.Width = 49.000000000000000000 131 | Size.Height = 22.000000000000000000 132 | Size.PlatformDefault = False 133 | end 134 | object MemoHints: TMemo 135 | Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] 136 | DataDetectorTypes = [] 137 | Lines.Strings = ( 138 | 'tel:+11234567890' 139 | '' 140 | 'Joining a Wi'#8209'Fi network' 141 | 142 | 'Common format: WIFI:S:;T:;P:;H:;;' 144 | 'Sample: WIFI:S:MySSID;T:WPA;P:MyPassW0rd;;' 145 | '' 146 | 'https://en.wikipedia.org/wiki/VCard' 147 | '' 148 | 'BEGIN:VCARD' 149 | 'VERSION:3.0' 150 | 'N:Lastname;Firstname' 151 | 'FN:Firstname Lastname' 152 | 'ORG:CompanyName' 153 | 'TITLE:JobTitle' 154 | 'ADR:;;123 Sesame St;SomeCity;CA;12345;USA' 155 | 'TEL;WORK;VOICE:1234567890' 156 | 'TEL;CELL:Mobile' 157 | 'TEL;FAX:' 158 | 'EMAIL;WORK;INTERNET:foo@email.com' 159 | 'URL:http://website.com' 160 | 'END:VCARD' 161 | '' 162 | 'BEGIN:VCARD' 163 | 'VERSION:2.1' 164 | 'N:Scott C. Dunn' 165 | 'ORG:Me' 166 | 'TITLE:Writer' 167 | 'TEL;MOBILE;VOICE:123-456-7890' 168 | 'ADR:123 No Name Street' 169 | 'Salt Lake City, Utah 84119' 170 | 'EMAIL:scott@scottcdunn.com' 171 | 'URL:https://steemit.com/@digitalfirehose' 172 | 'URL:https://medium.com/@scottcdunn' 173 | 'URL:https://thedigitalfirehose.blogspot.com/' 174 | 'END:VCARD' 175 | '' 176 | 'https://en.wikipedia.org/wiki/MeCard_(QR_code)' 177 | '' 178 | 'MECARD:N:Doe,John;TEL:13035551212;EMAIL:john.doe@example.com;;' 179 | '') 180 | Position.X = 527.000000000000000000 181 | Position.Y = 48.000000000000000000 182 | Size.Width = 253.000000000000000000 183 | Size.Height = 201.000000000000000000 184 | Size.PlatformDefault = False 185 | TabOrder = 40 186 | Viewport.Width = 233.000000000000000000 187 | Viewport.Height = 181.000000000000000000 188 | end 189 | object MemoData: TMemo 190 | Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] 191 | DataDetectorTypes = [] 192 | Lines.Strings = ( 193 | 'BEGIN:VCARD' 194 | 'VERSION:3.0' 195 | 'N:Lastname;Firstname' 196 | 'FN:Firstname Lastname' 197 | 'ORG:CompanyName' 198 | 'TITLE:JobTitle' 199 | 'ADR:;;123 Sesame St;SomeCity;CA;12345;USA' 200 | 'TEL;WORK;VOICE:1234567890' 201 | 'TEL;CELL:Mobile' 202 | 'TEL;FAX:' 203 | 'EMAIL;WORK;INTERNET:foo@email.com' 204 | 'URL:http://website.com' 205 | 'END:VCARD') 206 | Position.X = 8.000000000000000000 207 | Position.Y = 48.000000000000000000 208 | Size.Width = 511.000000000000000000 209 | Size.Height = 201.000000000000000000 210 | Size.PlatformDefault = False 211 | TabOrder = 41 212 | Viewport.Width = 491.000000000000000000 213 | Viewport.Height = 197.000000000000000000 214 | end 215 | object Label1: TLabel 216 | StyledSettings = [Family, FontColor] 217 | Position.X = 8.000000000000000000 218 | Position.Y = 23.000000000000000000 219 | Size.Width = 177.000000000000000000 220 | Size.Height = 17.000000000000000000 221 | Size.PlatformDefault = False 222 | TextSettings.Font.Size = 14.000000000000000000 223 | TextSettings.Font.StyleExt = {00070000000000000004000000} 224 | Text = 'Enter QRcode text below:' 225 | TabOrder = 42 226 | end 227 | object Label7: TLabel 228 | Position.X = 527.000000000000000000 229 | Position.Y = 23.000000000000000000 230 | Size.Width = 253.000000000000000000 231 | Size.Height = 17.000000000000000000 232 | Size.PlatformDefault = False 233 | Text = 'Hints / Codes I'#39've found' 234 | TabOrder = 43 235 | end 236 | object SVGcheckbox: TCheckBox 237 | StyledSettings = [Family, Size, FontColor] 238 | Position.X = 239.000000000000000000 239 | Position.Y = 327.000000000000000000 240 | Size.Width = 151.000000000000000000 241 | Size.Height = 25.000000000000000000 242 | Size.PlatformDefault = False 243 | TabOrder = 44 244 | Text = 'Generate SVG File' 245 | TextSettings.Font.StyleExt = {00070000000000000004000000} 246 | OnChange = SVGcheckboxChange 247 | end 248 | object Label8: TLabel 249 | Position.X = 577.000000000000000000 250 | Position.Y = 270.000000000000000000 251 | Size.Width = 49.000000000000000000 252 | Size.Height = 17.000000000000000000 253 | Size.PlatformDefault = False 254 | Text = 'Label8' 255 | TabOrder = 46 256 | end 257 | object Label9: TLabel 258 | Position.X = 527.000000000000000000 259 | Position.Y = 254.000000000000000000 260 | Size.Width = 26.000000000000000000 261 | Size.Height = 17.000000000000000000 262 | Size.PlatformDefault = False 263 | Text = 'X' 264 | TabOrder = 47 265 | end 266 | object Label11: TLabel 267 | Position.X = 296.000000000000000000 268 | Position.Y = 257.000000000000000000 269 | Size.Width = 73.000000000000000000 270 | Size.Height = 17.000000000000000000 271 | Size.PlatformDefault = False 272 | Text = 'Black Color:' 273 | TabOrder = 50 274 | end 275 | object ColorComboBox1: TColorComboBox 276 | DropDownKind = Custom 277 | Color = claBlack 278 | DisableFocusEffect = False 279 | ItemIndex = 7 280 | Position.X = 368.000000000000000000 281 | Position.Y = 257.000000000000000000 282 | Size.Width = 151.000000000000000000 283 | Size.Height = 22.000000000000000000 284 | Size.PlatformDefault = False 285 | TabOrder = 51 286 | end 287 | object Label12: TLabel 288 | Position.X = 296.000000000000000000 289 | Position.Y = 282.000000000000000000 290 | Size.Width = 73.000000000000000000 291 | Size.Height = 17.000000000000000000 292 | Size.PlatformDefault = False 293 | Text = 'White Color:' 294 | TabOrder = 48 295 | end 296 | object ColorComboBox2: TColorComboBox 297 | DropDownKind = Custom 298 | Color = claWhite 299 | DisableFocusEffect = False 300 | ItemIndex = 143 301 | Position.X = 368.000000000000000000 302 | Position.Y = 282.000000000000000000 303 | Size.Width = 151.000000000000000000 304 | Size.Height = 22.000000000000000000 305 | Size.PlatformDefault = False 306 | TabOrder = 49 307 | end 308 | object SkLabel1: TSkLabel 309 | Position.X = 216.000000000000000000 310 | Position.Y = 8.000000000000000000 311 | Size.Width = 227.000000000000000000 312 | Size.Height = 28.000000000000000000 313 | Size.PlatformDefault = False 314 | StyledSettings = [Family, Size, Style] 315 | TextSettings.Decorations.Color = claTurquoise 316 | TextSettings.Decorations.StrokeColor = claYellow 317 | TextSettings.FontColor = claRed 318 | Words = < 319 | item 320 | Font.Families = 'Comic Sans MS' 321 | Font.Size = 20.000000000000000000 322 | StyledSettings = [Style, FontColor] 323 | Text = 'Skia4Delphi Sample App' 324 | end> 325 | end 326 | object BMPcheckbox: TCheckBox 327 | StyledSettings = [Family, Size, FontColor] 328 | Position.X = 239.000000000000000000 329 | Position.Y = 312.000000000000000000 330 | Size.Width = 147.000000000000000000 331 | Size.Height = 19.000000000000000000 332 | Size.PlatformDefault = False 333 | TabOrder = 24 334 | Text = 'Generate BMP File' 335 | TextSettings.Font.StyleExt = {00070000000000000004000000} 336 | OnChange = BMPcheckboxChange 337 | end 338 | object Label10: TLabel 339 | Position.X = 577.000000000000000000 340 | Position.Y = 254.000000000000000000 341 | Size.Width = 26.000000000000000000 342 | Size.Height = 17.000000000000000000 343 | Size.PlatformDefault = False 344 | Text = 'Y' 345 | TabOrder = 34 346 | end 347 | object StopButton: TButton 348 | Enabled = False 349 | Position.X = 672.000000000000000000 350 | Position.Y = 339.000000000000000000 351 | TabOrder = 53 352 | Text = 'STOP' 353 | OnClick = StopButtonClick 354 | end 355 | object DONATE: TButton 356 | Position.X = 527.000000000000000000 357 | Position.Y = 312.000000000000000000 358 | Size.Width = 122.000000000000000000 359 | Size.Height = 22.000000000000000000 360 | Size.PlatformDefault = False 361 | TabOrder = 54 362 | Text = 'DONATE' 363 | OnClick = DONATEClick 364 | end 365 | object Label14: TLabel 366 | StyledSettings = [Family, Size, Style] 367 | Position.X = 527.000000000000000000 368 | Position.Y = 295.000000000000000000 369 | Size.Width = 177.000000000000000000 370 | Size.Height = 17.000000000000000000 371 | Size.PlatformDefault = False 372 | TextSettings.FontColor = claDarkblue 373 | Text = 'Donate button opens webpage' 374 | TabOrder = 55 375 | end 376 | object Button1: TButton 377 | Position.X = 528.000000000000000000 378 | Position.Y = 344.000000000000000000 379 | Size.Width = 121.000000000000000000 380 | Size.Height = 22.000000000000000000 381 | Size.PlatformDefault = False 382 | TabOrder = 56 383 | Text = 'Open Source Link' 384 | OnClick = Button1Click 385 | end 386 | object maxspeedCheckbox: TCheckBox 387 | StyledSettings = [Family, Size, FontColor] 388 | Position.X = 239.000000000000000000 389 | Position.Y = 346.000000000000000000 390 | Size.Width = 151.000000000000000000 391 | Size.Height = 25.000000000000000000 392 | Size.PlatformDefault = False 393 | TabOrder = 45 394 | Text = 'Max Speed' 395 | TextSettings.Font.StyleExt = {00070000000000000004000000} 396 | OnChange = SVGcheckboxChange 397 | end 398 | end 399 | object mLog: TMemo 400 | Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] 401 | DataDetectorTypes = [] 402 | Align = MostBottom 403 | Margins.Left = 10.000000000000000000 404 | Margins.Right = 10.000000000000000000 405 | Position.X = 10.000000000000000000 406 | Position.Y = 672.000000000000000000 407 | Size.Width = 742.000000000000000000 408 | Size.Height = 71.000000000000000000 409 | Size.PlatformDefault = False 410 | TabOrder = 3 411 | Viewport.Width = 738.000000000000000000 412 | Viewport.Height = 67.000000000000000000 413 | end 414 | object SD: TSaveDialog 415 | DefaultExt = '*.bmp' 416 | Filter = 'Bitmap (*.bmp)|*.bmp' 417 | Left = 400 418 | Top = 96 419 | end 420 | object ScrollBox1: TScrollBox 421 | Align = Client 422 | Size.Width = 762.000000000000000000 423 | Size.Height = 303.000000000000000000 424 | Size.PlatformDefault = False 425 | TabOrder = 8 426 | Viewport.Width = 762.000000000000000000 427 | Viewport.Height = 303.000000000000000000 428 | object imgQRCode: TImage 429 | MultiResBitmap = < 430 | item 431 | end> 432 | DisableInterpolation = True 433 | Hint = 'BMP' 434 | Position.Y = 43.000000000000000000 435 | Size.Width = 256.000000000000000000 436 | Size.Height = 256.000000000000000000 437 | Size.PlatformDefault = False 438 | end 439 | object SkSvg1: TSkSvg 440 | Hint = 'SVG' 441 | Position.X = 264.000000000000000000 442 | Position.Y = 43.000000000000000000 443 | Size.Width = 256.000000000000000000 444 | Size.Height = 256.000000000000000000 445 | Size.PlatformDefault = False 446 | end 447 | object Label13: TLabel 448 | StyledSettings = [Family, FontColor] 449 | Position.X = 8.000000000000000000 450 | Position.Y = 8.000000000000000000 451 | Size.Width = 105.000000000000000000 452 | Size.Height = 27.000000000000000000 453 | Size.PlatformDefault = False 454 | TextSettings.Font.Size = 16.000000000000000000 455 | TextSettings.Font.StyleExt = {00070000000000000004000000} 456 | Text = 'BMP:' 457 | TabOrder = 2 458 | end 459 | object Label15: TLabel 460 | StyledSettings = [Family, FontColor] 461 | Position.X = 272.000000000000000000 462 | Position.Y = 16.000000000000000000 463 | TextSettings.Font.Size = 16.000000000000000000 464 | TextSettings.Font.StyleExt = {00070000000000000004000000} 465 | Text = 'SVG:' 466 | TabOrder = 3 467 | end 468 | end 469 | object gtQRCodeGenFMX1: TgtQRCodeGenFMX 470 | MultiSelectFileFormat = [qrSVG, qrBMP] 471 | UseInnerStyleSVG = True 472 | Encoding = qrAuto 473 | ErrorCorrectionLevel = 3 474 | QuietZone = 4 475 | ImageControl = imgQRCode 476 | ThreadSleep = 0 477 | OnGenerateBefore = gtQRCodeGenFMX1GenerateBefore 478 | OnGenerateDuring = gtQRCodeGenFMX1GenerateDuring 479 | OnGenerateAfter = gtQRCodeGenFMX1GenerateAfter 480 | OnError = gtQRCodeGenFMX1Error 481 | OnGenerateFinally = gtQRCodeGenFMX1GenerateFinally 482 | OnFillColor = gtQRCodeGenFMX1FillColor 483 | Left = 328 484 | Top = 176 485 | end 486 | object gtCommandPrompt1: TgtCommandPrompt 487 | OnReadCommandPrompt = gtCommandPrompt1ReadCommandPrompt 488 | Left = 440 489 | Top = 176 490 | end 491 | end 492 | -------------------------------------------------------------------------------- /gtDelphiZXingQRCode/TestApp/SampleFMXapp/SampleFMX.dproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | {CAD4E9E7-6D8A-46E6-B299-0038ADBCBEF2} 4 | 19.3 5 | FMX 6 | SampleFMX.dpr 7 | True 8 | Debug 9 | Win64 10 | 32787 11 | Application 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Base 29 | true 30 | 31 | 32 | true 33 | Base 34 | true 35 | 36 | 37 | true 38 | Base 39 | true 40 | 41 | 42 | true 43 | Cfg_1 44 | true 45 | true 46 | 47 | 48 | true 49 | Cfg_1 50 | true 51 | true 52 | 53 | 54 | true 55 | Base 56 | true 57 | 58 | 59 | true 60 | Cfg_2 61 | true 62 | true 63 | 64 | 65 | true 66 | Cfg_2 67 | true 68 | true 69 | 70 | 71 | .\$(Platform)\$(Config) 72 | .\$(Platform)\$(Config) 73 | false 74 | false 75 | false 76 | false 77 | false 78 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) 79 | true 80 | true 81 | true 82 | true 83 | true 84 | true 85 | true 86 | true 87 | $(BDS)\bin\delphi_PROJECTICON.ico 88 | $(BDS)\bin\delphi_PROJECTICNS.icns 89 | SampleFMX 90 | 91 | 92 | DBXSqliteDriver;tethering;FireDACDBXDriver;RESTBackendComponents;bindengine;CloudService;DataSnapClient;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;rtl;DbxClientDriver;IndyIPClient;DataSnapProviderClient;RESTComponents;DBXInterBaseDriver;emsclientfiredac;DataSnapFireDAC;bindcompfmx;FmxTeeUI;FireDACIBDriver;fmx;dbexpress;IndyCore;dsnap;DataSnapCommon;emsclient;FireDACCommon;soapserver;FireDACCommonDriver;inet;IndyIPCommon;FireDAC;FireDACSqliteDriver;ibmonitor;ibxpress;ibxbindings;FireDACDSDriver;CustomIPTransport;bindcomp;dbxcds;dsnapxml;dbrtl;IndyProtocols;$(DCC_UsePackage) 93 | package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= 94 | Debug 95 | true 96 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png 97 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png 98 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png 99 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png 100 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png 101 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png 102 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png 103 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png 104 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png 105 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png 106 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png 107 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png 108 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png 109 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png 110 | android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar 111 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png 112 | 113 | 114 | DBXSqliteDriver;tethering;FireDACDBXDriver;RESTBackendComponents;bindengine;CloudService;DataSnapClient;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;FMXTee;soaprtl;DbxCommonDriver;xmlrtl;soapmidas;DataSnapNativeClient;rtl;DbxClientDriver;IndyIPClient;ACBr_Boleto;DataSnapProviderClient;RESTComponents;DBXInterBaseDriver;emsclientfiredac;DataSnapFireDAC;bindcompfmx;FmxTeeUI;FireDACIBDriver;fmx;dbexpress;IndyCore;dsnap;DataSnapCommon;emsclient;FireDACCommon;soapserver;FireDACCommonDriver;inet;IndyIPCommon;FireDAC;FireDACSqliteDriver;ibmonitor;ibxpress;ibxbindings;FireDACDSDriver;CustomIPTransport;bindcomp;dbxcds;dsnapxml;dbrtl;IndyProtocols;$(DCC_UsePackage) 115 | package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= 116 | Debug 117 | true 118 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png 119 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png 120 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png 121 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png 122 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png 123 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png 124 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png 125 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png 126 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png 127 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png 128 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png 129 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png 130 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png 131 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png 132 | android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar 133 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png 134 | 135 | 136 | DBXSqliteDriver;dxFlowChartRS26;dxPSdxMapControlLnkRS26;DBXDb2Driver;RVMediaD10_3;vclactnband;dxBarRS26;vclFireDAC;IcsFmxDXE3Run;dxFireDACEMFRS26;tethering;dxSpreadSheetInplaceRichEditRS26;FireDACADSDriver;JvPluginSystem;dclVCLOpenCV;dxRichEditCoreRS26;dxPSdxSpreadSheetLnkRS26;FireDACMSSQLDriver;vcltouch;JvBands;vcldb;svn;dxPSTeeChartRS26;TJSiBiometria;JvJans;dxGDIPlusRS26;JvDotNetCtrls;dxPSdxFCLnkRS26;vclib;dxCloudServiceLibraryRS26;frxTee26;dxPSLnksRS26;FireDACDBXDriver;cxGridRS26;dxPsPrVwAdvRS26;dxPDFViewerRS26;vclx;Python_D;dxPScxTLLnkRS26;RESTBackendComponents;JSiProtectorPkg;VCLRESTComponents;ONVIF;fsTee26;vclie;bindengine;CloudService;dxmdsRS26;JvHMI;FireDACMySQLDriver;IcsVclDXE3Run;dxdborRS26;frx26;DataSnapClient;JSiIntelbrasFacialDelhpiRio;dxFireDACServerModeRS26;bindcompdbx;fsFD26;GR32_D;ACBr_TCP;DBXSybaseASEDriver;IndyIPServer;cxPivotGridRS26;PngComponents;IndySystem;cxTreeListdxBarPopupMenuRS26;dsnapcon;cxTreeListRS26;dxPScxPivotGridLnkRS26;ACBr_synapse;cxSchedulerRibbonStyleEventEditorRS26;dxPSCoreRS26;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;dxSpreadSheetRS26;Jcl;dxBarExtItemsRS26;dxPSdxGaugeControlLnkRS26;emshosting;DBXOdbcDriver;FireDACTDataDriver;dxdbtrRS26;FMXTee;dxRichEditControlCoreRS26;soaprtl;DbxCommonDriver;dxFlowChartAdvancedCustomizeFormRS26;GMLib_D_Seattle10;GMLib_D_Seattle10_VCL;JvManagedThreads;dxDockingRS26;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;cxLibraryRS26;GR32_R;rtl;emsserverresource;DbxClientDriver;JvTimeFramework;DBXSybaseASADriver;dxPScxSchedulerLnkRS26;JSiPwdCheck;dxSpreadSheetConditionalFormattingDialogsRS26;JvSystem;JvStdCtrls;CEF4DelphiFMXRTL;appanalytics;dxRibbonCustomizationFormRS26;cxSchedulerGridRS26;IndyIPClient;bindcompvcl;dxFlowChartLayoutsRS26;JSiProgressbar;TeeUI;GMLib_D_Seattle10_FMX;dxADOEMFRS26;JvDocking;JvPascalInterpreter;VclSmp;GMLibEdit_D_Seattle10;FireDACODBCDriver;JclVcl;DataSnapIndy10ServerTransport;dxRibbonRS26;dxPScxCommonRS26;dxRichEditDocumentModelRS26;ACBr_Boleto;DataSnapProviderClient;FireDACMongoDBDriver;rclFMXOpenCV;dxFlowChartDesignerRS26;JvControls;dxPScxGridLnkRS26;JvPrintPreview;IcsCommonDXE3Run;dxSpreadSheetCoreRS26;DataSnapServerMidas;RESTComponents;DBXInterBaseDriver;dxPScxExtCommonRS26;ACBr_TEFD;emsclientfiredac;DataSnapFireDAC;svnui;JvGlobus;frxFD26;DBXMSSQLDriver;JvMM;dxRichEditControlRS26;DatasnapConnectorsFreePascal;dxGaugeControlRS26;dxorgcRS26;dxPScxVGridLnkRS26;bindcompfmx;JvNet;DBXOracleDriver;inetdb;JvAppFrm;ACBr_Diversos;dxBarDBNavRS26;dxDBXServerModeRS26;FmxTeeUI;emsedge;FireDACIBDriver;fmx;fmxdae;dxServerModeRS26;dxWizardControlRS26;JvWizards;dxTabbedMDIRS26;fs26;dxEMFRS26;dbexpress;IndyCore;dxComnRS26;JvPageComps;dsnap;DataSnapCommon;emsclient;FireDACCommon;JvDB;CEF4DelphiVCLRTL;DataSnapConnectors;cxSchedulerTreeBrowserRS26;dxADOServerModeRS26;soapserver;JclDeveloperTools;cxPivotGridOLAPRS26;cxVerticalGridRS26;dxtrmdRS26;FireDACOracleDriver;DBXMySQLDriver;cxSchedulerRS26;cxSchedulerWebServiceStorageRS26;dxPSdxLCLnkRS26;DBXFirebirdDriver;JvCmp;FireDACCommonODBC;FireDACCommonDriver;dxMapControlRS26;inet;dxSpellCheckerRS26;IndyIPCommon;JvCustom;dxSpreadSheetCoreConditionalFormattingDialogsRS26;vcl;dxPSdxDBOCLnkRS26;JvXPCtrls;frxDB26;FireDACDb2Driver;dxSpreadSheetReportDesignerRS26;ACBr_Integrador;dxPScxPCProdRS26;madExcept_;dxNavBarRS26;dxCoreRS26;fsDB26;madBasic_;cxExportRS26;TeeDB;FireDAC;dxHttpIndyRequestRS26;dxPSPrVwRibbonRS26;JvCore;ACBr_Comum;frxe26;JvCrypt;FireDACSqliteDriver;FireDACPgDriver;ibmonitor;FireDACASADriver;dxPSRichEditControlLnkRS26;cxPivotGridChartRS26;JvDlgs;JvRuntimeDesign;dxPSDBTeeChartRS26;ibxpress;Tee;DataSnapServer;ibxbindings;dxPSdxDBTVLnkRS26;vclwinx;FireDACDSDriver;ACBr_OpenSSL;madDisAsm_;dxTileControlRS26;dxSkinsCoreRS26;CustomIPTransport;vcldsnap;SynEditDR;bindcomp;dxPSdxOCLnkRS26;DBXInformixDriver;ACBr_Serial;dbxcds;JSiBarCharts;adortl;ACBr_BoletoFR;pkgJSiQRCodeGenFMX;dxSpreadSheetCoreDialogsRS26;JSiActiveXPack;dxBarExtDBItemsRS26;dsnapxml;dbrtl;inetdbxpress;IndyProtocols;dxPSdxPDFViewerLnkRS26;dxRichEditInplaceRS26;JclContainers;rclVCLOpenCV;APIMaxtel;dclFMXOpenCV;fmxase;$(DCC_UsePackage) 137 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 138 | Debug 139 | true 140 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 141 | 1033 142 | $(BDS)\bin\default_app.manifest 143 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 144 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 145 | 146 | 147 | DBXSqliteDriver;dxFlowChartRS26;dxPSdxMapControlLnkRS26;DBXDb2Driver;RVMediaD10_3;vclactnband;dxBarRS26;vclFireDAC;IcsFmxDXE3Run;dxFireDACEMFRS26;tethering;dxSpreadSheetInplaceRichEditRS26;FireDACADSDriver;dxRichEditCoreRS26;dxPSdxSpreadSheetLnkRS26;FireDACMSSQLDriver;vcltouch;vcldb;dxPSTeeChartRS26;dxGDIPlusRS26;dxPSdxFCLnkRS26;vclib;dxCloudServiceLibraryRS26;dxPSLnksRS26;FireDACDBXDriver;cxGridRS26;dxPsPrVwAdvRS26;dxPDFViewerRS26;vclx;dxPScxTLLnkRS26;RESTBackendComponents;VCLRESTComponents;vclie;bindengine;CloudService;dxmdsRS26;FireDACMySQLDriver;IcsVclDXE3Run;dxdborRS26;DataSnapClient;dxFireDACServerModeRS26;bindcompdbx;DBXSybaseASEDriver;IndyIPServer;cxPivotGridRS26;PngComponents;IndySystem;cxTreeListdxBarPopupMenuRS26;dsnapcon;cxTreeListRS26;dxPScxPivotGridLnkRS26;cxSchedulerRibbonStyleEventEditorRS26;dxPSCoreRS26;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;dxSpreadSheetRS26;dxBarExtItemsRS26;dxPSdxGaugeControlLnkRS26;emshosting;DBXOdbcDriver;FireDACTDataDriver;dxdbtrRS26;FMXTee;dxRichEditControlCoreRS26;soaprtl;DbxCommonDriver;dxFlowChartAdvancedCustomizeFormRS26;GMLib_D_Seattle10;GMLib_D_Seattle10_VCL;dxDockingRS26;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;cxLibraryRS26;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;dxPScxSchedulerLnkRS26;dxSpreadSheetConditionalFormattingDialogsRS26;CEF4DelphiFMXRTL;appanalytics;dxRibbonCustomizationFormRS26;cxSchedulerGridRS26;IndyIPClient;bindcompvcl;dxFlowChartLayoutsRS26;TeeUI;GMLib_D_Seattle10_FMX;dxADOEMFRS26;VclSmp;FireDACODBCDriver;DataSnapIndy10ServerTransport;dxRibbonRS26;dxPScxCommonRS26;dxRichEditDocumentModelRS26;DataSnapProviderClient;FireDACMongoDBDriver;dxFlowChartDesignerRS26;dxPScxGridLnkRS26;IcsCommonDXE3Run;dxSpreadSheetCoreRS26;DataSnapServerMidas;RESTComponents;DBXInterBaseDriver;dxPScxExtCommonRS26;emsclientfiredac;DataSnapFireDAC;DBXMSSQLDriver;dxRichEditControlRS26;DatasnapConnectorsFreePascal;dxGaugeControlRS26;dxorgcRS26;dxPScxVGridLnkRS26;bindcompfmx;DBXOracleDriver;inetdb;dxBarDBNavRS26;dxDBXServerModeRS26;FmxTeeUI;emsedge;FireDACIBDriver;fmx;fmxdae;dxServerModeRS26;dxWizardControlRS26;dxTabbedMDIRS26;dxEMFRS26;dbexpress;IndyCore;dxComnRS26;dsnap;DataSnapCommon;emsclient;FireDACCommon;CEF4DelphiVCLRTL;DataSnapConnectors;cxSchedulerTreeBrowserRS26;dxADOServerModeRS26;soapserver;cxPivotGridOLAPRS26;cxVerticalGridRS26;dxtrmdRS26;FireDACOracleDriver;DBXMySQLDriver;cxSchedulerRS26;cxSchedulerWebServiceStorageRS26;dxPSdxLCLnkRS26;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;dxMapControlRS26;inet;dxSpellCheckerRS26;IndyIPCommon;dxSpreadSheetCoreConditionalFormattingDialogsRS26;vcl;dxPSdxDBOCLnkRS26;FireDACDb2Driver;dxSpreadSheetReportDesignerRS26;dxPScxPCProdRS26;dxNavBarRS26;dxCoreRS26;cxExportRS26;TeeDB;FireDAC;dxHttpIndyRequestRS26;dxPSPrVwRibbonRS26;FireDACSqliteDriver;FireDACPgDriver;ibmonitor;FireDACASADriver;dxPSRichEditControlLnkRS26;cxPivotGridChartRS26;dxPSDBTeeChartRS26;ibxpress;Tee;DataSnapServer;ibxbindings;dxPSdxDBTVLnkRS26;vclwinx;FireDACDSDriver;dxTileControlRS26;dxSkinsCoreRS26;CustomIPTransport;vcldsnap;SynEditDR;bindcomp;dxPSdxOCLnkRS26;DBXInformixDriver;dbxcds;adortl;dxSpreadSheetCoreDialogsRS26;dxBarExtDBItemsRS26;dsnapxml;dbrtl;inetdbxpress;IndyProtocols;dxPSdxPDFViewerLnkRS26;dxRichEditInplaceRS26;fmxase;$(DCC_UsePackage) 148 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) 149 | Debug 150 | true 151 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 152 | 1033 153 | $(BDS)\bin\default_app.manifest 154 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 155 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 156 | 157 | 158 | DEBUG;$(DCC_Define) 159 | true 160 | false 161 | true 162 | true 163 | true 164 | 165 | 166 | false 167 | true 168 | PerMonitorV2 169 | 170 | 171 | true 172 | PerMonitorV2 173 | 174 | 175 | false 176 | RELEASE;$(DCC_Define) 177 | 0 178 | 0 179 | 180 | 181 | true 182 | PerMonitorV2 183 | 184 | 185 | true 186 | PerMonitorV2 187 | 188 | 189 | 190 | MainSource 191 | 192 | 193 |
viewMain
194 | fmx 195 |
196 | 197 | 198 | 199 | Base 200 | 201 | 202 | Cfg_1 203 | Base 204 | 205 | 206 | Cfg_2 207 | Base 208 | 209 |
210 | 211 | Delphi.Personality.12 212 | Application 213 | 214 | 215 | 216 | SampleFMX.dpr 217 | 218 | 219 | 220 | 221 | 222 | SampleFMX.exe 223 | true 224 | 225 | 226 | 227 | 228 | true 229 | 230 | 231 | 232 | 233 | true 234 | 235 | 236 | 237 | 238 | true 239 | 240 | 241 | 242 | 243 | 1 244 | 245 | 246 | Contents\MacOS 247 | 1 248 | 249 | 250 | 0 251 | 252 | 253 | 254 | 255 | classes 256 | 64 257 | 258 | 259 | classes 260 | 64 261 | 262 | 263 | 264 | 265 | classes 266 | 1 267 | 268 | 269 | classes 270 | 1 271 | 272 | 273 | 274 | 275 | res\xml 276 | 1 277 | 278 | 279 | res\xml 280 | 1 281 | 282 | 283 | 284 | 285 | library\lib\armeabi-v7a 286 | 1 287 | 288 | 289 | 290 | 291 | library\lib\armeabi 292 | 1 293 | 294 | 295 | library\lib\armeabi 296 | 1 297 | 298 | 299 | 300 | 301 | library\lib\armeabi-v7a 302 | 1 303 | 304 | 305 | 306 | 307 | library\lib\mips 308 | 1 309 | 310 | 311 | library\lib\mips 312 | 1 313 | 314 | 315 | 316 | 317 | library\lib\armeabi-v7a 318 | 1 319 | 320 | 321 | library\lib\arm64-v8a 322 | 1 323 | 324 | 325 | 326 | 327 | library\lib\armeabi-v7a 328 | 1 329 | 330 | 331 | 332 | 333 | res\drawable 334 | 1 335 | 336 | 337 | res\drawable 338 | 1 339 | 340 | 341 | 342 | 343 | res\values 344 | 1 345 | 346 | 347 | res\values 348 | 1 349 | 350 | 351 | 352 | 353 | res\values-v21 354 | 1 355 | 356 | 357 | res\values-v21 358 | 1 359 | 360 | 361 | 362 | 363 | res\values 364 | 1 365 | 366 | 367 | res\values 368 | 1 369 | 370 | 371 | 372 | 373 | res\drawable 374 | 1 375 | 376 | 377 | res\drawable 378 | 1 379 | 380 | 381 | 382 | 383 | res\drawable-xxhdpi 384 | 1 385 | 386 | 387 | res\drawable-xxhdpi 388 | 1 389 | 390 | 391 | 392 | 393 | res\drawable-xxxhdpi 394 | 1 395 | 396 | 397 | res\drawable-xxxhdpi 398 | 1 399 | 400 | 401 | 402 | 403 | res\drawable-ldpi 404 | 1 405 | 406 | 407 | res\drawable-ldpi 408 | 1 409 | 410 | 411 | 412 | 413 | res\drawable-mdpi 414 | 1 415 | 416 | 417 | res\drawable-mdpi 418 | 1 419 | 420 | 421 | 422 | 423 | res\drawable-hdpi 424 | 1 425 | 426 | 427 | res\drawable-hdpi 428 | 1 429 | 430 | 431 | 432 | 433 | res\drawable-xhdpi 434 | 1 435 | 436 | 437 | res\drawable-xhdpi 438 | 1 439 | 440 | 441 | 442 | 443 | res\drawable-mdpi 444 | 1 445 | 446 | 447 | res\drawable-mdpi 448 | 1 449 | 450 | 451 | 452 | 453 | res\drawable-hdpi 454 | 1 455 | 456 | 457 | res\drawable-hdpi 458 | 1 459 | 460 | 461 | 462 | 463 | res\drawable-xhdpi 464 | 1 465 | 466 | 467 | res\drawable-xhdpi 468 | 1 469 | 470 | 471 | 472 | 473 | res\drawable-xxhdpi 474 | 1 475 | 476 | 477 | res\drawable-xxhdpi 478 | 1 479 | 480 | 481 | 482 | 483 | res\drawable-xxxhdpi 484 | 1 485 | 486 | 487 | res\drawable-xxxhdpi 488 | 1 489 | 490 | 491 | 492 | 493 | res\drawable-small 494 | 1 495 | 496 | 497 | res\drawable-small 498 | 1 499 | 500 | 501 | 502 | 503 | res\drawable-normal 504 | 1 505 | 506 | 507 | res\drawable-normal 508 | 1 509 | 510 | 511 | 512 | 513 | res\drawable-large 514 | 1 515 | 516 | 517 | res\drawable-large 518 | 1 519 | 520 | 521 | 522 | 523 | res\drawable-xlarge 524 | 1 525 | 526 | 527 | res\drawable-xlarge 528 | 1 529 | 530 | 531 | 532 | 533 | res\values 534 | 1 535 | 536 | 537 | res\values 538 | 1 539 | 540 | 541 | 542 | 543 | 1 544 | 545 | 546 | Contents\MacOS 547 | 1 548 | 549 | 550 | 0 551 | 552 | 553 | 554 | 555 | Contents\MacOS 556 | 1 557 | .framework 558 | 559 | 560 | Contents\MacOS 561 | 1 562 | .framework 563 | 564 | 565 | Contents\MacOS 566 | 1 567 | .framework 568 | 569 | 570 | 0 571 | 572 | 573 | 574 | 575 | 1 576 | .dylib 577 | 578 | 579 | 1 580 | .dylib 581 | 582 | 583 | 1 584 | .dylib 585 | 586 | 587 | Contents\MacOS 588 | 1 589 | .dylib 590 | 591 | 592 | Contents\MacOS 593 | 1 594 | .dylib 595 | 596 | 597 | Contents\MacOS 598 | 1 599 | .dylib 600 | 601 | 602 | 0 603 | .dll;.bpl 604 | 605 | 606 | 607 | 608 | 1 609 | .dylib 610 | 611 | 612 | 1 613 | .dylib 614 | 615 | 616 | 1 617 | .dylib 618 | 619 | 620 | Contents\MacOS 621 | 1 622 | .dylib 623 | 624 | 625 | Contents\MacOS 626 | 1 627 | .dylib 628 | 629 | 630 | Contents\MacOS 631 | 1 632 | .dylib 633 | 634 | 635 | 0 636 | .bpl 637 | 638 | 639 | 640 | 641 | 0 642 | 643 | 644 | 0 645 | 646 | 647 | 0 648 | 649 | 650 | 0 651 | 652 | 653 | 0 654 | 655 | 656 | Contents\Resources\StartUp\ 657 | 0 658 | 659 | 660 | Contents\Resources\StartUp\ 661 | 0 662 | 663 | 664 | Contents\Resources\StartUp\ 665 | 0 666 | 667 | 668 | 0 669 | 670 | 671 | 672 | 673 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 674 | 1 675 | 676 | 677 | 678 | 679 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 680 | 1 681 | 682 | 683 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 684 | 1 685 | 686 | 687 | 688 | 689 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 690 | 1 691 | 692 | 693 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 694 | 1 695 | 696 | 697 | 698 | 699 | 1 700 | 701 | 702 | 1 703 | 704 | 705 | 1 706 | 707 | 708 | 709 | 710 | 1 711 | 712 | 713 | 1 714 | 715 | 716 | 1 717 | 718 | 719 | 720 | 721 | 1 722 | 723 | 724 | 1 725 | 726 | 727 | 1 728 | 729 | 730 | 731 | 732 | 1 733 | 734 | 735 | 1 736 | 737 | 738 | 1 739 | 740 | 741 | 742 | 743 | 1 744 | 745 | 746 | 1 747 | 748 | 749 | 1 750 | 751 | 752 | 753 | 754 | 1 755 | 756 | 757 | 1 758 | 759 | 760 | 1 761 | 762 | 763 | 764 | 765 | 1 766 | 767 | 768 | 1 769 | 770 | 771 | 1 772 | 773 | 774 | 775 | 776 | 1 777 | 778 | 779 | 1 780 | 781 | 782 | 1 783 | 784 | 785 | 786 | 787 | 1 788 | 789 | 790 | 1 791 | 792 | 793 | 1 794 | 795 | 796 | 797 | 798 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 799 | 1 800 | 801 | 802 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 803 | 1 804 | 805 | 806 | 807 | 808 | 1 809 | 810 | 811 | 1 812 | 813 | 814 | 1 815 | 816 | 817 | 818 | 819 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 820 | 1 821 | 822 | 823 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 824 | 1 825 | 826 | 827 | 828 | 829 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 830 | 1 831 | 832 | 833 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 834 | 1 835 | 836 | 837 | 838 | 839 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 840 | 1 841 | 842 | 843 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 844 | 1 845 | 846 | 847 | 848 | 849 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 850 | 1 851 | 852 | 853 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 854 | 1 855 | 856 | 857 | 858 | 859 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 860 | 1 861 | 862 | 863 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 864 | 1 865 | 866 | 867 | 868 | 869 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 870 | 1 871 | 872 | 873 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 874 | 1 875 | 876 | 877 | 878 | 879 | 1 880 | 881 | 882 | 1 883 | 884 | 885 | 1 886 | 887 | 888 | 889 | 890 | 1 891 | 892 | 893 | 1 894 | 895 | 896 | 1 897 | 898 | 899 | 900 | 901 | 1 902 | 903 | 904 | 1 905 | 906 | 907 | 1 908 | 909 | 910 | 911 | 912 | 1 913 | 914 | 915 | 1 916 | 917 | 918 | 1 919 | 920 | 921 | 922 | 923 | 1 924 | 925 | 926 | 1 927 | 928 | 929 | 1 930 | 931 | 932 | 933 | 934 | 1 935 | 936 | 937 | 1 938 | 939 | 940 | 1 941 | 942 | 943 | 944 | 945 | 1 946 | 947 | 948 | 1 949 | 950 | 951 | 1 952 | 953 | 954 | 955 | 956 | 1 957 | 958 | 959 | 1 960 | 961 | 962 | 1 963 | 964 | 965 | 966 | 967 | 1 968 | 969 | 970 | 1 971 | 972 | 973 | 1 974 | 975 | 976 | 977 | 978 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 979 | 1 980 | 981 | 982 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 983 | 1 984 | 985 | 986 | 987 | 988 | 1 989 | 990 | 991 | 1 992 | 993 | 994 | 1 995 | 996 | 997 | 998 | 999 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1000 | 1 1001 | 1002 | 1003 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1004 | 1 1005 | 1006 | 1007 | 1008 | 1009 | 1 1010 | 1011 | 1012 | 1 1013 | 1014 | 1015 | 1 1016 | 1017 | 1018 | 1019 | 1020 | 1 1021 | 1022 | 1023 | 1 1024 | 1025 | 1026 | 1 1027 | 1028 | 1029 | 1030 | 1031 | 1 1032 | 1033 | 1034 | 1 1035 | 1036 | 1037 | 1 1038 | 1039 | 1040 | 1041 | 1042 | 1 1043 | 1044 | 1045 | 1 1046 | 1047 | 1048 | 1 1049 | 1050 | 1051 | 1052 | 1053 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1054 | 1 1055 | 1056 | 1057 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1058 | 1 1059 | 1060 | 1061 | 1062 | 1063 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1064 | 1 1065 | 1066 | 1067 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1068 | 1 1069 | 1070 | 1071 | 1072 | 1073 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1074 | 1 1075 | 1076 | 1077 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1078 | 1 1079 | 1080 | 1081 | 1082 | 1083 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1084 | 1 1085 | 1086 | 1087 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1088 | 1 1089 | 1090 | 1091 | 1092 | 1093 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1094 | 1 1095 | 1096 | 1097 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1098 | 1 1099 | 1100 | 1101 | 1102 | 1103 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1104 | 1 1105 | 1106 | 1107 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1108 | 1 1109 | 1110 | 1111 | 1112 | 1113 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1114 | 1 1115 | 1116 | 1117 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1118 | 1 1119 | 1120 | 1121 | 1122 | 1123 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1124 | 1 1125 | 1126 | 1127 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1128 | 1 1129 | 1130 | 1131 | 1132 | 1133 | 1 1134 | 1135 | 1136 | 1 1137 | 1138 | 1139 | 1140 | 1141 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1142 | 1 1143 | 1144 | 1145 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1146 | 1 1147 | 1148 | 1149 | 1150 | 1151 | 1 1152 | 1153 | 1154 | 1 1155 | 1156 | 1157 | 1158 | 1159 | ..\ 1160 | 1 1161 | 1162 | 1163 | ..\ 1164 | 1 1165 | 1166 | 1167 | 1168 | 1169 | 1 1170 | 1171 | 1172 | 1 1173 | 1174 | 1175 | 1 1176 | 1177 | 1178 | 1179 | 1180 | ..\$(PROJECTNAME).launchscreen 1181 | 64 1182 | 1183 | 1184 | ..\$(PROJECTNAME).launchscreen 1185 | 64 1186 | 1187 | 1188 | 1189 | 1190 | 1 1191 | 1192 | 1193 | 1 1194 | 1195 | 1196 | 1 1197 | 1198 | 1199 | 1200 | 1201 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1202 | 1 1203 | 1204 | 1205 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1206 | 1 1207 | 1208 | 1209 | 1210 | 1211 | ..\ 1212 | 1 1213 | 1214 | 1215 | ..\ 1216 | 1 1217 | 1218 | 1219 | ..\ 1220 | 1 1221 | 1222 | 1223 | 1224 | 1225 | Contents 1226 | 1 1227 | 1228 | 1229 | Contents 1230 | 1 1231 | 1232 | 1233 | Contents 1234 | 1 1235 | 1236 | 1237 | 1238 | 1239 | Contents\Resources 1240 | 1 1241 | 1242 | 1243 | Contents\Resources 1244 | 1 1245 | 1246 | 1247 | Contents\Resources 1248 | 1 1249 | 1250 | 1251 | 1252 | 1253 | library\lib\armeabi-v7a 1254 | 1 1255 | 1256 | 1257 | library\lib\arm64-v8a 1258 | 1 1259 | 1260 | 1261 | 1 1262 | 1263 | 1264 | 1 1265 | 1266 | 1267 | 1 1268 | 1269 | 1270 | 1 1271 | 1272 | 1273 | Contents\MacOS 1274 | 1 1275 | 1276 | 1277 | Contents\MacOS 1278 | 1 1279 | 1280 | 1281 | Contents\MacOS 1282 | 1 1283 | 1284 | 1285 | 0 1286 | 1287 | 1288 | 1289 | 1290 | library\lib\armeabi-v7a 1291 | 1 1292 | 1293 | 1294 | 1295 | 1296 | 1 1297 | 1298 | 1299 | 1 1300 | 1301 | 1302 | 1303 | 1304 | Assets 1305 | 1 1306 | 1307 | 1308 | Assets 1309 | 1 1310 | 1311 | 1312 | 1313 | 1314 | Assets 1315 | 1 1316 | 1317 | 1318 | Assets 1319 | 1 1320 | 1321 | 1322 | 1323 | 1324 | 1325 | 1326 | 1327 | 1328 | 1329 | 1330 | 1331 | 1332 | 1333 | 1334 | 1335 | True 1336 | True 1337 | True 1338 | True 1339 | 1340 | False 1341 | 1342 | 12 1343 | 1344 | 1345 | 1346 | 1347 |
1348 | --------------------------------------------------------------------------------