├── Win32 └── Debug │ ├── Model.Main.dcu │ ├── Model.Invoice.dcu │ ├── View.MainForm.dcu │ ├── Model.Database.dcu │ ├── Model.Interfaces.dcu │ ├── View.InvoiceForm.dcu │ ├── ViewModel.Main.dcu │ ├── Model.Declarations.dcu │ ├── ViewModel.Invoice.dcu │ ├── Model.ProSu.Provider.dcu │ ├── Model.ProSu.Interfaces.dcu │ ├── Model.ProSu.Subscriber.dcu │ ├── Model.ProSu.InterfaceActions.dcu │ └── POSAppMVVMFinal.drc ├── SupportCode ├── Model.ProSu.InterfaceActions.pas ├── Model.ProSu.Interfaces.pas ├── Model.ProSu.Subscriber.pas └── Model.ProSu.Provider.pas ├── Models ├── Model.Main.pas ├── Model.Declarations.pas ├── Model.Interfaces.pas ├── Model.Database.pas └── Model.Invoice.pas ├── POSAppMVVMFinal.dpr ├── ViewModels ├── ViewModel.Main.pas └── ViewModel.Invoice.pas ├── Views ├── View.MainForm.fmx ├── View.MainForm.pas ├── View.InvoiceForm.pas └── View.InvoiceForm.fmx └── POSAppMVVMFinal.dproj /Win32/Debug/Model.Main.dcu: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shamirapudi/pointofsalesoftw/HEAD/Win32/Debug/Model.Main.dcu -------------------------------------------------------------------------------- /Win32/Debug/Model.Invoice.dcu: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shamirapudi/pointofsalesoftw/HEAD/Win32/Debug/Model.Invoice.dcu -------------------------------------------------------------------------------- /Win32/Debug/View.MainForm.dcu: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shamirapudi/pointofsalesoftw/HEAD/Win32/Debug/View.MainForm.dcu -------------------------------------------------------------------------------- /Win32/Debug/Model.Database.dcu: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shamirapudi/pointofsalesoftw/HEAD/Win32/Debug/Model.Database.dcu -------------------------------------------------------------------------------- /Win32/Debug/Model.Interfaces.dcu: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shamirapudi/pointofsalesoftw/HEAD/Win32/Debug/Model.Interfaces.dcu -------------------------------------------------------------------------------- /Win32/Debug/View.InvoiceForm.dcu: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shamirapudi/pointofsalesoftw/HEAD/Win32/Debug/View.InvoiceForm.dcu -------------------------------------------------------------------------------- /Win32/Debug/ViewModel.Main.dcu: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shamirapudi/pointofsalesoftw/HEAD/Win32/Debug/ViewModel.Main.dcu -------------------------------------------------------------------------------- /Win32/Debug/Model.Declarations.dcu: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shamirapudi/pointofsalesoftw/HEAD/Win32/Debug/Model.Declarations.dcu -------------------------------------------------------------------------------- /Win32/Debug/ViewModel.Invoice.dcu: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shamirapudi/pointofsalesoftw/HEAD/Win32/Debug/ViewModel.Invoice.dcu -------------------------------------------------------------------------------- /Win32/Debug/Model.ProSu.Provider.dcu: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shamirapudi/pointofsalesoftw/HEAD/Win32/Debug/Model.ProSu.Provider.dcu -------------------------------------------------------------------------------- /Win32/Debug/Model.ProSu.Interfaces.dcu: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shamirapudi/pointofsalesoftw/HEAD/Win32/Debug/Model.ProSu.Interfaces.dcu -------------------------------------------------------------------------------- /Win32/Debug/Model.ProSu.Subscriber.dcu: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shamirapudi/pointofsalesoftw/HEAD/Win32/Debug/Model.ProSu.Subscriber.dcu -------------------------------------------------------------------------------- /Win32/Debug/Model.ProSu.InterfaceActions.dcu: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shamirapudi/pointofsalesoftw/HEAD/Win32/Debug/Model.ProSu.InterfaceActions.dcu -------------------------------------------------------------------------------- /SupportCode/Model.ProSu.InterfaceActions.pas: -------------------------------------------------------------------------------- 1 | unit Model.ProSu.InterfaceActions; 2 | 3 | interface 4 | 5 | type 6 | TInterfaceAction = (actUpdateTotalSalesFigure, actInvoiceItemsChanges, 7 | actPrintingStart, actPrintingFinish); 8 | TInterfaceError = (errInvoiceItemEmpty, errInvoiceItemQuantityEmpty, 9 | errInvoiceItemQuantityNonPositive, 10 | errInvoiceItemQuantityNotNumber, errNoError); 11 | TInterfaceActions = set of TInterfaceAction; 12 | TInterfaceErrors = set of TInterfaceError; 13 | 14 | implementation 15 | 16 | end. 17 | -------------------------------------------------------------------------------- /SupportCode/Model.ProSu.Interfaces.pas: -------------------------------------------------------------------------------- 1 | unit Model.ProSu.Interfaces; 2 | 3 | interface 4 | 5 | type 6 | INotificationClass = interface 7 | ['{2BB04DBB-6D61-4E4F-8C70-8BCC8E36FDE4}'] 8 | end; 9 | 10 | TUpdateSubscriberMethod = procedure (const notifyClass: INotificationClass) of object; 11 | 12 | ISubscriberInterface = interface 13 | ['{955BF992-F4FA-4141-9C0F-04600C582C00}'] 14 | procedure UpdateSubscriber (const notifyClass: INotificationClass); 15 | procedure SetUpdateSubscriberMethod (newMethod: TUpdateSubscriberMethod); 16 | end; 17 | 18 | IProviderInterface = interface 19 | ['{DD326AE1-5049-43AA-9215-DF53DB5FC958}'] 20 | procedure Subscribe(const tmpSubscriber: ISubscriberInterface); 21 | procedure Unsubscribe(const tmpSubscriber: ISubscriberInterface); 22 | procedure NotifySubscribers (const notifyClass: INotificationClass); 23 | end; 24 | 25 | 26 | implementation 27 | 28 | end. 29 | -------------------------------------------------------------------------------- /SupportCode/Model.ProSu.Subscriber.pas: -------------------------------------------------------------------------------- 1 | unit Model.ProSu.Subscriber; 2 | 3 | interface 4 | 5 | uses Model.ProSu.Interfaces; 6 | 7 | function CreateProSuSubscriberClass: ISubscriberInterface; 8 | 9 | implementation 10 | 11 | type 12 | TProSuSubscriber = class (TInterfacedObject, ISubscriberInterface) 13 | private 14 | fUpdateMethod: TUpdateSubscriberMethod; 15 | public 16 | procedure UpdateSubscriber (const notifyClass: INotificationClass); 17 | procedure SetUpdateSubscriberMethod (newMethod: TUpdateSubscriberMethod); 18 | end; 19 | 20 | { TProSuSubscriber } 21 | 22 | procedure TProSuSubscriber.SetUpdateSubscriberMethod( 23 | newMethod: TUpdateSubscriberMethod); 24 | begin 25 | fUpdateMethod:=newMethod; 26 | end; 27 | 28 | procedure TProSuSubscriber.UpdateSubscriber(const notifyClass: INotificationClass); 29 | begin 30 | if Assigned(fUpdateMethod) then 31 | fUpdateMethod(notifyClass); 32 | end; 33 | 34 | function CreateProSuSubscriberClass: ISubscriberInterface; 35 | begin 36 | result:=TProSuSubscriber.Create; 37 | end; 38 | 39 | end. 40 | -------------------------------------------------------------------------------- /Models/Model.Main.pas: -------------------------------------------------------------------------------- 1 | unit Model.Main; 2 | 3 | interface 4 | 5 | uses Model.Declarations, Model.Database, Model.Interfaces; 6 | 7 | function CreateMainModelClass: IMainModelInterface; 8 | 9 | implementation 10 | 11 | uses 12 | System.SysUtils; 13 | 14 | type 15 | TMainModel = class(TInterfacedObject, IMainModelInterface) 16 | private 17 | fMainFormLabelsText: TMainFormLabelsText; 18 | fDatabase: IDatabaseInterface; 19 | public 20 | function GetMainFormLabelsText: TMainFormLabelsText; 21 | function GetTotalSales: Currency; 22 | constructor Create; 23 | end; 24 | 25 | 26 | function CreateMainModelClass: IMainModelInterface; 27 | begin 28 | result:=TMainModel.Create; 29 | end; 30 | 31 | { TMainModel } 32 | 33 | constructor TMainModel.Create; 34 | begin 35 | fDatabase:=CreateDatabaseClass; 36 | end; 37 | 38 | 39 | function TMainModel.GetMainFormLabelsText: TMainFormLabelsText; 40 | begin 41 | fMainFormLabelsText.Title:='Main Screen'; 42 | fMainFormLabelsText.IssueButtonCaption:='Issue Invoice'; 43 | fMainFormLabelsText.TotalSalesText:='Total Sales:'; 44 | result:=fMainFormLabelsText; 45 | end; 46 | 47 | function TMainModel.GetTotalSales: Currency; 48 | begin 49 | result:=fDatabase.GetTotalSales; 50 | end; 51 | 52 | end. 53 | -------------------------------------------------------------------------------- /POSAppMVVMFinal.dpr: -------------------------------------------------------------------------------- 1 | program POSAppMVVMFinal; 2 | 3 | uses 4 | System.StartUpCopy, 5 | FMX.Forms, 6 | View.MainForm in 'Views\View.MainForm.pas' {MainForm}, 7 | ViewModel.Main in 'ViewModels\ViewModel.Main.pas', 8 | Model.Database in 'Models\Model.Database.pas', 9 | Model.Main in 'Models\Model.Main.pas', 10 | Model.ProSu.Interfaces in 'SupportCode\Model.ProSu.Interfaces.pas', 11 | Model.ProSu.Provider in 'SupportCode\Model.ProSu.Provider.pas', 12 | Model.ProSu.Subscriber in 'SupportCode\Model.ProSu.Subscriber.pas', 13 | Model.ProSu.InterfaceActions in 'SupportCode\Model.ProSu.InterfaceActions.pas', 14 | Model.Declarations in 'Models\Model.Declarations.pas', 15 | Model.Interfaces in 'Models\Model.Interfaces.pas', 16 | View.InvoiceForm in 'Views\View.InvoiceForm.pas' {SalesInvoiceForm}, 17 | Model.Invoice in 'Models\Model.Invoice.pas', 18 | ViewModel.Invoice in 'ViewModels\ViewModel.Invoice.pas'; 19 | 20 | {$R *.res} 21 | 22 | var 23 | mainModel: IMainModelInterface; 24 | mainViewModel: IMainViewModelInterface; 25 | 26 | begin 27 | mainModel:=CreateMainModelClass; 28 | mainViewModel:=CreateMainViewModelClass; 29 | mainViewModel.Model:=mainModel; 30 | 31 | Application.Initialize; 32 | 33 | MainForm:=TMainForm.Create(Application); 34 | MainForm.ViewModel:=mainViewModel; 35 | 36 | Application.MainForm:=MainForm; 37 | MainForm.Show; 38 | Application.Run; 39 | 40 | end. 41 | -------------------------------------------------------------------------------- /ViewModels/ViewModel.Main.pas: -------------------------------------------------------------------------------- 1 | unit ViewModel.Main; 2 | 3 | interface 4 | 5 | uses Model.Main, Model.Declarations, Model.Interfaces; 6 | 7 | function CreateMainViewModelClass: IMainViewModelInterface; 8 | 9 | implementation 10 | 11 | uses 12 | System.SysUtils; 13 | 14 | type 15 | TMainViewModel = class(TInterfacedObject, IMainViewModelInterface) 16 | private 17 | fModel: IMainModelInterface; 18 | fLabelsText: TMainFormLabelsText; 19 | fTotalSalesValue: Currency; 20 | function GetModel: IMainModelInterface; 21 | procedure SetModel (const newModel: IMainModelInterface); 22 | function GetLabelsText: TMainFormLabelsText; 23 | public 24 | property Model: IMainModelInterface read fModel write SetModel; 25 | property LabelsText: TMainFormLabelsText read GetlabelsText; 26 | function GetTotalSalesValue: string; 27 | end; 28 | 29 | 30 | function CreateMainViewModelClass: IMainViewModelInterface; 31 | begin 32 | result:=TMainViewModel.Create; 33 | end; 34 | 35 | { TMainViewModel } 36 | 37 | function TMainViewModel.GetLabelsText: TMainFormLabelsText; 38 | begin 39 | fLabelsText:=fModel.GetMainFormLabelsText; 40 | result:=fLabelsText; 41 | end; 42 | 43 | function TMainViewModel.GetModel: IMainModelInterface; 44 | begin 45 | result:=fModel; 46 | end; 47 | 48 | function TMainViewModel.GetTotalSalesValue: string; 49 | begin 50 | fTotalSalesValue:=fModel.GetTotalSales; 51 | result:=Format('%10.2f',[fTotalSalesValue]); 52 | end; 53 | 54 | 55 | procedure TMainViewModel.SetModel(const newModel: IMainModelInterface); 56 | begin 57 | fModel:=newModel; 58 | end; 59 | 60 | end. 61 | -------------------------------------------------------------------------------- /SupportCode/Model.ProSu.Provider.pas: -------------------------------------------------------------------------------- 1 | unit Model.ProSu.Provider; 2 | 3 | interface 4 | 5 | uses Model.ProSu.Interfaces, System.Generics.Collections; 6 | 7 | function CreateProSuProviderClass: IProviderInterface; 8 | 9 | implementation 10 | 11 | type 12 | TProSuProvider = class (TInterfacedObject, IProviderInterface) 13 | private 14 | fSubscriberList: TList; 15 | public 16 | procedure Subscribe(const tmpSubscriber: ISubscriberInterface); 17 | procedure Unsubscribe(const tmpSubscriber: ISubscriberInterface); 18 | procedure NotifySubscribers (const notifyClass: INotificationClass); 19 | 20 | constructor Create; 21 | destructor Destroy; override; 22 | end; 23 | 24 | { TProSuProvider } 25 | 26 | constructor TProSuProvider.Create; 27 | begin 28 | inherited; 29 | fSubscriberList:=TList.Create; 30 | end; 31 | 32 | destructor TProSuProvider.Destroy; 33 | var 34 | iTemp: ISubscriberInterface; 35 | begin 36 | for itemp in fSubscriberList do 37 | Unsubscribe(iTemp); 38 | fSubscriberList.Free; 39 | inherited; 40 | end; 41 | 42 | procedure TProSuProvider.NotifySubscribers(const notifyClass: INotificationClass); 43 | var 44 | tmpSubscriber: ISubscriberInterface; 45 | begin 46 | for tmpSubscriber in fSubscriberList do 47 | tmpSubscriber.UpdateSubscriber(notifyClass); 48 | end; 49 | 50 | procedure TProSuProvider.Subscribe(const tmpSubscriber: ISubscriberInterface); 51 | begin 52 | fSubscriberList.Add(tmpSubscriber); 53 | end; 54 | 55 | procedure TProSuProvider.Unsubscribe(const tmpSubscriber: ISubscriberInterface); 56 | begin 57 | fSubscriberList.Remove(tmpSubscriber); 58 | end; 59 | 60 | function CreateProSuProviderClass: IProviderInterface; 61 | begin 62 | result:=TProSuProvider.Create; 63 | end; 64 | 65 | end. 66 | -------------------------------------------------------------------------------- /Views/View.MainForm.fmx: -------------------------------------------------------------------------------- 1 | object MainForm: TMainForm 2 | Left = 0 3 | Top = 0 4 | Caption = 'POSApp' 5 | ClientHeight = 260 6 | ClientWidth = 360 7 | FormFactor.Width = 320 8 | FormFactor.Height = 480 9 | FormFactor.Devices = [Desktop] 10 | OnCreate = FormCreate 11 | DesignerMasterStyle = 0 12 | object LabelTitle: TLabel 13 | Align = Top 14 | StyledSettings = [Family, FontColor] 15 | Margins.Left = 20.000000000000000000 16 | Margins.Top = 20.000000000000000000 17 | Margins.Right = 20.000000000000000000 18 | Position.X = 20.000000000000000000 19 | Position.Y = 20.000000000000000000 20 | Size.Width = 320.000000000000000000 21 | Size.Height = 50.000000000000000000 22 | Size.PlatformDefault = False 23 | TextSettings.Font.Size = 24.000000000000000000 24 | TextSettings.Font.Style = [fsBold] 25 | TextSettings.HorzAlign = Center 26 | Text = 'dummy_Title' 27 | end 28 | object ButtonInvoice: TButton 29 | Position.X = 96.000000000000000000 30 | Position.Y = 93.000000000000000000 31 | Size.Width = 167.000000000000000000 32 | Size.Height = 76.000000000000000000 33 | Size.PlatformDefault = False 34 | TabOrder = 0 35 | Text = 'dummy_IssueButton' 36 | OnClick = ButtonInvoiceClick 37 | end 38 | object LabelTotalSalesText: TLabel 39 | StyledSettings = [Family, FontColor] 40 | Position.X = 16.000000000000000000 41 | Position.Y = 200.000000000000000000 42 | Size.Width = 153.000000000000000000 43 | Size.Height = 25.000000000000000000 44 | Size.PlatformDefault = False 45 | TextSettings.Font.Size = 22.000000000000000000 46 | TextSettings.Font.Style = [fsBold] 47 | Text = 'dummy_TotalSales' 48 | end 49 | object LabelTotalSalesFigure: TLabel 50 | StyledSettings = [Family] 51 | Position.X = 168.000000000000000000 52 | Position.Y = 200.000000000000000000 53 | Size.Width = 169.000000000000000000 54 | Size.Height = 25.000000000000000000 55 | Size.PlatformDefault = False 56 | TextSettings.Font.Size = 22.000000000000000000 57 | TextSettings.Font.Style = [fsBold] 58 | TextSettings.FontColor = claGreen 59 | TextSettings.HorzAlign = Trailing 60 | Text = 'dummy_Sales' 61 | end 62 | end 63 | -------------------------------------------------------------------------------- /Views/View.MainForm.pas: -------------------------------------------------------------------------------- 1 | unit View.MainForm; 2 | 3 | interface 4 | 5 | uses 6 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 7 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, 8 | FMX.Controls.Presentation, ViewModel.Main, Model.Main, Model.ProSu.Interfaces, 9 | Model.Interfaces; 10 | 11 | type 12 | TMainForm = class(TForm) 13 | LabelTitle: TLabel; 14 | ButtonInvoice: TButton; 15 | LabelTotalSalesText: TLabel; 16 | LabelTotalSalesFigure: TLabel; 17 | procedure FormCreate(Sender: TObject); 18 | procedure ButtonInvoiceClick(Sender: TObject); 19 | private 20 | fViewModel: IMainViewModelInterface; 21 | fSubscriber: ISubscriberInterface; 22 | procedure SetViewModel (const newViewModel: IMainViewModelInterface); 23 | procedure NotificationFromProvider (const notifyClass: INotificationClass); 24 | procedure UpdateLabels; 25 | procedure UpdateTotalSalesFigure; 26 | public 27 | property ViewModel: IMainViewModelInterface read fViewModel write SetViewModel; 28 | end; 29 | 30 | var 31 | MainForm: TMainForm; 32 | 33 | implementation 34 | 35 | uses 36 | Model.ProSu.Subscriber, Model.Declarations, 37 | Model.ProSu.InterfaceActions, View.InvoiceForm, 38 | Model.Invoice, ViewModel.Invoice; 39 | 40 | {$R *.fmx} 41 | 42 | { TMainForm } 43 | 44 | procedure TMainForm.ButtonInvoiceClick(Sender: TObject); 45 | var 46 | tmpInvoiceForm: TSalesInvoiceForm; 47 | invoiceModel: IInvoiceModelInterface; 48 | invoiceViewModel: IInvoiceViewModelInterface; 49 | begin 50 | invoiceModel:=CreateInvoiceModelClass; 51 | invoiceViewModel:=CreateInvoiceViewModelClass; 52 | invoiceViewModel.Model:=invoiceModel; 53 | 54 | tmpInvoiceForm:=TSalesInvoiceForm.Create(self); 55 | tmpInvoiceForm.ViewModel:=invoiceViewModel; 56 | tmpInvoiceForm.Provider.Subscribe(fSubscriber); 57 | try 58 | tmpInvoiceForm.ShowModal; 59 | finally 60 | tmpInvoiceForm.Free; 61 | end; 62 | end; 63 | 64 | procedure TMainForm.FormCreate(Sender: TObject); 65 | begin 66 | fSubscriber:=CreateProSuSubscriberClass; 67 | fSubscriber.SetUpdateSubscriberMethod(NotificationFromProvider); 68 | end; 69 | 70 | procedure TMainForm.NotificationFromProvider( 71 | const notifyClass: INotificationClass); 72 | var 73 | tmpNotifClass: TNotificationClass; 74 | begin 75 | if notifyClass is TNotificationClass then 76 | begin 77 | tmpNotifClass:=notifyClass as TNotificationClass; 78 | if actUpdateTotalSalesFigure in tmpNotifClass.Actions then 79 | LabelTotalSalesFigure.Text:=fViewModel.GetTotalSalesValue; 80 | end; 81 | end; 82 | 83 | procedure TMainForm.UpdateLabels; 84 | begin 85 | LabelTitle.Text := fViewModel.LabelsText.Title; 86 | LabelTotalSalesText.Text := fViewModel.LabelsText.TotalSalesText; 87 | LabelTotalSalesFigure.Text := fViewModel.GetTotalSalesValue; 88 | end; 89 | 90 | procedure TMainForm.UpdateTotalSalesFigure; 91 | begin 92 | ButtonInvoice.Text := fViewModel.LabelsText.IssueButtonCaption; 93 | end; 94 | 95 | procedure TMainForm.SetViewModel(const newViewModel: IMainViewModelInterface); 96 | begin 97 | fViewModel:=newViewModel; 98 | UpdateLabels; 99 | UpdateTotalSalesFigure; 100 | end; 101 | 102 | end. 103 | -------------------------------------------------------------------------------- /Models/Model.Declarations.pas: -------------------------------------------------------------------------------- 1 | unit Model.Declarations; 2 | 3 | interface 4 | 5 | uses 6 | Model.ProSu.InterfaceActions, Model.ProSu.Interfaces; 7 | 8 | type 9 | TCustomer = class 10 | private 11 | fID: Integer; 12 | fName: string; 13 | fDiscountRate: Double; 14 | fBalance: Currency; 15 | public 16 | property ID: integer read fID write fID; 17 | property Name: string read fName write fName; 18 | property DiscountRate: double read fDiscountRate write fDiscountRate; 19 | property Balance: Currency read fBalance write fBalance; 20 | end; 21 | 22 | TItem = class 23 | private 24 | fID: Integer; 25 | fDescription: string; 26 | fPrice: Currency; 27 | public 28 | property ID: integer read fID write fID; 29 | property Description: string read fDescription write fDescription; 30 | property Price: Currency read fPrice write fPrice; 31 | end; 32 | 33 | TInvoice = class 34 | private 35 | fID: integer; 36 | fNumber: integer; 37 | fCustomerID: Integer; 38 | public 39 | property ID: Integer read fID write fID; 40 | property Number: Integer read fNumber write fNumber; 41 | property CustomerID: Integer read fCustomerID write fCustomerID; 42 | end; 43 | 44 | TInvoiceItem = class 45 | private 46 | fID: integer; 47 | fInvoiceID: integer; 48 | fItemID: integer; 49 | fUnitPrice: Currency; 50 | fQuantity: integer; 51 | public 52 | property ID: integer read fID write fID; 53 | property InvoiceID: integer read fInvoiceID write fInvoiceID; 54 | property ItemID: integer read fItemID write fItemID; 55 | property UnitPrice: Currency read fUnitPrice write fUnitPrice; 56 | property Quantity: Integer read fQuantity write fQuantity; 57 | end; 58 | 59 | TMainFormLabelsText = record 60 | Title, 61 | IssueButtonCaption, 62 | TotalSalesText: string; 63 | end; 64 | 65 | TNotificationClass = class (TInterfacedObject, INotificationClass) 66 | private 67 | fActions: TInterfaceActions; 68 | fActionValue: Double; 69 | public 70 | property Actions: TInterfaceActions read fActions write fActions; 71 | property ActionValue: double read fActionValue write fActionValue; 72 | end; 73 | 74 | TInvoiceFormLabelsText = record 75 | Title, 76 | CustomerDetailsGroupText, 77 | CustomerText, 78 | CustomerDiscountRateText, 79 | CustomerOutstandingBalanceText, 80 | 81 | InvoiceItemsGroupText, 82 | InvoiceItemsText, 83 | InvoiceItemsQuantityText, 84 | InvoiceItemsAddItemButtonText, 85 | InvoiceItemsGridItemText, 86 | InvoiceItemsGridQuantityText, 87 | InvoiceItemsGridUnitPriceText, 88 | InvoiceItemsGridAmountText, 89 | 90 | BalanceGroupText, 91 | BalanceInvoiceBalanceText, 92 | BalanceDiscountText, 93 | BalanceTotalText, 94 | 95 | PrintInvoiceButtonText, 96 | PrintingText, 97 | CancelButtonText: string; 98 | end; 99 | 100 | TCustomerDetailsText = record 101 | DiscountRate, 102 | OutstandingBalance: string; 103 | end; 104 | 105 | TInvoiceItemsText = record 106 | DescriptionText, 107 | QuantityText, 108 | UnitPriceText, 109 | PriceText, 110 | IDText: array of string; 111 | InvoiceRunningBalance, 112 | InvoiceDiscountFigure, 113 | InvoiceTotalBalance: string; 114 | end; 115 | 116 | TErrorNotificationClass = class (TInterfacedObject, INotificationClass) 117 | private 118 | fActions: TInterfaceErrors; 119 | fActionMessage: string; 120 | public 121 | property Actions: TInterfaceErrors read fActions write fActions; 122 | property ActionMessage: string read fActionMessage write fActionMessage; 123 | end; 124 | 125 | implementation 126 | 127 | end. 128 | 129 | -------------------------------------------------------------------------------- /Models/Model.Interfaces.pas: -------------------------------------------------------------------------------- 1 | unit Model.Interfaces; 2 | 3 | interface 4 | 5 | uses 6 | Model.Declarations, System.Generics.Collections, Model.ProSu.Interfaces; 7 | 8 | type 9 | IDatabaseInterface = interface 10 | ['{DDE3E13A-0EC5-4712-B068-9B510977CF71}'] 11 | function GetCustomerList: TObjectList; 12 | function GetCustomerFromName(const nameStr: string): TCustomer; 13 | function GetItems: TObjectList; 14 | function GetItemFromDescription(const desc: string): TItem; 15 | function GetItemFromID(const id: Integer): TItem; 16 | function GetTotalSales: Currency; 17 | procedure SaveCurrentSales(const currentSales: Currency); 18 | end; 19 | 20 | IMainModelInterface = interface 21 | ['{1345E22D-6229-4C27-8D08-6EA8584BE718}'] 22 | function GetMainFormLabelsText: TMainFormLabelsText; 23 | function GetTotalSales: Currency; 24 | end; 25 | 26 | IMainViewModelInterface = interface 27 | ['{62CF0DAC-C808-4B1A-A6DC-57D7DC1912CB}'] 28 | function GetModel: IMainModelInterface; 29 | procedure SetModel (const newModel: IMainModelInterface); 30 | function GetLabelsText: TMainFormLabelsText; 31 | function GetTotalSalesValue: string; 32 | 33 | property Model: IMainModelInterface read GetModel write SetModel; 34 | property LabelsText: TMainFormLabelsText read GetlabelsText; 35 | end; 36 | 37 | IInvoiceModelInterface = interface 38 | ['{A286914B-7979-4726-8D9C-18865B47CD12}'] 39 | function GetInvoiceFormLabelsText: TInvoiceFormLabelsText; 40 | procedure SetInvoice(const newInvoice: TInvoice); 41 | procedure GetInvoice(var invoice: TInvoice); 42 | procedure GetCustomerList(var customers: TObjectList); 43 | procedure GetItems(var items: TObjectList); 44 | procedure GetCustomer (const customerName: string; var customer: TCustomer); 45 | procedure AddInvoiceItem(const itemDescription: string; const quantity: integer); 46 | procedure GetInvoiceItems (var itemsList: TObjectList); 47 | procedure GetInvoiceItemFromID (const itemID: Integer; var item: TItem); 48 | procedure DeleteAllInvoiceItems; 49 | procedure CalculateInvoiceAmounts; 50 | function GetInvoiceRunningBalance:Currency; 51 | function GetNumberOfInvoiceItems: integer; 52 | procedure DeleteInvoiceItem (const delItemID: integer); 53 | function GetInvoiceDiscount: Currency; 54 | procedure PrintInvoice; 55 | 56 | property InvoiceRunningBalance: Currency read GetInvoiceRunningBalance; 57 | property NumberOfInvoiceItems: integer read GetNumberOfInvoiceItems; 58 | property InvoiceDiscount: Currency read GetInvoiceDiscount; 59 | end; 60 | 61 | IInvoiceViewModelInterface = interface 62 | ['{87D2F27E-8B33-46C5-B44C-DBFC58A871BC}'] 63 | function GetModel: IInvoiceModelInterface; 64 | procedure SetModel(const newModel: IInvoiceModelInterface); 65 | function GetLabelsText: TInvoiceFormLabelsText; 66 | function GetTitleText: string; 67 | function GetGroupBoxInvoiceItemsEnabled: Boolean; 68 | function GetGroupBoxBalanceEnabled: Boolean; 69 | function GetButtonPrintInvoiceEnabled: Boolean; 70 | function GetAniIndicatorProgressVisible: Boolean; 71 | function GetLabelPrintingVisible: Boolean; 72 | procedure GetCustomerList(var customers: TObjectList); 73 | procedure GetItems(var items: TObjectList); 74 | function GetProvider: IProviderInterface; 75 | procedure GetCustomerDetails (const customerName: string; var customerDetails: TCustomerDetailsText); 76 | procedure AddInvoiceItem(const itemDescription: string; const quantity: integer); 77 | procedure DeleteAllInvoiceItems; 78 | function GetInvoiceItemsText: TInvoiceItemsText; 79 | procedure ValidateItem (const newItem: string); 80 | procedure ValidateQuantity (const newQuantityText: string); 81 | procedure DeleteInvoiceItem (const delItemIDAsText: string); 82 | procedure SetDiscountApplied (const discount: boolean); 83 | function GetDiscountApplied: boolean; 84 | procedure PrintInvoice; 85 | 86 | property Model: IInvoiceModelInterface read GetModel write SetModel; 87 | property LabelsText: TInvoiceFormLabelsText read GetLabelsText; 88 | property TitleText: string read GetTitleText; 89 | property GroupBoxInvoiceItemsEnabled: boolean read GetGroupBoxInvoiceItemsEnabled; 90 | property GroupBoxBalanceEnabled: boolean read GetGroupBoxBalanceEnabled; 91 | property ButtonPrintInvoiceEnabled: Boolean read GetButtonPrintInvoiceEnabled; 92 | property AniIndicatorProgressVisible: Boolean read GetAniIndicatorProgressVisible; 93 | property LabelPrintingVisible: Boolean read GetLabelPrintingVisible; 94 | property Provider: IProviderInterface read GetProvider; 95 | property InvoiceItemsText: TInvoiceItemsText read GetInvoiceItemsText; 96 | property DiscountApplied: boolean read GetDiscountApplied write SetDiscountApplied; 97 | end; 98 | 99 | implementation 100 | 101 | end. 102 | -------------------------------------------------------------------------------- /Models/Model.Database.pas: -------------------------------------------------------------------------------- 1 | unit Model.Database; 2 | 3 | interface 4 | 5 | uses Model.Declarations, System.Generics.Collections, Model.Interfaces; 6 | 7 | function CreateDatabaseClass: IDatabaseInterface; 8 | 9 | implementation 10 | 11 | uses 12 | System.IniFiles, System.SysUtils, System.IOUtils; 13 | 14 | type 15 | TDatabase = class (TInterfacedObject, IDatabaseInterface) 16 | private 17 | const 18 | SalesSection = 'Sales'; 19 | SalesTotal = 'Total Sales'; 20 | var 21 | fCustomers: TObjectList; 22 | fItems: TObjectList; 23 | fFullFileName: string; 24 | public 25 | constructor Create; 26 | function GetCustomerList: TObjectList; 27 | function GetCustomerFromName(const nameStr: string): TCustomer; 28 | function GetItems: TObjectList; 29 | function GetItemFromDescription(const desc: string): TItem; 30 | function GetItemFromID(const id: Integer): TItem; 31 | function GetTotalSales: Currency; 32 | procedure SaveCurrentSales(const currentSales: Currency); 33 | destructor Destroy; override; 34 | end; 35 | 36 | function CreateDatabaseClass: IDatabaseInterface; 37 | begin 38 | result:=TDatabase.Create; 39 | end; 40 | { TDatabase } 41 | 42 | constructor TDatabase.Create; 43 | var 44 | tmpCustomer: TCustomer; 45 | tmpItem: TItem; 46 | begin 47 | inherited; 48 | fFullFileName:=TPath.Combine(ExtractFilePath(ParamStr(0)), 'POSApp.data'); 49 | fCustomers:=TObjectList.Create; 50 | 51 | //Create mock customers 52 | tmpCustomer:=TCustomer.Create; 53 | tmpCustomer.ID:=1; 54 | tmpCustomer.Name:='John'; 55 | tmpCustomer.DiscountRate:=12.50; 56 | tmpCustomer.Balance:=-Random(5000); 57 | fCustomers.Add(tmpCustomer); 58 | 59 | tmpCustomer:=TCustomer.Create; 60 | tmpCustomer.ID:=2; 61 | tmpCustomer.Name:='Alex'; 62 | tmpCustomer.DiscountRate:=23.00; 63 | tmpCustomer.Balance:=-Random(2780); 64 | fCustomers.Add(tmpCustomer); 65 | 66 | tmpCustomer:=TCustomer.Create; 67 | tmpCustomer.ID:=3; 68 | tmpCustomer.Name:='Peter'; 69 | tmpCustomer.DiscountRate:=0.0; 70 | tmpCustomer.Balance:=-Random(9000); 71 | fCustomers.Add(tmpCustomer); 72 | 73 | tmpCustomer:=TCustomer.Create; 74 | tmpCustomer.ID:=4; 75 | tmpCustomer.Name:='Retail Customer'; 76 | tmpCustomer.DiscountRate:=0.0; 77 | tmpCustomer.Balance:=0.0; 78 | fCustomers.Add(tmpCustomer); 79 | 80 | 81 | fItems:=TObjectList.Create; 82 | //Create mock items to sell 83 | tmpItem:=TItem.Create; 84 | tmpItem.ID:=100; 85 | tmpItem.Description:='T-shirt'; 86 | tmpItem.Price:=13.55; 87 | fItems.Add(tmpItem); 88 | 89 | tmpItem:=TItem.Create; 90 | tmpItem.ID:=200; 91 | tmpItem.Description:='Trousers'; 92 | tmpItem.Price:=23.45; 93 | fItems.Add(tmpItem); 94 | 95 | tmpItem:=TItem.Create; 96 | tmpItem.ID:=300; 97 | tmpItem.Description:='Coat'; 98 | tmpItem.Price:=64.00; 99 | fItems.Add(tmpItem); 100 | 101 | tmpItem:=TItem.Create; 102 | tmpItem.ID:=400; 103 | tmpItem.Description:='Shirt'; 104 | tmpItem.Price:=28.00; 105 | fItems.Add(tmpItem); 106 | 107 | end; 108 | 109 | destructor TDatabase.Destroy; 110 | begin 111 | fCustomers.Free; 112 | fItems.Free; 113 | inherited; 114 | end; 115 | 116 | function TDatabase.GetCustomerFromName(const nameStr: string): TCustomer; 117 | var 118 | tmpCustomer: TCustomer; 119 | begin 120 | if not Assigned(fCustomers) then Exit; 121 | result:=nil; 122 | for tmpCustomer in fCustomers do 123 | begin 124 | if tmpCustomer.Name=nameStr then 125 | begin 126 | result:=tmpCustomer; 127 | exit; 128 | end; 129 | end; 130 | end; 131 | 132 | function TDatabase.GetCustomerList: TObjectList; 133 | begin 134 | result:=fCustomers; 135 | end; 136 | 137 | function TDatabase.GetItemFromDescription(const desc: string): TItem; 138 | var 139 | tmpItem: TItem; 140 | begin 141 | result:=nil; 142 | if not Assigned(fItems) then Exit; 143 | for tmpItem in fItems do 144 | begin 145 | if tmpItem.Description=desc then 146 | begin 147 | result:=tmpItem; 148 | exit; 149 | end; 150 | end; 151 | end; 152 | 153 | 154 | function TDatabase.GetItemFromID(const id: Integer): TItem; 155 | var 156 | tmpItem: TItem; 157 | begin 158 | result:=nil; 159 | if not Assigned(fItems) then Exit; 160 | for tmpItem in fItems do 161 | begin 162 | if tmpItem.ID=id then 163 | begin 164 | result:=tmpItem; 165 | exit; 166 | end; 167 | end; 168 | end; 169 | 170 | 171 | function TDatabase.GetItems: TObjectList; 172 | begin 173 | result:=fItems; 174 | end; 175 | 176 | function TDatabase.GetTotalSales: Currency; 177 | var 178 | tmpINIFile: TIniFile; 179 | amount: Currency; 180 | begin 181 | amount:=0.00; 182 | tmpINIFile:=TIniFile.Create(fFullFileName); 183 | try 184 | amount:=tmpINIFile.ReadFloat(SalesSection,SalesTotal,0.00); 185 | finally 186 | tmpINIFile.Free; 187 | result:=amount; 188 | end; 189 | 190 | end; 191 | 192 | 193 | procedure TDatabase.SaveCurrentSales(const currentSales: Currency); 194 | var 195 | tmpINIFile: TIniFile; 196 | begin 197 | tmpINIFile:=TIniFile.Create(fFullFileName); 198 | try 199 | tmpINIFile.WriteFloat(SalesSection,SalesTotal, GetTotalSales+currentSales); 200 | finally 201 | tmpINIFile.Free; 202 | end; 203 | end; 204 | 205 | end. 206 | -------------------------------------------------------------------------------- /Models/Model.Invoice.pas: -------------------------------------------------------------------------------- 1 | unit Model.Invoice; 2 | 3 | interface 4 | 5 | uses 6 | Model.Interfaces; 7 | 8 | function CreateInvoiceModelClass: IInvoiceModelInterface; 9 | 10 | implementation 11 | 12 | uses 13 | Model.Declarations, System.Generics.Collections, Model.Database, System.SysUtils; 14 | 15 | type 16 | TInvoiceModel = class (TInterfacedObject, IInvoiceModelInterface) 17 | private 18 | fInvoiceFormLabelsText: TInvoiceFormLabelsText; 19 | fDatabase: IDatabaseInterface; 20 | fInvoice: TInvoice; 21 | fCurrentInvoiceItems: TObjectList; 22 | fRunningBalance, 23 | fDiscount: Currency; 24 | function GetInvoiceRunningBalance:Currency; 25 | procedure CalculateInvoiceAmounts; 26 | function GetNumberOfInvoiceItems:integer; 27 | procedure GetCustomerFromID (const customerID: integer; var customer: TCustomer); 28 | function GetInvoiceDiscount: Currency; 29 | public 30 | function GetInvoiceFormLabelsText: TInvoiceFormLabelsText; 31 | constructor Create; 32 | destructor Destroy; override; 33 | procedure SetInvoice(const newInvoice: TInvoice); 34 | procedure GetInvoice(var invoice: TInvoice); 35 | procedure GetCustomerList(var customers: TObjectList); 36 | procedure GetItems(var items: TObjectList); 37 | procedure GetCustomer (const customerName: string; var customer: TCustomer); 38 | procedure AddInvoiceItem(const itemDescription: string; const quantity: integer); 39 | procedure GetInvoiceItems (var itemsList: TObjectList); 40 | procedure GetInvoiceItemFromID (const itemID: Integer; var item: TItem); 41 | procedure DeleteAllInvoiceItems; 42 | procedure DeleteInvoiceItem (const delItemID: integer); 43 | procedure PrintInvoice; 44 | 45 | property InvoiceRunningBalance: Currency read GetInvoiceRunningBalance; 46 | property NumberOfInvoiceItems: integer read GetNumberOfInvoiceItems; 47 | property InvoiceDiscount: Currency read GetInvoiceDiscount; 48 | end; 49 | 50 | function CreateInvoiceModelClass: IInvoiceModelInterface; 51 | begin 52 | result:=TInvoiceModel.Create; 53 | end; 54 | 55 | 56 | { TInvoiceModel } 57 | 58 | procedure TInvoiceModel.AddInvoiceItem(const itemDescription: string; const quantity: integer); 59 | var 60 | tmpInvoiceItem: TInvoiceItem; 61 | tmpItem: TItem; 62 | begin 63 | if trim(itemDescription)='' then 64 | Exit; 65 | 66 | tmpItem:=fDatabase.GetItemFromDescription(trim(itemDescription)); 67 | if not Assigned(tmpItem) then 68 | Exit; 69 | 70 | tmpInvoiceItem:=TInvoiceItem.Create; 71 | tmpInvoiceItem.ID:=tmpItem.ID; 72 | tmpInvoiceItem.InvoiceID:=fInvoice.ID; 73 | tmpInvoiceItem.UnitPrice:=tmpItem.Price; 74 | tmpInvoiceItem.Quantity:=quantity; 75 | 76 | fCurrentInvoiceItems.Add(tmpInvoiceItem); 77 | 78 | end; 79 | 80 | procedure TInvoiceModel.CalculateInvoiceAmounts; 81 | var 82 | tmpItem: TInvoiceItem; 83 | begin 84 | fRunningBalance:=0.00; 85 | for tmpItem in fCurrentInvoiceItems do 86 | fRunningBalance:=fRunningBalance+(tmpItem.Quantity*tmpItem.UnitPrice); 87 | end; 88 | 89 | constructor TInvoiceModel.Create; 90 | begin 91 | fDatabase:=CreateDatabaseClass; 92 | fInvoice:=TInvoice.Create; 93 | fInvoice.ID:=1; 94 | fInvoice.Number:=Random(3000); 95 | fCurrentInvoiceItems:=TObjectList.Create; 96 | end; 97 | 98 | procedure TInvoiceModel.DeleteAllInvoiceItems; 99 | begin 100 | fCurrentInvoiceItems.Clear; 101 | end; 102 | 103 | procedure TInvoiceModel.DeleteInvoiceItem(const delItemID: integer); 104 | var 105 | i: integer; 106 | begin 107 | if delItemID<=0 then 108 | Exit; 109 | for i := 0 to fCurrentInvoiceItems.Count-1 do 110 | begin 111 | if fCurrentInvoiceItems.Items[i].ID=delItemID then 112 | begin 113 | fCurrentInvoiceItems.Delete(i); 114 | break; 115 | end; 116 | end; 117 | end; 118 | 119 | destructor TInvoiceModel.Destroy; 120 | begin 121 | fCurrentInvoiceItems.Free; 122 | fInvoice.Free; 123 | inherited; 124 | end; 125 | 126 | procedure TInvoiceModel.GetCustomer(const customerName: string; 127 | var customer: TCustomer); 128 | begin 129 | if not Assigned(customer) then 130 | Exit; 131 | if trim(customerName)<>'' then 132 | begin 133 | customer.ID:=fDatabase.GetCustomerFromName(trim(customerName)).ID; 134 | customer.Name:=fDatabase.GetCustomerFromName(trim(customerName)).Name; 135 | customer.DiscountRate:=fDatabase.GetCustomerFromName(trim(customerName)).DiscountRate; 136 | customer.Balance:=fDatabase.GetCustomerFromName(trim(customerName)).Balance; 137 | 138 | fInvoice.CustomerID:=customer.ID; 139 | end; 140 | end; 141 | 142 | procedure TInvoiceModel.GetCustomerFromID(const customerID: integer; 143 | var customer: TCustomer); 144 | var 145 | tmpCustomerList: TObjectList; 146 | tmpCustomer: TCustomer; 147 | begin 148 | if not Assigned(customer) then 149 | Exit; 150 | GetCustomerList(tmpCustomerList); 151 | for tmpCustomer in tmpCustomerList do 152 | if tmpCustomer.ID=customerID then 153 | begin 154 | customer.ID:=tmpCustomer.ID; 155 | customer.Name:=tmpCustomer.Name; 156 | customer.DiscountRate:=tmpCustomer.DiscountRate; 157 | customer.Balance:=tmpCustomer.Balance; 158 | break; 159 | end; 160 | end; 161 | 162 | procedure TInvoiceModel.GetCustomerList(var customers: TObjectList); 163 | begin 164 | customers:=fDatabase.GetCustomerList 165 | end; 166 | 167 | procedure TInvoiceModel.GetInvoice(var invoice: TInvoice); 168 | begin 169 | invoice:=fInvoice; 170 | end; 171 | 172 | function TInvoiceModel.GetInvoiceDiscount: Currency; 173 | var 174 | tmpCustomer: TCustomer; 175 | tmpDiscount: Double; 176 | begin 177 | fDiscount:=0.00; 178 | tmpDiscount:=0.00; 179 | tmpCustomer:=TCustomer.Create; 180 | GetCustomerFromID(fInvoice.CustomerID, tmpCustomer); 181 | tmpDiscount:=tmpCustomer.DiscountRate; 182 | tmpCustomer.Free; 183 | 184 | CalculateInvoiceAmounts; 185 | fDiscount:=fRunningBalance*tmpDiscount/100; 186 | Result:=fDiscount; 187 | end; 188 | 189 | procedure TInvoiceModel.SetInvoice(const newInvoice: TInvoice); 190 | begin 191 | fInvoice:=newInvoice; 192 | end; 193 | 194 | function TInvoiceModel.GetInvoiceFormLabelsText: TInvoiceFormLabelsText; 195 | begin 196 | fInvoiceFormLabelsText.Title:='Sales Invoice'; 197 | fInvoiceFormLabelsText.CustomerDetailsGroupText:='Customer Details'; 198 | fInvoiceFormLabelsText.CustomerText:='Customer:'; 199 | fInvoiceFormLabelsText.CustomerDiscountRateText:='Discount Rate:'; 200 | fInvoiceFormLabelsText.CustomerOutstandingBalanceText:='Outstanding Balance:'; 201 | 202 | fInvoiceFormLabelsText.InvoiceItemsGroupText:='Invoice Items'; 203 | fInvoiceFormLabelsText.InvoiceItemsText:='Item:'; 204 | fInvoiceFormLabelsText.InvoiceItemsQuantityText:='Quantity:'; 205 | fInvoiceFormLabelsText.InvoiceItemsAddItemButtonText:='Add Item'; 206 | 207 | fInvoiceFormLabelsText.InvoiceItemsGridItemText:='Item'; 208 | fInvoiceFormLabelsText.InvoiceItemsGridQuantityText:='Quantity'; 209 | fInvoiceFormLabelsText.InvoiceItemsGridUnitPriceText:='Unit Price'; 210 | fInvoiceFormLabelsText.InvoiceItemsGridAmountText:='Amount'; 211 | 212 | fInvoiceFormLabelsText.BalanceGroupText:='Balance'; 213 | fInvoiceFormLabelsText.BalanceInvoiceBalanceText:='Invoice Balance:'; 214 | fInvoiceFormLabelsText.BalanceDiscountText:='Discount'; 215 | fInvoiceFormLabelsText.BalanceTotalText:='Total:'; 216 | 217 | fInvoiceFormLabelsText.PrintInvoiceButtonText:='Print Invoice'; 218 | fInvoiceFormLabelsText.PrintingText:='Printing Invoice...'; 219 | fInvoiceFormLabelsText.CancelButtonText:='Cancel'; 220 | 221 | result:=fInvoiceFormLabelsText; 222 | end; 223 | 224 | procedure TInvoiceModel.GetInvoiceItemFromID(const itemID: Integer; 225 | var item: TItem); 226 | var 227 | tmpItem: TItem; 228 | begin 229 | if (not Assigned(item)) then 230 | Exit; 231 | tmpItem:=fDatabase.GetItemFromID(itemID); 232 | if Assigned(tmpItem) then 233 | begin 234 | item.ID:=tmpItem.ID; 235 | item.Description:=tmpItem.Description; 236 | item.Price:=tmpItem.Price 237 | end; 238 | end; 239 | 240 | procedure TInvoiceModel.GetInvoiceItems( 241 | var itemsList: TObjectList); 242 | var 243 | tmpInvoiceItem: TInvoiceItem; 244 | i: integer; 245 | begin 246 | if not Assigned(itemsList) then 247 | Exit; 248 | itemsList.Clear; 249 | for i:=0 to fCurrentInvoiceItems.Count-1 do 250 | begin 251 | tmpInvoiceItem:=TInvoiceItem.Create; 252 | tmpInvoiceItem.ID:=fCurrentInvoiceItems.Items[i].ID; 253 | tmpInvoiceItem.InvoiceID:=fCurrentInvoiceItems.Items[i].InvoiceID; 254 | tmpInvoiceItem.ItemID:=fCurrentInvoiceItems.Items[i].ItemID; 255 | tmpInvoiceItem.UnitPrice:=fCurrentInvoiceItems.Items[i].UnitPrice; 256 | tmpInvoiceItem.Quantity:=fCurrentInvoiceItems.Items[i].Quantity; 257 | 258 | itemsList.Add(tmpInvoiceItem); 259 | end; 260 | end; 261 | 262 | function TInvoiceModel.GetInvoiceRunningBalance: Currency; 263 | begin 264 | CalculateInvoiceAmounts; 265 | Result:=fRunningBalance; 266 | end; 267 | 268 | procedure TInvoiceModel.GetItems(var items: TObjectList); 269 | begin 270 | items:=fDatabase.GetItems 271 | end; 272 | 273 | function TInvoiceModel.GetNumberOfInvoiceItems: integer; 274 | begin 275 | result:=fCurrentInvoiceItems.Count; 276 | end; 277 | 278 | procedure TInvoiceModel.PrintInvoice; 279 | begin 280 | fDatabase.SaveCurrentSales(fRunningBalance-fDiscount); 281 | end; 282 | 283 | end. 284 | -------------------------------------------------------------------------------- /ViewModels/ViewModel.Invoice.pas: -------------------------------------------------------------------------------- 1 | unit ViewModel.Invoice; 2 | 3 | interface 4 | 5 | uses 6 | Model.Interfaces; 7 | 8 | function CreateInvoiceViewModelClass: IInvoiceViewModelInterface; 9 | 10 | implementation 11 | 12 | uses 13 | Model.Declarations, System.SysUtils, System.Generics.Collections, 14 | Model.ProSu.Interfaces, Model.ProSu.Provider, Model.ProSu.InterfaceActions; 15 | 16 | type 17 | TInvoiceViewModel = class(TInterfacedObject, IInvoiceViewModelInterface) 18 | private 19 | fModel: IInvoiceModelInterface; 20 | fLabelsText: TInvoiceFormLabelsText; 21 | fTitle: string; 22 | fInvoiceItemsEnabled, 23 | fBalanceEnabled, 24 | fPrintButtonEnabled, 25 | fAniIndicatorVisible, 26 | fPrintingLabelVisible, 27 | fDiscountChecked: boolean; 28 | fProvider: IProviderInterface; 29 | fInvoiceItemsText: TInvoiceItemsText; 30 | function GetModel: IInvoiceModelInterface; 31 | procedure SetModel(const newModel: IInvoiceModelInterface); 32 | function GetLabelsText: TInvoiceFormLabelsText; 33 | function GetTitleText: string; 34 | function GetGroupBoxInvoiceItemsEnabled: Boolean; 35 | function GetGroupBoxBalanceEnabled: Boolean; 36 | function GetButtonPrintInvoiceEnabled: Boolean; 37 | function GetAniIndicatorProgressVisible: Boolean; 38 | function GetLabelPrintingVisible: Boolean; 39 | procedure GetCustomerList(var customers: TObjectList); 40 | procedure GetItems(var items: TObjectList); 41 | function GetProvider: IProviderInterface; 42 | procedure GetCustomerDetails (const customerName: string; var customerDetails: TCustomerDetailsText); 43 | function GetInvoiceItemsText: TInvoiceItemsText; 44 | procedure SendNotification (const actions: TInterfaceActions); 45 | procedure SendErrorNotification (const errorType: TInterfaceErrors; 46 | const errorMessage: string); 47 | procedure SetDiscountApplied (const discount: boolean); 48 | function GetDiscountApplied: boolean; 49 | public 50 | constructor Create; 51 | procedure AddInvoiceItem(const itemDescription: string; const quantity: integer); 52 | procedure DeleteAllInvoiceItems; 53 | procedure ValidateItem (const newItem: string); 54 | procedure ValidateQuantity (const newQuantityText: string); 55 | procedure DeleteInvoiceItem (const delItemIDAsText: string); 56 | procedure PrintInvoice; 57 | 58 | property Model: IInvoiceModelInterface read GetModel write SetModel; 59 | property LabelsText: TInvoiceFormLabelsText read GetLabelsText; 60 | property TitleText: string read GetTitleText; 61 | property GroupBoxInvoiceItemsEnabled: boolean read GetGroupBoxInvoiceItemsEnabled; 62 | property GroupBoxBalanceEnabled: boolean read GetGroupBoxBalanceEnabled; 63 | property ButtonPrintInvoiceEnabled: Boolean read GetButtonPrintInvoiceEnabled; 64 | property AniIndicatorProgressVisible: Boolean read GetAniIndicatorProgressVisible; 65 | property LabelPrintingVisible: Boolean read GetLabelPrintingVisible; 66 | property Provider: IProviderInterface read GetProvider; 67 | property InvoiceItemsText: TInvoiceItemsText read GetInvoiceItemsText; 68 | property DiscountApplied: boolean read GetDiscountApplied write SetDiscountApplied; 69 | end; 70 | 71 | function CreateInvoiceViewModelClass: IInvoiceViewModelInterface; 72 | begin 73 | result:=TInvoiceViewModel.Create; 74 | end; 75 | 76 | { TInvoiceViewModel } 77 | 78 | procedure TInvoiceViewModel.AddInvoiceItem(const itemDescription: string; 79 | const quantity: integer); 80 | begin 81 | fModel.AddInvoiceItem(itemDescription, quantity); 82 | SendNotification([actInvoiceItemsChanges]); 83 | end; 84 | 85 | constructor TInvoiceViewModel.Create; 86 | begin 87 | fInvoiceItemsEnabled:=false; 88 | fBalanceEnabled:=false; 89 | fPrintButtonEnabled:=false; 90 | fAniIndicatorVisible:=false; 91 | fPrintingLabelVisible:=false; 92 | fDiscountChecked:=false; 93 | fProvider:=CreateProSuProviderClass; 94 | end; 95 | 96 | procedure TInvoiceViewModel.DeleteAllInvoiceItems; 97 | begin 98 | fModel.DeleteAllInvoiceItems; 99 | SendNotification([actInvoiceItemsChanges]); 100 | end; 101 | 102 | procedure TInvoiceViewModel.DeleteInvoiceItem(const delItemIDAsText: string); 103 | begin 104 | if (trim(delItemIDAsText)='') then 105 | Exit; 106 | fModel.DeleteInvoiceItem(delItemIDAsText.ToInteger); 107 | SendNotification([actInvoiceItemsChanges]); 108 | end; 109 | 110 | function TInvoiceViewModel.GetAniIndicatorProgressVisible: Boolean; 111 | begin 112 | result:=fAniIndicatorVisible; 113 | end; 114 | 115 | function TInvoiceViewModel.GetButtonPrintInvoiceEnabled: Boolean; 116 | begin 117 | result:=fPrintButtonEnabled; 118 | end; 119 | 120 | procedure TInvoiceViewModel.GetCustomerDetails(const customerName: string; 121 | var customerDetails: TCustomerDetailsText); 122 | var 123 | tmpCustomer: TCustomer; 124 | begin 125 | if trim(customerName)='' then 126 | begin 127 | customerDetails.DiscountRate:='Please Choose a Customer'; 128 | customerDetails.OutstandingBalance:='Please Choose a Customer'; 129 | end 130 | else 131 | begin 132 | tmpCustomer:=TCustomer.Create; 133 | fModel.GetCustomer(trim(customerName), tmpCustomer); 134 | customerDetails.DiscountRate:=Format('%5.2f', [tmpCustomer.DiscountRate])+'%'; 135 | customerDetails.OutstandingBalance:=Format('%-n',[tmpCustomer.Balance]); 136 | tmpCustomer.Free; 137 | 138 | fInvoiceItemsEnabled:=true; 139 | fBalanceEnabled:=true; 140 | fDiscountChecked:=false; 141 | end; 142 | end; 143 | 144 | procedure TInvoiceViewModel.GetCustomerList( 145 | var customers: TObjectList); 146 | begin 147 | fModel.GetCustomerList(customers); 148 | end; 149 | 150 | function TInvoiceViewModel.GetDiscountApplied: boolean; 151 | begin 152 | result:=fDiscountChecked; 153 | end; 154 | 155 | function TInvoiceViewModel.GetGroupBoxBalanceEnabled: Boolean; 156 | begin 157 | result:=fBalanceEnabled; 158 | end; 159 | 160 | function TInvoiceViewModel.GetGroupBoxInvoiceItemsEnabled: Boolean; 161 | begin 162 | Result:=fInvoiceItemsEnabled; 163 | end; 164 | 165 | function TInvoiceViewModel.GetInvoiceItemsText: TInvoiceItemsText; 166 | var 167 | tmpRunning, 168 | tmpDiscount: Currency; 169 | tmpInvoiceItems: TObjectList; 170 | i, tmpLen: integer; 171 | tmpItem: TItem; 172 | begin 173 | tmpLen:=0; 174 | SetLength(fInvoiceItemsText.DescriptionText,tmpLen); 175 | SetLength(fInvoiceItemsText.QuantityText,tmpLen); 176 | SetLength(fInvoiceItemsText.UnitPriceText,tmpLen); 177 | SetLength(fInvoiceItemsText.PriceText,tmpLen); 178 | SetLength(fInvoiceItemsText.IDText, tmpLen); 179 | tmpRunning:=0.00; 180 | tmpDiscount:=0.00; 181 | 182 | tmpInvoiceItems:=TObjectList.Create; 183 | fModel.GetInvoiceItems(tmpInvoiceItems); 184 | for i := 0 to tmpInvoiceItems.Count-1 do 185 | begin 186 | tmpLen:=Length(fInvoiceItemsText.DescriptionText)+1; 187 | SetLength(fInvoiceItemsText.DescriptionText,tmpLen); 188 | SetLength(fInvoiceItemsText.QuantityText,tmpLen); 189 | SetLength(fInvoiceItemsText.UnitPriceText,tmpLen); 190 | SetLength(fInvoiceItemsText.PriceText,tmpLen); 191 | SetLength(fInvoiceItemsText.IDText, tmpLen); 192 | 193 | tmpItem:=TItem.Create; 194 | fModel.GetInvoiceItemFromID(tmpInvoiceItems.Items[i].ID, tmpItem); 195 | fInvoiceItemsText.DescriptionText[tmpLen-1]:=tmpItem.Description; 196 | tmpItem.Free; 197 | 198 | fInvoiceItemsText.QuantityText[tmpLen-1]:=tmpInvoiceItems.Items[i].Quantity.ToString; 199 | fInvoiceItemsText.UnitPriceText[tmpLen-1]:=format('%10.2f',[tmpInvoiceItems.Items[i].UnitPrice]); 200 | fInvoiceItemsText.PriceText[tmpLen-1]:= 201 | format('%10.2f',[tmpInvoiceItems.Items[i].UnitPrice*tmpInvoiceItems.items[i].Quantity]); 202 | fInvoiceItemsText.IDText[tmpLen-1]:=tmpInvoiceItems.Items[i].ID.ToString; 203 | end; 204 | tmpInvoiceItems.Free; 205 | 206 | tmpRunning:=fModel.InvoiceRunningBalance; 207 | 208 | if fDiscountChecked then 209 | tmpDiscount:=fModel.InvoiceDiscount; 210 | 211 | 212 | fInvoiceItemsText.InvoiceRunningBalance:=Format('%10.2f', [tmpRunning]); 213 | fInvoiceItemsText.InvoiceDiscountFigure:=Format('%10.2f', [tmpDiscount]); 214 | fInvoiceItemsText.InvoiceTotalBalance:=Format('%10.2f', [tmpRunning-tmpDiscount]); 215 | 216 | fPrintButtonEnabled:=fModel.NumberOfInvoiceItems > 0; 217 | 218 | Result:=fInvoiceItemsText; 219 | end; 220 | 221 | procedure TInvoiceViewModel.GetItems(var items: TObjectList); 222 | begin 223 | fModel.GetItems(items); 224 | end; 225 | 226 | function TInvoiceViewModel.GetLabelPrintingVisible: Boolean; 227 | begin 228 | result:=fPrintingLabelVisible; 229 | end; 230 | 231 | function TInvoiceViewModel.GetLabelsText: TInvoiceFormLabelsText; 232 | begin 233 | result:=fModel.GetInvoiceFormLabelsText; 234 | end; 235 | 236 | function TInvoiceViewModel.GetModel: IInvoiceModelInterface; 237 | begin 238 | result:=fModel; 239 | end; 240 | 241 | function TInvoiceViewModel.GetProvider: IProviderInterface; 242 | begin 243 | result:=fProvider; 244 | end; 245 | 246 | function TInvoiceViewModel.GetTitleText: string; 247 | var 248 | tmpInvoice: TInvoice; 249 | begin 250 | fModel.GetInvoice(tmpInvoice); 251 | if Assigned(tmpInvoice) then 252 | result:=fModel.GetInvoiceFormLabelsText.Title+' #'+IntToStr(tmpInvoice.Number) 253 | end; 254 | 255 | procedure TInvoiceViewModel.PrintInvoice; 256 | var 257 | tmpNotifClass: TNotificationClass; 258 | begin 259 | fAniIndicatorVisible:=true; 260 | fPrintingLabelVisible:=true; 261 | 262 | SendNotification([actPrintingStart]); 263 | 264 | fModel.PrintInvoice; 265 | 266 | fAniIndicatorVisible:=false; 267 | fPrintingLabelVisible:=false; 268 | 269 | SendNotification([actPrintingFinish]); 270 | end; 271 | 272 | procedure TInvoiceViewModel.SendErrorNotification (const errorType: TInterfaceErrors; 273 | const errorMessage: string); 274 | var 275 | tmpErrorNotificationClass: TErrorNotificationClass; 276 | begin 277 | tmpErrorNotificationClass:=TErrorNotificationClass.Create; 278 | try 279 | tmpErrorNotificationClass.Actions:=errorType; 280 | tmpErrorNotificationClass.ActionMessage:=errorMessage; 281 | fProvider.NotifySubscribers(tmpErrorNotificationClass); 282 | finally 283 | tmpErrorNotificationClass.Free; 284 | end; 285 | 286 | end; 287 | 288 | procedure TInvoiceViewModel.SendNotification(const actions: TInterfaceActions); 289 | var 290 | tmpNotificationClass: TNotificationClass; 291 | begin 292 | tmpNotificationClass:=TNotificationClass.Create; 293 | tmpNotificationClass.Actions:=actions; 294 | if Assigned(fProvider) then 295 | fProvider.NotifySubscribers(tmpNotificationClass); 296 | tmpNotificationClass.Free; 297 | end; 298 | 299 | procedure TInvoiceViewModel.SetDiscountApplied(const discount: boolean); 300 | begin 301 | fDiscountChecked:=discount; 302 | end; 303 | 304 | procedure TInvoiceViewModel.SetModel(const newModel: IInvoiceModelInterface); 305 | begin 306 | fModel:=newModel; 307 | end; 308 | 309 | procedure TInvoiceViewModel.ValidateItem(const newItem: string); 310 | begin 311 | if trim(newItem)='' then 312 | SendErrorNotification([errInvoiceItemEmpty], 'Please choose an item'); 313 | end; 314 | 315 | procedure TInvoiceViewModel.ValidateQuantity(const newQuantityText: string); 316 | var 317 | value, 318 | code: integer; 319 | begin 320 | if trim(newQuantityText)='' then 321 | begin 322 | SendErrorNotification([errInvoiceItemQuantityEmpty], 'Please enter quantity'); 323 | Exit; 324 | end; 325 | 326 | Val(trim(newQuantityText), value, code); 327 | if code<>0 then 328 | begin 329 | SendErrorNotification([errInvoiceItemQuantityNotNumber], 'Quantity must be a number'); 330 | Exit; 331 | end; 332 | 333 | if trim(newQuantityText).ToInteger<=0 then 334 | begin 335 | SendErrorNotification([errInvoiceItemQuantityNonPositive], 336 | 'The quantity must be positive number'); 337 | Exit; 338 | end; 339 | 340 | SendErrorNotification([errNoError], ''); 341 | end; 342 | 343 | end. 344 | -------------------------------------------------------------------------------- /Views/View.InvoiceForm.pas: -------------------------------------------------------------------------------- 1 | unit View.InvoiceForm; 2 | 3 | interface 4 | 5 | uses 6 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 7 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, 8 | FMX.Controls.Presentation, FMX.StdCtrls, FMX.ExtCtrls, System.Rtti, FMX.Grid, 9 | FMX.Layouts, FMX.Objects, FMX.Edit, FMX.ListBox, 10 | System.Generics.Collections, FMX.ListView.Types, FMX.ListView.Appearances, 11 | FMX.ListView.Adapters.Base, FMX.ListView, FMX.Menus, Model.Interfaces, 12 | Model.ProSu.Interfaces, Model.ProSu.Subscriber, Model.Declarations; 13 | 14 | type 15 | TSalesInvoiceForm = class(TForm) 16 | LabelCustomer: TLabel; 17 | PopupBoxCustomer: TPopupBox; 18 | GroupBoxCustomerDetails: TGroupBox; 19 | LabelDiscountRate: TLabel; 20 | LabelDiscountRateFigure: TLabel; 21 | LabelTotalBalanceBig: TLabel; 22 | LabelOutstandingBalance: TLabel; 23 | LabelInvoiceBalance: TLabel; 24 | GroupBoxInvoiceItems: TGroupBox; 25 | PopupBoxItems: TPopupBox; 26 | LabelItem: TLabel; 27 | GroupBoxBalance: TGroupBox; 28 | LabelRunningBalance: TLabel; 29 | LabelInvBalance: TLabel; 30 | CheckBoxDiscount: TCheckBox; 31 | LabelDiscount: TLabel; 32 | LineHorizontal: TLine; 33 | LabelTotalBalance: TLabel; 34 | ButtonCancel: TButton; 35 | ButtonPrintInvoice: TButton; 36 | LabelQuantity: TLabel; 37 | EditQuantity: TEdit; 38 | ButtonAddItem: TButton; 39 | StringGridItems: TStringGrid; 40 | StringColumn1: TStringColumn; 41 | StringColumn2: TStringColumn; 42 | StringColumn3: TStringColumn; 43 | StringColumn4: TStringColumn; 44 | LabelTotal: TLabel; 45 | AniIndicatorProgress: TAniIndicator; 46 | LabelPrinting: TLabel; 47 | LabelTitle: TLabel; 48 | PopupMenuItems: TPopupMenu; 49 | MenuItemDeleteItem: TMenuItem; 50 | StringColumn5: TStringColumn; 51 | procedure PopupBoxCustomerChange(Sender: TObject); 52 | procedure ButtonAddItemClick(Sender: TObject); 53 | procedure MenuItemDeleteItemClick(Sender: TObject); 54 | procedure CheckBoxDiscountChange(Sender: TObject); 55 | procedure ButtonPrintInvoiceClick(Sender: TObject); 56 | procedure ButtonCancelClick(Sender: TObject); 57 | private 58 | fViewModel: IInvoiceViewModelInterface; 59 | fSubscriber: ISubscriberInterface; 60 | fCustomerDetailsText: TCustomerDetailsText; 61 | fInvoiceItemsText: TInvoiceItemsText; 62 | fProvider: IProviderInterface; 63 | procedure SetViewModel (const newViewModel: IInvoiceViewModelInterface); 64 | procedure UpdateLabels; 65 | procedure SetupGUI; 66 | procedure UpdateGroups; 67 | procedure UpdatePrintingStatus; 68 | procedure UpdateCustomerDetails; 69 | procedure UpdateInvoiceGrid; 70 | procedure UpdateBalances; 71 | procedure NotificationFromProvider (const notifyClass: INotificationClass); 72 | procedure UpdateMainBalance; 73 | public 74 | property ViewModel: IInvoiceViewModelInterface read fViewModel write SetViewModel; 75 | property Provider: IProviderInterface read fProvider; 76 | end; 77 | 78 | implementation 79 | 80 | {$R *.fmx} 81 | 82 | uses 83 | Model.ProSu.InterfaceActions, Model.ProSu.Provider; 84 | 85 | { TSalesInvoiceForm } 86 | 87 | procedure TSalesInvoiceForm.ButtonAddItemClick(Sender: TObject); 88 | begin 89 | fViewModel.ValidateItem(PopupBoxItems.Text); 90 | fViewModel.ValidateQuantity(EditQuantity.Text); 91 | end; 92 | 93 | procedure TSalesInvoiceForm.ButtonCancelClick(Sender: TObject); 94 | begin 95 | self.Close; 96 | end; 97 | 98 | procedure TSalesInvoiceForm.ButtonPrintInvoiceClick(Sender: TObject); 99 | begin 100 | fViewModel.PrintInvoice; 101 | end; 102 | 103 | procedure TSalesInvoiceForm.CheckBoxDiscountChange(Sender: TObject); 104 | begin 105 | fViewModel.DiscountApplied:=CheckBoxDiscount.IsChecked; 106 | fInvoiceItemsText:=fViewModel.InvoiceItemsText; 107 | UpdateBalances; 108 | end; 109 | 110 | 111 | procedure TSalesInvoiceForm.MenuItemDeleteItemClick(Sender: TObject); 112 | begin 113 | if (StringGridItems.Selected>=0) and 114 | (StringGridItems.Selected<=StringGridItems.RowCount-1) then 115 | fViewModel.DeleteInvoiceItem(StringGridItems.Cells[4, StringGridItems.Selected]); 116 | end; 117 | 118 | procedure TSalesInvoiceForm.NotificationFromProvider( 119 | const notifyClass: INotificationClass); 120 | var 121 | tmpNotifClass: TNotificationClass; 122 | tmpErrorNotifClass: TErrorNotificationClass; 123 | begin 124 | if notifyClass is TNotificationClass then 125 | begin 126 | tmpNotifClass:=notifyClass as TNotificationClass; 127 | if actInvoiceItemsChanges in tmpNotifClass.Actions then 128 | UpdateInvoiceGrid; 129 | if actPrintingStart in tmpNotifClass.Actions then 130 | begin 131 | AniIndicatorProgress.Visible:=fViewModel.AniIndicatorProgressVisible; 132 | LabelPrinting.Visible:=fViewModel.LabelPrintingVisible; 133 | end; 134 | if actPrintingFinish in tmpNotifClass.Actions then 135 | begin 136 | ShowMessage('Invoice Printed'); 137 | AniIndicatorProgress.Visible:=fViewModel.AniIndicatorProgressVisible; 138 | LabelPrinting.Visible:=fViewModel.LabelPrintingVisible; 139 | UpdateMainBalance; 140 | self.Close; 141 | end; 142 | end; 143 | if notifyClass is TErrorNotificationClass then 144 | begin 145 | tmpErrorNotifClass:=notifyClass as TErrorNotificationClass; 146 | if errInvoiceItemEmpty in tmpErrorNotifClass.Actions then 147 | begin 148 | ShowMessage(tmpErrorNotifClass.ActionMessage); 149 | PopupBoxItems.SetFocus; 150 | Exit; 151 | end 152 | else 153 | if errInvoiceItemQuantityEmpty in tmpErrorNotifClass.Actions then 154 | begin 155 | ShowMessage(tmpErrorNotifClass.ActionMessage); 156 | EditQuantity.SetFocus; 157 | Exit; 158 | end 159 | else 160 | if (errInvoiceItemQuantityNonPositive in tmpErrorNotifClass.Actions) 161 | or (errInvoiceItemQuantityNotNumber in tmpErrorNotifClass.Actions) then 162 | begin 163 | ShowMessage(tmpErrorNotifClass.ActionMessage); 164 | EditQuantity.SelectAll; 165 | EditQuantity.SetFocus; 166 | Exit; 167 | end 168 | else 169 | begin 170 | fViewModel.AddInvoiceItem(PopupBoxItems.Text, EditQuantity.text.ToInteger); 171 | end; 172 | end; 173 | 174 | end; 175 | 176 | procedure TSalesInvoiceForm.PopupBoxCustomerChange(Sender: TObject); 177 | begin 178 | fViewModel.GetCustomerDetails(PopupBoxCustomer.Text,fCustomerDetailsText); 179 | fViewModel.DeleteAllInvoiceItems; 180 | PopupBoxItems.ItemIndex:=-1; 181 | UpdateCustomerDetails; 182 | end; 183 | 184 | procedure TSalesInvoiceForm.SetupGUI; 185 | var 186 | tmpCustomerList: TObjectList; 187 | tmpCustomer: TCustomer; 188 | tmpItemsList: TObjectList; 189 | tmpItem: TItem; 190 | begin 191 | LabelTitle.Text:=fViewModel.TitleText; 192 | PopupBoxCustomer.Clear; 193 | PopupBoxItems.Clear; 194 | StringGridItems.RowCount:=0; 195 | EditQuantity.Text:='1'; 196 | 197 | fViewModel.GetCustomerList(tmpCustomerList); 198 | if Assigned(tmpCustomerList) then 199 | begin 200 | for tmpCustomer in tmpCustomerList do 201 | if Assigned(tmpCustomer) then 202 | PopupBoxCustomer.Items.Add(tmpCustomer.Name); 203 | end; 204 | PopupBoxCustomer.ItemIndex:=-1; 205 | 206 | fViewModel.GetItems(tmpItemsList); 207 | if Assigned(tmpItemsList) then 208 | begin 209 | for tmpItem in tmpItemsList do 210 | if Assigned(tmpItem) then 211 | PopupBoxItems.Items.Add(tmpItem.Description); 212 | end; 213 | 214 | fViewModel.GetCustomerDetails('', fCustomerDetailsText); 215 | UpdateCustomerDetails; 216 | UpdateInvoiceGrid; 217 | UpdateGroups; 218 | end; 219 | 220 | procedure TSalesInvoiceForm.SetViewModel( 221 | const newViewModel: IInvoiceViewModelInterface); 222 | begin 223 | fViewModel:=newViewModel; 224 | if not Assigned(fViewModel) then 225 | raise Exception.Create('Sales Invoice View Model is required'); 226 | fSubscriber:=CreateProSuSubscriberClass; 227 | fSubscriber.SetUpdateSubscriberMethod(NotificationFromProvider); 228 | fViewModel.Provider.Subscribe(fSubscriber); 229 | UpdateLabels; 230 | SetupGUI; 231 | UpdateGroups; 232 | UpdatePrintingStatus; 233 | fInvoiceItemsText:=fViewModel.InvoiceItemsText; 234 | UpdateBalances; 235 | fProvider:=CreateProSuProviderClass; 236 | end; 237 | 238 | procedure TSalesInvoiceForm.UpdateBalances; 239 | begin 240 | LabelRunningBalance.Text:=fInvoiceItemsText.InvoiceRunningBalance; 241 | LabelDiscount.Text:=fInvoiceItemsText.InvoiceDiscountFigure; 242 | LabelInvoiceBalance.Text:=fInvoiceItemsText.InvoiceTotalBalance; 243 | LabelTotalBalance.Text:=fInvoiceItemsText.InvoiceTotalBalance; 244 | CheckBoxDiscount.IsChecked:=fViewModel.DiscountApplied; 245 | end; 246 | 247 | procedure TSalesInvoiceForm.UpdateCustomerDetails; 248 | begin 249 | LabelDiscountRateFigure.Text:=fCustomerDetailsText.DiscountRate; 250 | LabelTotalBalanceBig.Text:=fCustomerDetailsText.OutstandingBalance; 251 | 252 | UpdateInvoiceGrid; 253 | UpdateGroups; 254 | end; 255 | 256 | procedure TSalesInvoiceForm.UpdateGroups; 257 | begin 258 | GroupBoxInvoiceItems.Enabled:=fViewModel.GroupBoxInvoiceItemsEnabled; 259 | GroupBoxBalance.Enabled:=fViewModel.GroupBoxBalanceEnabled; 260 | ButtonPrintInvoice.Enabled:=fViewModel.ButtonPrintInvoiceEnabled; 261 | end; 262 | 263 | procedure TSalesInvoiceForm.UpdateInvoiceGrid; 264 | var 265 | i: Integer; 266 | begin 267 | StringGridItems.RowCount:=0; 268 | fInvoiceItemsText:=fViewModel.InvoiceItemsText; 269 | for i := 0 to Length(fInvoiceItemsText.DescriptionText)-1 do 270 | begin 271 | StringGridItems.RowCount:=StringGridItems.RowCount+1; 272 | StringGridItems.Cells[0,StringGridItems.RowCount-1]:=fInvoiceItemsText.DescriptionText[i]; 273 | StringGridItems.Cells[1, StringGridItems.RowCount-1]:=fInvoiceItemsText.QuantityText[i]; 274 | StringGridItems.Cells[2, StringGridItems.RowCount-1]:=fInvoiceItemsText.UnitPriceText[i]; 275 | StringGridItems.Cells[3, StringGridItems.RowCount-1]:=fInvoiceItemsText.PriceText[i]; 276 | StringGridItems.Cells[4, StringGridItems.RowCount-1]:=fInvoiceItemsText.IDText[i]; 277 | end; 278 | UpdateBalances; 279 | UpdateGroups; 280 | end; 281 | 282 | procedure TSalesInvoiceForm.UpdateLabels; 283 | begin 284 | LabelTitle.Text:=fViewModel.LabelsText.Title; 285 | 286 | GroupBoxCustomerDetails.Text:=fViewModel.LabelsText.CustomerDetailsGroupText; 287 | LabelCustomer.Text:=fViewModel.LabelsText.CustomerText; 288 | LabelDiscountRate.Text:=fViewModel.LabelsText.CustomerDiscountRateText; 289 | LabelOutstandingBalance.Text:=fViewModel.LabelsText.CustomerOutstandingBalanceText; 290 | 291 | GroupBoxInvoiceItems.Text:=fViewModel.LabelsText.InvoiceItemsGroupText; 292 | LabelItem.Text:=fViewModel.LabelsText.InvoiceItemsText; 293 | LabelQuantity.Text:=fViewModel.LabelsText.InvoiceItemsQuantityText; 294 | ButtonAddItem.Text:=fViewModel.LabelsText.InvoiceItemsAddItemButtonText; 295 | StringColumn1.Header:=fViewModel.LabelsText.InvoiceItemsGridItemText; 296 | StringColumn2.Header:=fViewModel.LabelsText.InvoiceItemsGridQuantityText; 297 | StringColumn3.Header:=fViewModel.LabelsText.InvoiceItemsGridUnitPriceText; 298 | StringColumn4.Header:=fViewModel.LabelsText.InvoiceItemsGridAmountText; 299 | 300 | GroupBoxBalance.Text:=fViewModel.LabelsText.BalanceGroupText; 301 | LabelInvBalance.Text:=fViewModel.LabelsText.BalanceInvoiceBalanceText; 302 | CheckBoxDiscount.Text:=fViewModel.LabelsText.BalanceDiscountText; 303 | LabelTotal.Text:=fViewModel.LabelsText.BalanceTotalText; 304 | 305 | ButtonPrintInvoice.Text:=fViewModel.LabelsText.PrintInvoiceButtonText; 306 | LabelPrinting.Text:=fViewModel.LabelsText.PrintingText; 307 | ButtonCancel.Text:=fViewModel.LabelsText.CancelButtonText; 308 | 309 | end; 310 | 311 | procedure TSalesInvoiceForm.UpdateMainBalance; 312 | var 313 | tmpNotificationClass: TNotificationClass; 314 | begin 315 | tmpNotificationClass:=TNotificationClass.Create; 316 | tmpNotificationClass.Actions:=[actUpdateTotalSalesFigure]; 317 | if Assigned(fProvider) then 318 | fProvider.NotifySubscribers(tmpNotificationClass); 319 | tmpNotificationClass.Free; 320 | end; 321 | 322 | procedure TSalesInvoiceForm.UpdatePrintingStatus; 323 | begin 324 | AniIndicatorProgress.Visible:=fViewModel.AniIndicatorProgressVisible; 325 | LabelPrinting.Visible:=fViewModel.LabelPrintingVisible; 326 | end; 327 | 328 | end. 329 | -------------------------------------------------------------------------------- /Views/View.InvoiceForm.fmx: -------------------------------------------------------------------------------- 1 | object SalesInvoiceForm: TSalesInvoiceForm 2 | Left = 0 3 | Top = 0 4 | Caption = 'Sales Invoice' 5 | ClientHeight = 806 6 | ClientWidth = 470 7 | FormFactor.Width = 320 8 | FormFactor.Height = 480 9 | FormFactor.Devices = [Desktop] 10 | DesignerMasterStyle = 0 11 | object GroupBoxCustomerDetails: TGroupBox 12 | Align = Top 13 | Locked = True 14 | Margins.Left = 20.000000000000000000 15 | Margins.Top = 20.000000000000000000 16 | Margins.Right = 20.000000000000000000 17 | Position.X = 20.000000000000000000 18 | Position.Y = 90.000000000000000000 19 | Size.Width = 430.000000000000000000 20 | Size.Height = 128.000000000000000000 21 | Size.PlatformDefault = False 22 | Text = 'dummy_Customer_Details' 23 | TabOrder = 1 24 | object LabelCustomer: TLabel 25 | StyledSettings = [Family, Style, FontColor] 26 | Position.X = 24.000000000000000000 27 | Position.Y = 24.000000000000000000 28 | Size.Width = 137.000000000000000000 29 | Size.Height = 25.000000000000000000 30 | Size.PlatformDefault = False 31 | TextSettings.Font.Size = 14.000000000000000000 32 | Text = 'dummy_Customer' 33 | end 34 | object PopupBoxCustomer: TPopupBox 35 | Position.X = 168.000000000000000000 36 | Position.Y = 24.000000000000000000 37 | Size.Width = 225.000000000000000000 38 | Size.Height = 22.000000000000000000 39 | Size.PlatformDefault = False 40 | TabOrder = 1 41 | OnChange = PopupBoxCustomerChange 42 | end 43 | object LabelDiscountRate: TLabel 44 | StyledSettings = [Family, Style, FontColor] 45 | Position.X = 24.000000000000000000 46 | Position.Y = 56.000000000000000000 47 | Size.Width = 137.000000000000000000 48 | Size.Height = 25.000000000000000000 49 | Size.PlatformDefault = False 50 | TextSettings.Font.Size = 14.000000000000000000 51 | Text = 'dummy_Discount_Rate' 52 | end 53 | object LabelDiscountRateFigure: TLabel 54 | StyledSettings = [Family, Style, FontColor] 55 | Position.X = 168.000000000000000000 56 | Position.Y = 56.000000000000000000 57 | Size.Width = 225.000000000000000000 58 | Size.Height = 25.000000000000000000 59 | Size.PlatformDefault = False 60 | TextSettings.Font.Size = 14.000000000000000000 61 | Text = 'dummy_Discount_Rate_Figure' 62 | end 63 | object LabelTotalBalanceBig: TLabel 64 | StyledSettings = [Family, Style, FontColor] 65 | Position.X = 168.000000000000000000 66 | Position.Y = 88.000000000000000000 67 | Size.Width = 225.000000000000000000 68 | Size.Height = 25.000000000000000000 69 | Size.PlatformDefault = False 70 | TextSettings.Font.Size = 14.000000000000000000 71 | Text = 'dummy_Outstanding_Balance_Figure' 72 | end 73 | object LabelOutstandingBalance: TLabel 74 | StyledSettings = [Family, Style, FontColor] 75 | Position.X = 24.000000000000000000 76 | Position.Y = 88.000000000000000000 77 | Size.Width = 137.000000000000000000 78 | Size.Height = 25.000000000000000000 79 | Size.PlatformDefault = False 80 | TextSettings.Font.Size = 14.000000000000000000 81 | Text = 'dummy_Outstanding_Balance' 82 | end 83 | end 84 | object LabelInvoiceBalance: TLabel 85 | Align = Horizontal 86 | StyledSettings = [Family, FontColor] 87 | Margins.Left = 20.000000000000000000 88 | Margins.Top = 10.000000000000000000 89 | Margins.Right = 20.000000000000000000 90 | Position.X = 20.000000000000000000 91 | Position.Y = 232.000000000000000000 92 | Size.Width = 430.000000000000000000 93 | Size.Height = 100.000000000000000000 94 | Size.PlatformDefault = False 95 | TextSettings.Font.Size = 96.000000000000000000 96 | TextSettings.Font.Style = [fsBold] 97 | TextSettings.HorzAlign = Trailing 98 | Text = 'dummy_Invoice_Balance_Figure_Big' 99 | end 100 | object GroupBoxInvoiceItems: TGroupBox 101 | Align = Horizontal 102 | Margins.Left = 20.000000000000000000 103 | Margins.Top = 10.000000000000000000 104 | Margins.Right = 20.000000000000000000 105 | Position.X = 20.000000000000000000 106 | Position.Y = 344.000000000000000000 107 | Size.Width = 430.000000000000000000 108 | Size.Height = 250.000000000000000000 109 | Size.PlatformDefault = False 110 | Text = 'dummy_Invoice_Items' 111 | TabOrder = 3 112 | object PopupBoxItems: TPopupBox 113 | Position.X = 112.000000000000000000 114 | Position.Y = 24.000000000000000000 115 | Size.Width = 281.000000000000000000 116 | Size.Height = 22.000000000000000000 117 | Size.PlatformDefault = False 118 | TabOrder = 0 119 | end 120 | object LabelItem: TLabel 121 | StyledSettings = [Family, Style, FontColor] 122 | Position.X = 24.000000000000000000 123 | Position.Y = 24.000000000000000000 124 | Size.Width = 81.000000000000000000 125 | Size.Height = 22.000000000000000000 126 | Size.PlatformDefault = False 127 | TextSettings.Font.Size = 14.000000000000000000 128 | Text = 'dummy_Item' 129 | end 130 | object LabelQuantity: TLabel 131 | StyledSettings = [Family, Style, FontColor] 132 | Position.X = 24.000000000000000000 133 | Position.Y = 56.000000000000000000 134 | Size.Width = 73.000000000000000000 135 | Size.Height = 22.000000000000000000 136 | Size.PlatformDefault = False 137 | TextSettings.Font.Size = 14.000000000000000000 138 | Text = 'dummy_Quantity' 139 | end 140 | object EditQuantity: TEdit 141 | Touch.InteractiveGestures = [LongTap, DoubleTap] 142 | TabOrder = 3 143 | Position.X = 112.000000000000000000 144 | Position.Y = 56.000000000000000000 145 | Size.Width = 49.000000000000000000 146 | Size.Height = 22.000000000000000000 147 | Size.PlatformDefault = False 148 | end 149 | object ButtonAddItem: TButton 150 | Position.X = 312.000000000000000000 151 | Position.Y = 56.000000000000000000 152 | TabOrder = 4 153 | Text = 'dummy_Add_Item' 154 | OnClick = ButtonAddItemClick 155 | end 156 | object StringGridItems: TStringGrid 157 | Align = Horizontal 158 | Margins.Left = 20.000000000000000000 159 | Margins.Right = 20.000000000000000000 160 | Margins.Bottom = 10.000000000000000000 161 | PopupMenu = PopupMenuItems 162 | Position.X = 20.000000000000000000 163 | Position.Y = 93.000000000000000000 164 | Size.Width = 390.000000000000000000 165 | Size.Height = 140.000000000000000000 166 | Size.PlatformDefault = False 167 | TabOrder = 5 168 | Options = [AlternatingRowBackground, ColumnResize, ColumnMove, ColLines, RowLines, RowSelect, Tabs, Header] 169 | RowCount = 100 170 | RowHeight = 21.000000000000000000 171 | Viewport.Width = 370.000000000000000000 172 | Viewport.Height = 115.000000000000000000 173 | object StringColumn1: TStringColumn 174 | Header = 'dummy_Item' 175 | Size.Width = 124.000000000000000000 176 | Size.Height = 126.000000000000000000 177 | Size.PlatformDefault = False 178 | TabOrder = 0 179 | end 180 | object StringColumn2: TStringColumn 181 | Header = 'dummy_Quantity' 182 | Position.X = 124.000000000000000000 183 | Size.Width = 60.000000000000000000 184 | Size.Height = 126.000000000000000000 185 | Size.PlatformDefault = False 186 | TabOrder = 1 187 | end 188 | object StringColumn3: TStringColumn 189 | Header = 'dummy_Unit_Price' 190 | Position.X = 184.000000000000000000 191 | Size.Width = 70.000000000000000000 192 | Size.Height = 126.000000000000000000 193 | Size.PlatformDefault = False 194 | TabOrder = 2 195 | end 196 | object StringColumn4: TStringColumn 197 | Header = 'dummy_Amount' 198 | Position.X = 254.000000000000000000 199 | Size.Width = 100.000000000000000000 200 | Size.Height = 126.000000000000000000 201 | Size.PlatformDefault = False 202 | TabOrder = 3 203 | end 204 | object StringColumn5: TStringColumn 205 | Position.X = 354.000000000000000000 206 | Size.Width = 10.000000000000000000 207 | Size.Height = 126.000000000000000000 208 | Size.PlatformDefault = False 209 | TabOrder = 4 210 | Visible = False 211 | end 212 | end 213 | end 214 | object GroupBoxBalance: TGroupBox 215 | Align = Horizontal 216 | Margins.Left = 20.000000000000000000 217 | Margins.Top = 10.000000000000000000 218 | Margins.Right = 20.000000000000000000 219 | Position.X = 20.000000000000000000 220 | Position.Y = 600.000000000000000000 221 | Size.Width = 430.000000000000000000 222 | Size.Height = 137.000000000000000000 223 | Size.PlatformDefault = False 224 | Text = 'dummy_Balance' 225 | TabOrder = 4 226 | object LabelRunningBalance: TLabel 227 | StyledSettings = [Family, Style, FontColor] 228 | Position.X = 160.000000000000000000 229 | Position.Y = 24.000000000000000000 230 | Size.Width = 225.000000000000000000 231 | Size.Height = 25.000000000000000000 232 | Size.PlatformDefault = False 233 | TextSettings.Font.Size = 14.000000000000000000 234 | TextSettings.HorzAlign = Trailing 235 | Text = 'dummy_Invoice_Balance_Figure' 236 | end 237 | object LabelInvBalance: TLabel 238 | StyledSettings = [Family, Style, FontColor] 239 | Position.X = 16.000000000000000000 240 | Position.Y = 24.000000000000000000 241 | Size.Width = 137.000000000000000000 242 | Size.Height = 25.000000000000000000 243 | Size.PlatformDefault = False 244 | TextSettings.Font.Size = 14.000000000000000000 245 | Text = 'dummy_Invoice_Balance_Text' 246 | end 247 | object CheckBoxDiscount: TCheckBox 248 | StyledSettings = [Family, Style, FontColor] 249 | Position.X = 16.000000000000000000 250 | Position.Y = 56.000000000000000000 251 | Size.Width = 129.000000000000000000 252 | Size.Height = 25.000000000000000000 253 | Size.PlatformDefault = False 254 | TabOrder = 2 255 | Text = 'dummy_Discount' 256 | TextSettings.Font.Size = 14.000000000000000000 257 | OnChange = CheckBoxDiscountChange 258 | end 259 | object LabelDiscount: TLabel 260 | StyledSettings = [Family, Style, FontColor] 261 | Position.X = 160.000000000000000000 262 | Position.Y = 56.000000000000000000 263 | Size.Width = 225.000000000000000000 264 | Size.Height = 25.000000000000000000 265 | Size.PlatformDefault = False 266 | TextSettings.Font.Size = 14.000000000000000000 267 | TextSettings.HorzAlign = Trailing 268 | Text = 'dummy_Discount_Figure' 269 | end 270 | object LineHorizontal: TLine 271 | LineType = Diagonal 272 | Position.X = 128.000000000000000000 273 | Position.Y = 88.000000000000000000 274 | Size.Width = 265.000000000000000000 275 | Size.Height = 1.000000000000000000 276 | Size.PlatformDefault = False 277 | end 278 | object LabelTotalBalance: TLabel 279 | StyledSettings = [Family, FontColor] 280 | Position.X = 184.000000000000000000 281 | Position.Y = 96.000000000000000000 282 | Size.Width = 201.000000000000000000 283 | Size.Height = 25.000000000000000000 284 | Size.PlatformDefault = False 285 | TextSettings.Font.Size = 14.000000000000000000 286 | TextSettings.Font.Style = [fsBold] 287 | TextSettings.HorzAlign = Trailing 288 | Text = 'dummy_Invoice_Balance_Figure_Small' 289 | end 290 | object LabelTotal: TLabel 291 | StyledSettings = [Family, FontColor] 292 | Position.X = 128.000000000000000000 293 | Position.Y = 96.000000000000000000 294 | Size.Width = 57.000000000000000000 295 | Size.Height = 25.000000000000000000 296 | Size.PlatformDefault = False 297 | TextSettings.Font.Size = 14.000000000000000000 298 | TextSettings.Font.Style = [fsBold] 299 | Text = 'dummy_Total' 300 | end 301 | end 302 | object ButtonCancel: TButton 303 | Position.X = 368.000000000000000000 304 | Position.Y = 744.000000000000000000 305 | TabOrder = 6 306 | Text = 'dummy_Cancel' 307 | OnClick = ButtonCancelClick 308 | end 309 | object ButtonPrintInvoice: TButton 310 | Position.X = 24.000000000000000000 311 | Position.Y = 744.000000000000000000 312 | Size.Width = 105.000000000000000000 313 | Size.Height = 22.000000000000000000 314 | Size.PlatformDefault = False 315 | TabOrder = 5 316 | Text = 'dummy_Print_Invoice' 317 | OnClick = ButtonPrintInvoiceClick 318 | end 319 | object AniIndicatorProgress: TAniIndicator 320 | Enabled = True 321 | Position.X = 24.000000000000000000 322 | Position.Y = 776.000000000000000000 323 | Size.Width = 24.000000000000000000 324 | Size.Height = 17.000000000000000000 325 | Size.PlatformDefault = False 326 | end 327 | object LabelPrinting: TLabel 328 | Position.X = 48.000000000000000000 329 | Position.Y = 776.000000000000000000 330 | Size.Width = 305.000000000000000000 331 | Size.Height = 17.000000000000000000 332 | Size.PlatformDefault = False 333 | Text = 'dummy_Printing_Invoice' 334 | end 335 | object LabelTitle: TLabel 336 | Align = Top 337 | StyledSettings = [Family, FontColor] 338 | Margins.Left = 20.000000000000000000 339 | Margins.Top = 20.000000000000000000 340 | Margins.Right = 20.000000000000000000 341 | Position.X = 20.000000000000000000 342 | Position.Y = 20.000000000000000000 343 | Size.Width = 430.000000000000000000 344 | Size.Height = 50.000000000000000000 345 | Size.PlatformDefault = False 346 | TextSettings.Font.Size = 24.000000000000000000 347 | TextSettings.Font.Style = [fsBold] 348 | TextSettings.HorzAlign = Center 349 | Text = 'dummy_Title' 350 | end 351 | object PopupMenuItems: TPopupMenu 352 | Left = 440 353 | Top = 576 354 | object MenuItemDeleteItem: TMenuItem 355 | Text = 'Delete Entry' 356 | OnClick = MenuItemDeleteItemClick 357 | end 358 | end 359 | end 360 | -------------------------------------------------------------------------------- /Win32/Debug/POSAppMVVMFinal.drc: -------------------------------------------------------------------------------- 1 | /* VER300 2 | Generated by the Embarcadero Delphi Pascal Compiler 3 | because -GD or --drc was supplied to the compiler. 4 | 5 | This file contains compiler-generated resources that 6 | were bound to the executable. 7 | If this file is empty, then no compiler-generated 8 | resources were bound to the produced executable. 9 | */ 10 | 11 | #define System_Win_ComConst_SVarNotObject 65136 12 | #define System_Win_ComConst_STooManyParams 65137 13 | #define System_Win_ComConst_SInvalidLicense 65138 14 | #define System_Win_ComConst_SNotLicensed 65139 15 | #define System_Win_ComConst_SCannotActivate 65140 16 | #define System_Win_ComConst_SNoWindowHandle 65141 17 | #define FMX_Consts_SControlClassIsNil 65152 18 | #define FMX_Consts_SPresentationProxyCreateError 65153 19 | #define FMX_Consts_SPresentationProxyClassIsNil 65154 20 | #define FMX_Consts_SPresentationProxyNameIsEmpty 65155 21 | #define FMX_Consts_SPresentationAlreadyRegistered 65156 22 | #define FMX_Consts_SDataModelKeyEmpty 65157 23 | #define System_RegularExpressionsConsts_SRegExMissingExpression 65158 24 | #define System_RegularExpressionsConsts_SRegExExpressionError 65159 25 | #define System_RegularExpressionsConsts_SRegExStudyError 65160 26 | #define System_RegularExpressionsConsts_SRegExMatchRequired 65161 27 | #define System_RegularExpressionsConsts_SRegExStringsRequired 65162 28 | #define System_RegularExpressionsConsts_SRegExInvalidIndexType 65163 29 | #define System_RegularExpressionsConsts_SRegExIndexOutOfBounds 65164 30 | #define System_RegularExpressionsConsts_SRegExInvalidGroupName 65165 31 | #define System_Win_ComConst_SOleError 65166 32 | #define System_Win_ComConst_SNoMethod 65167 33 | #define FMX_Consts_SInvalidSpan 65168 34 | #define FMX_Consts_SInvalidRowIndex 65169 35 | #define FMX_Consts_SInvalidColumnIndex 65170 36 | #define FMX_Consts_SInvalidControlItem 65171 37 | #define FMX_Consts_SCannotDeleteColumn 65172 38 | #define FMX_Consts_SCannotDeleteDefColumn 65173 39 | #define FMX_Consts_SCannotDeleteRow 65174 40 | #define FMX_Consts_SCellMember 65175 41 | #define FMX_Consts_SCellSizeType 65176 42 | #define FMX_Consts_SCellValue 65177 43 | #define FMX_Consts_SCellAutoSize 65178 44 | #define FMX_Consts_SCellPercentSize 65179 45 | #define FMX_Consts_SCellAbsoluteSize 65180 46 | #define FMX_Consts_SCellColumn 65181 47 | #define FMX_Consts_SCellRow 65182 48 | #define FMX_Consts_SWrongModelClassType 65183 49 | #define FMX_Consts_SRetrieveSurfaceContents 65184 50 | #define FMX_Consts_SInvalidCallingConditions 65185 51 | #define FMX_Consts_SCannotFindSuitablePixelFormat 65186 52 | #define FMX_Consts_SCannotFindSuitableShader 65187 53 | #define FMX_Consts_SCannotDetermineDirect3DLevel 65188 54 | #define FMX_Consts_SCannotCreateD2DFactory 65189 55 | #define FMX_Consts_SCannotCreateDWriteFactory 65190 56 | #define FMX_Consts_SCannotCreateWICImagingFactory 65191 57 | #define FMX_Consts_SCannotCreateRenderTarget 65192 58 | #define FMX_Consts_SCannotCreateD3DDevice 65193 59 | #define FMX_Consts_SCannotAcquireDXGIFactory 65194 60 | #define FMX_Consts_SCannotResizeBuffers 65195 61 | #define FMX_Consts_SCannotCreateTexture 65196 62 | #define FMX_Consts_SCannotCreateRenderTargetView 65197 63 | #define FMX_Consts_SCannotCreateSwapChain 65198 64 | #define FMX_Consts_SCannotAddFixedSize 65199 65 | #define FMX_Consts_SVTIFFImages 65200 66 | #define FMX_Consts_SVJPGImages 65201 67 | #define FMX_Consts_SVPNGImages 65202 68 | #define FMX_Consts_SVGIFImages 65203 69 | #define FMX_Consts_SWMPImages 65204 70 | #define FMX_Consts_StrEChangeFixed 65205 71 | #define FMX_Consts_StrEDupScale 65206 72 | #define FMX_Consts_StrOther 65207 73 | #define FMX_Consts_StrScale1 65208 74 | #define FMX_Consts_SBitmapIncorrectSize 65209 75 | #define FMX_Consts_SBitmapLoadingFailed 65210 76 | #define FMX_Consts_SBitmapLoadingFailedNamed 65211 77 | #define FMX_Consts_SBitmapSizeTooBig 65212 78 | #define FMX_Consts_SInvalidCanvasParameter 65213 79 | #define FMX_Consts_SThumbnailLoadingFailedNamed 65214 80 | #define FMX_Consts_SBitmapSavingFailed 65215 81 | #define FMX_Consts_SPassword 65216 82 | #define FMX_Consts_SDomain 65217 83 | #define FMX_Consts_SLogin 65218 84 | #define FMX_Consts_SAppDefault 65219 85 | #define FMX_Consts_SEditCopy 65220 86 | #define FMX_Consts_SEditCut 65221 87 | #define FMX_Consts_SEditPaste 65222 88 | #define FMX_Consts_SEditDelete 65223 89 | #define FMX_Consts_SEditSelectAll 65224 90 | #define FMX_Consts_SCannotCreateCircularDependence 65225 91 | #define FMX_Consts_SPrinterDPIChangeError 65226 92 | #define FMX_Consts_SPrinterSettingsReadError 65227 93 | #define FMX_Consts_SPrinterSettingsWriteError 65228 94 | #define FMX_Consts_SVAllFiles 65229 95 | #define FMX_Consts_SVBitmaps 65230 96 | #define FMX_Consts_SVIcons 65231 97 | #define FMX_Consts_SMsgDlgInformation 65232 98 | #define FMX_Consts_SMsgDlgConfirm 65233 99 | #define FMX_Consts_SMsgDlgYes 65234 100 | #define FMX_Consts_SMsgDlgNo 65235 101 | #define FMX_Consts_SMsgDlgOK 65236 102 | #define FMX_Consts_SMsgDlgCancel 65237 103 | #define FMX_Consts_SMsgDlgHelp 65238 104 | #define FMX_Consts_SMsgDlgAbort 65239 105 | #define FMX_Consts_SMsgDlgRetry 65240 106 | #define FMX_Consts_SMsgDlgIgnore 65241 107 | #define FMX_Consts_SMsgDlgAll 65242 108 | #define FMX_Consts_SMsgDlgNoToAll 65243 109 | #define FMX_Consts_SMsgDlgYesToAll 65244 110 | #define FMX_Consts_SMsgDlgClose 65245 111 | #define FMX_Consts_SWindowsVistaRequired 65246 112 | #define FMX_Consts_SUsername 65247 113 | #define FMX_Consts_SRemoveIStylusSyncPluginError 65248 114 | #define FMX_Consts_SStylusHandleError 65249 115 | #define FMX_Consts_SStylusEnableError 65250 116 | #define FMX_Consts_SEnableRecognizerError 65251 117 | #define FMX_Consts_SInitialGesturePointError 65252 118 | #define FMX_Consts_SSetStylusGestureError 65253 119 | #define FMX_Consts_StrESingleMainMenu 65254 120 | #define FMX_Consts_SMainMenuSupportsOnlyTMenuItems 65255 121 | #define FMX_Consts_SNoImplementation 65256 122 | #define FMX_Consts_SBitmapSizeNotEqual 65257 123 | #define FMX_Consts_SInvalidSceneUpdatingPairCall 65258 124 | #define FMX_Consts_SNoPlatformStyle 65259 125 | #define FMX_Consts_SInvalidPlatformStyle 65260 126 | #define FMX_Consts_SNoIDeviceBehaviorBehavior 65261 127 | #define FMX_Consts_SMsgDlgWarning 65262 128 | #define FMX_Consts_SMsgDlgError 65263 129 | #define FMX_Consts_SPromptArrayEmpty 65264 130 | #define FMX_Consts_SUnsupportedPlatformService 65265 131 | #define FMX_Consts_SServiceAlreadyRegistered 65266 132 | #define FMX_Consts_SUnsupportedOSVersion 65267 133 | #define FMX_Consts_SNotInstance 65268 134 | #define FMX_Consts_SFlasherNotRegistered 65269 135 | #define FMX_Consts_SUnsupportedInterface 65270 136 | #define FMX_Consts_SNullException 65271 137 | #define FMX_Consts_SErrorShortCut 65272 138 | #define FMX_Consts_SEUseHeirs 65273 139 | #define FMX_Consts_SUnavailableMenuId 65274 140 | #define FMX_Consts_SInvalidGestureID 65275 141 | #define FMX_Consts_SOutOfRange 65276 142 | #define FMX_Consts_SAddIStylusAsyncPluginError 65277 143 | #define FMX_Consts_SAddIStylusSyncPluginError 65278 144 | #define FMX_Consts_SRemoveIStylusAsyncPluginError 65279 145 | #define System_RTLConsts_sBeginInvokeDestroying 65280 146 | #define FMX_Consts_SInvalidPrinterOp 65281 147 | #define FMX_Consts_SInvalidPrinter 65282 148 | #define FMX_Consts_SPrinterIndexError 65283 149 | #define FMX_Consts_SDeviceOnPort 65284 150 | #define FMX_Consts_SNoDefaultPrinter 65285 151 | #define FMX_Consts_SNotPrinting 65286 152 | #define FMX_Consts_SPrinting 65287 153 | #define FMX_Consts_StrCannotFocus 65288 154 | #define FMX_Consts_SResultCanNotBeNil 65289 155 | #define FMX_Consts_SInvalidStyleForPlatform 65290 156 | #define FMX_Consts_SCannotLoadStyleFromStream 65291 157 | #define FMX_Consts_SCannotLoadStyleFromRes 65292 158 | #define FMX_Consts_SCannotLoadStyleFromFile 65293 159 | #define FMX_Consts_SInvalidPrinterClass 65294 160 | #define FMX_Consts_SPromptArrayTooShort 65295 161 | #define System_RTLConsts_SWindows8 65296 162 | #define System_RTLConsts_SWindows8Point1 65297 163 | #define System_RTLConsts_SWindows10 65298 164 | #define System_RTLConsts_sObserverUnsupported 65299 165 | #define System_RTLConsts_sObserverMultipleSingleCast 65300 166 | #define System_RTLConsts_sObserverNoInterface 65301 167 | #define System_RTLConsts_sObserverNoSinglecastFound 65302 168 | #define System_RTLConsts_sObserverNoMulticastFound 65303 169 | #define System_RTLConsts_sObserverNotAvailable 65304 170 | #define System_RTLConsts_SInvalidDateString 65305 171 | #define System_RTLConsts_SInvalidTimeString 65306 172 | #define System_RTLConsts_SInvalidOffsetString 65307 173 | #define System_RTLConsts_sCannotManuallyConstructDevice 65308 174 | #define System_RTLConsts_sAttributeExists 65309 175 | #define System_RTLConsts_sDeviceExists 65310 176 | #define System_RTLConsts_sMustWaitOnOneEvent 65311 177 | #define System_RTLConsts_SServiceNotFound 65312 178 | #define System_RTLConsts_SVersionStr 65313 179 | #define System_RTLConsts_SSPVersionStr 65314 180 | #define System_RTLConsts_SVersion32 65315 181 | #define System_RTLConsts_SVersion64 65316 182 | #define System_RTLConsts_SWindows 65317 183 | #define System_RTLConsts_SWindowsVista 65318 184 | #define System_RTLConsts_SWindowsServer2008 65319 185 | #define System_RTLConsts_SWindows7 65320 186 | #define System_RTLConsts_SWindowsServer2008R2 65321 187 | #define System_RTLConsts_SWindows2000 65322 188 | #define System_RTLConsts_SWindowsXP 65323 189 | #define System_RTLConsts_SWindowsServer2003 65324 190 | #define System_RTLConsts_SWindowsServer2003R2 65325 191 | #define System_RTLConsts_SWindowsServer2012 65326 192 | #define System_RTLConsts_SWindowsServer2012R2 65327 193 | #define System_RTLConsts_sInvalidTimeoutValue 65328 194 | #define System_RTLConsts_sSpinCountOutOfRange 65329 195 | #define System_RTLConsts_sTimespanTooLong 65330 196 | #define System_RTLConsts_sInvalidTimespanDuration 65331 197 | #define System_RTLConsts_sTimespanValueCannotBeNan 65332 198 | #define System_RTLConsts_sCannotNegateTimespan 65333 199 | #define System_RTLConsts_sInvalidTimespanFormat 65334 200 | #define System_RTLConsts_sTimespanElementTooLong 65335 201 | #define System_RTLConsts_SArgumentOutOfRange 65336 202 | #define System_RTLConsts_SArgumentNil 65337 203 | #define System_RTLConsts_SGenericItemNotFound 65338 204 | #define System_RTLConsts_SGenericDuplicateItem 65339 205 | #define System_RTLConsts_SInsufficientRtti 65340 206 | #define System_RTLConsts_SParameterCountMismatch 65341 207 | #define System_RTLConsts_SNonPublicType 65342 208 | #define System_RTLConsts_SByRefArgMismatch 65343 209 | #define System_RTLConsts_SInputBufferExceed 65344 210 | #define System_RTLConsts_SInvalidCharsInPath 65345 211 | #define System_RTLConsts_SPathTooLong 65346 212 | #define System_RTLConsts_SPathNotFound 65347 213 | #define System_RTLConsts_SPathFormatNotSupported 65348 214 | #define System_RTLConsts_SFileNotFound 65349 215 | #define System_RTLConsts_SFileAlreadyExists 65350 216 | #define System_RTLConsts_SMissingDateTimeField 65351 217 | #define System_RTLConsts_sArgumentInvalid 65352 218 | #define System_RTLConsts_sArgumentOutOfRange_Index 65353 219 | #define System_RTLConsts_sArgumentOutOfRange_StringIndex 65354 220 | #define System_RTLConsts_sArgumentOutOfRange_InvalidUTF32 65355 221 | #define System_RTLConsts_sArgument_InvalidHighSurrogate 65356 222 | #define System_RTLConsts_sArgument_InvalidLowSurrogate 65357 223 | #define System_RTLConsts_sInvalidStringAndObjectArrays 65358 224 | #define System_RTLConsts_sNoConstruct 65359 225 | #define System_RTLConsts_SSeekNotImplemented 65360 226 | #define System_RTLConsts_SSortedListError 65361 227 | #define System_RTLConsts_SStringExpected 65362 228 | #define System_RTLConsts_SSymbolExpected 65363 229 | #define System_RTLConsts_SUnknownGroup 65364 230 | #define System_RTLConsts_SUnknownProperty 65365 231 | #define System_RTLConsts_SWriteError 65366 232 | #define System_RTLConsts_SThreadCreateError 65367 233 | #define System_RTLConsts_SThreadError 65368 234 | #define System_RTLConsts_SThreadExternalTerminate 65369 235 | #define System_RTLConsts_SThreadExternalWait 65370 236 | #define System_RTLConsts_SThreadStartError 65371 237 | #define System_RTLConsts_SThreadExternalCheckTerminated 65372 238 | #define System_RTLConsts_SThreadExternalSetReturnValue 65373 239 | #define System_RTLConsts_SParamIsNil 65374 240 | #define System_RTLConsts_SParamIsNegative 65375 241 | #define System_RTLConsts_SInvalidPropertyPath 65376 242 | #define System_RTLConsts_SInvalidPropertyValue 65377 243 | #define System_RTLConsts_SInvalidString 65378 244 | #define System_RTLConsts_SLineTooLong 65379 245 | #define System_RTLConsts_SListCapacityError 65380 246 | #define System_RTLConsts_SListCountError 65381 247 | #define System_RTLConsts_SListIndexError 65382 248 | #define System_RTLConsts_SMemoryStreamError 65383 249 | #define System_RTLConsts_SNoComSupport 65384 250 | #define System_RTLConsts_SNumberExpected 65385 251 | #define System_RTLConsts_SAnsiUTF8Expected 65386 252 | #define System_RTLConsts_SParseError 65387 253 | #define System_RTLConsts_SPropertyException 65388 254 | #define System_RTLConsts_SReadError 65389 255 | #define System_RTLConsts_SReadOnlyProperty 65390 256 | #define System_RTLConsts_SResNotFound 65391 257 | #define System_RTLConsts_SDuplicateItem 65392 258 | #define System_RTLConsts_SDuplicateName 65393 259 | #define System_RTLConsts_SDuplicateString 65394 260 | #define System_RTLConsts_SFCreateErrorEx 65395 261 | #define System_RTLConsts_SFOpenErrorEx 65396 262 | #define System_RTLConsts_SIdentifierExpected 65397 263 | #define System_RTLConsts_SIniFileWriteError 65398 264 | #define System_RTLConsts_StrNoClientClass 65399 265 | #define System_RTLConsts_StrEActionNoSuported 65400 266 | #define System_RTLConsts_SInvalidBinary 65401 267 | #define System_RTLConsts_SInvalidFileName 65402 268 | #define System_RTLConsts_SInvalidImage 65403 269 | #define System_RTLConsts_SInvalidMask 65404 270 | #define System_RTLConsts_SInvalidName 65405 271 | #define System_RTLConsts_SInvalidProperty 65406 272 | #define System_RTLConsts_SInvalidPropertyElement 65407 273 | #define System_SysConst_SInvalidDestinationArray 65408 274 | #define System_SysConst_SCharIndexOutOfBounds 65409 275 | #define System_SysConst_SByteIndexOutOfBounds 65410 276 | #define System_SysConst_SInvalidCharCount 65411 277 | #define System_SysConst_SInvalidDestinationIndex 65412 278 | #define System_SysConst_SInvalidCodePage 65413 279 | #define System_SysConst_SInvalidEncodingName 65414 280 | #define System_SysConst_SNoMappingForUnicodeCharacter 65415 281 | #define System_RTLConsts_SAncestorNotFound 65416 282 | #define System_RTLConsts_SAssignError 65417 283 | #define System_RTLConsts_SBitsIndexError 65418 284 | #define System_RTLConsts_SCantWriteResourceStreamError 65419 285 | #define System_RTLConsts_SCharExpected 65420 286 | #define System_RTLConsts_SCheckSynchronizeError 65421 287 | #define System_RTLConsts_SClassNotFound 65422 288 | #define System_RTLConsts_SDuplicateClass 65423 289 | #define System_SysConst_SShortDayNameSun 65424 290 | #define System_SysConst_SShortDayNameMon 65425 291 | #define System_SysConst_SShortDayNameTue 65426 292 | #define System_SysConst_SShortDayNameWed 65427 293 | #define System_SysConst_SShortDayNameThu 65428 294 | #define System_SysConst_SShortDayNameFri 65429 295 | #define System_SysConst_SShortDayNameSat 65430 296 | #define System_SysConst_SLongDayNameSun 65431 297 | #define System_SysConst_SLongDayNameMon 65432 298 | #define System_SysConst_SLongDayNameTue 65433 299 | #define System_SysConst_SLongDayNameWed 65434 300 | #define System_SysConst_SLongDayNameThu 65435 301 | #define System_SysConst_SLongDayNameFri 65436 302 | #define System_SysConst_SLongDayNameSat 65437 303 | #define System_SysConst_SCannotCreateDir 65438 304 | #define System_SysConst_SInvalidSourceArray 65439 305 | #define System_SysConst_SShortMonthNameSep 65440 306 | #define System_SysConst_SShortMonthNameOct 65441 307 | #define System_SysConst_SShortMonthNameNov 65442 308 | #define System_SysConst_SShortMonthNameDec 65443 309 | #define System_SysConst_SLongMonthNameJan 65444 310 | #define System_SysConst_SLongMonthNameFeb 65445 311 | #define System_SysConst_SLongMonthNameMar 65446 312 | #define System_SysConst_SLongMonthNameApr 65447 313 | #define System_SysConst_SLongMonthNameMay 65448 314 | #define System_SysConst_SLongMonthNameJun 65449 315 | #define System_SysConst_SLongMonthNameJul 65450 316 | #define System_SysConst_SLongMonthNameAug 65451 317 | #define System_SysConst_SLongMonthNameSep 65452 318 | #define System_SysConst_SLongMonthNameOct 65453 319 | #define System_SysConst_SLongMonthNameNov 65454 320 | #define System_SysConst_SLongMonthNameDec 65455 321 | #define System_SysConst_SNoMonitorSupportException 65456 322 | #define System_SysConst_SNotImplemented 65457 323 | #define System_SysConst_SObjectDisposed 65458 324 | #define System_SysConst_SAssertError 65459 325 | #define System_SysConst_SAbstractError 65460 326 | #define System_SysConst_SModuleAccessViolation 65461 327 | #define System_SysConst_SOSError 65462 328 | #define System_SysConst_SUnkOSError 65463 329 | #define System_SysConst_SShortMonthNameJan 65464 330 | #define System_SysConst_SShortMonthNameFeb 65465 331 | #define System_SysConst_SShortMonthNameMar 65466 332 | #define System_SysConst_SShortMonthNameApr 65467 333 | #define System_SysConst_SShortMonthNameMay 65468 334 | #define System_SysConst_SShortMonthNameJun 65469 335 | #define System_SysConst_SShortMonthNameJul 65470 336 | #define System_SysConst_SShortMonthNameAug 65471 337 | #define System_SysConst_SVarTypeOutOfRangeWithPrefix 65472 338 | #define System_SysConst_SVarTypeAlreadyUsedWithPrefix 65473 339 | #define System_SysConst_SVarTypeNotUsableWithPrefix 65474 340 | #define System_SysConst_SVarTypeTooManyCustom 65475 341 | #define System_SysConst_SVarTypeCouldNotConvert 65476 342 | #define System_SysConst_SVarTypeConvertOverflow 65477 343 | #define System_SysConst_SVarOverflow 65478 344 | #define System_SysConst_SVarInvalid 65479 345 | #define System_SysConst_SVarBadType 65480 346 | #define System_SysConst_SVarNotImplemented 65481 347 | #define System_SysConst_SVarUnexpected 65482 348 | #define System_SysConst_SExternalException 65483 349 | #define System_SysConst_SAssertionFailed 65484 350 | #define System_SysConst_SIntfCastError 65485 351 | #define System_SysConst_SSafecallException 65486 352 | #define System_SysConst_SMonitorLockException 65487 353 | #define System_SysConst_SException 65488 354 | #define System_SysConst_SExceptTitle 65489 355 | #define System_SysConst_SInvalidFormat 65490 356 | #define System_SysConst_SArgumentMissing 65491 357 | #define System_SysConst_SDispatchError 65492 358 | #define System_SysConst_SReadAccess 65493 359 | #define System_SysConst_SWriteAccess 65494 360 | #define System_SysConst_SExecuteAccess 65495 361 | #define System_SysConst_SInvalidAccess 65496 362 | #define System_SysConst_SVarArrayCreate 65497 363 | #define System_SysConst_SVarArrayBounds 65498 364 | #define System_SysConst_SVarArrayLocked 65499 365 | #define System_SysConst_SInvalidVarCast 65500 366 | #define System_SysConst_SInvalidVarOp 65501 367 | #define System_SysConst_SInvalidVarNullOp 65502 368 | #define System_SysConst_SInvalidVarOpWithHResultWithPrefix 65503 369 | #define System_SysConst_SInvalidInput 65504 370 | #define System_SysConst_SDivByZero 65505 371 | #define System_SysConst_SRangeError 65506 372 | #define System_SysConst_SIntOverflow 65507 373 | #define System_SysConst_SInvalidOp 65508 374 | #define System_SysConst_SZeroDivide 65509 375 | #define System_SysConst_SOverflow 65510 376 | #define System_SysConst_SUnderflow 65511 377 | #define System_SysConst_SInvalidPointer 65512 378 | #define System_SysConst_SInvalidCast 65513 379 | #define System_SysConst_SAccessViolationArg3 65514 380 | #define System_SysConst_SAccessViolationNoArg 65515 381 | #define System_SysConst_SStackOverflow 65516 382 | #define System_SysConst_SControlC 65517 383 | #define System_SysConst_SPrivilege 65518 384 | #define System_SysConst_SOperationAborted 65519 385 | #define System_SysConst_SUnknown 65520 386 | #define System_SysConst_SInvalidInteger 65521 387 | #define System_SysConst_SInvalidFloat 65522 388 | #define System_SysConst_SInvalidDate 65523 389 | #define System_SysConst_SInvalidTime 65524 390 | #define System_SysConst_SInvalidDateTime 65525 391 | #define System_SysConst_SInvalidTimeStamp 65526 392 | #define System_SysConst_SInvalidGUID 65527 393 | #define System_SysConst_STimeEncodeError 65528 394 | #define System_SysConst_SDateEncodeError 65529 395 | #define System_SysConst_SOutOfMemory 65530 396 | #define System_SysConst_SInOutError 65531 397 | #define System_SysConst_STooManyOpenFiles 65532 398 | #define System_SysConst_SAccessDenied 65533 399 | #define System_SysConst_SEndOfFile 65534 400 | #define System_SysConst_SDiskFull 65535 401 | STRINGTABLE 402 | BEGIN 403 | System_Win_ComConst_SVarNotObject, L"Variant does not reference an automation object" 404 | System_Win_ComConst_STooManyParams, L"Dispatch methods do not support more than 64 parameters" 405 | System_Win_ComConst_SInvalidLicense, L"License information for %s is invalid" 406 | System_Win_ComConst_SNotLicensed, L"License information for %s not found. You cannot use this control in design mode" 407 | System_Win_ComConst_SCannotActivate, L"OLE control activation failed" 408 | System_Win_ComConst_SNoWindowHandle, L"Could not obtain OLE control window handle" 409 | FMX_Consts_SControlClassIsNil, L"AControlClass cannot be nil. Factory cannot generate presentation name." 410 | FMX_Consts_SPresentationProxyCreateError, L"Cannot create presentation proxy with nil model or PresentedControl. Use overloaded version of constructor with parameters and pass correct values." 411 | FMX_Consts_SPresentationProxyClassIsNil, L"APresentationProxyClass is nil. Factory cannot register presentation with a nil presentation proxy class." 412 | FMX_Consts_SPresentationProxyNameIsEmpty, L"APresentationName is empty. Factory cannot register presentation with an empty presentation name" 413 | FMX_Consts_SPresentationAlreadyRegistered, L"Presentation Proxy class [%s] for this presentation name [%s] has already been registered." 414 | FMX_Consts_SDataModelKeyEmpty, L"Key cannot be empty. Data model cannot set or get data by key with an empty name." 415 | System_RegularExpressionsConsts_SRegExMissingExpression, L"A regular expression specified in RegEx is required" 416 | System_RegularExpressionsConsts_SRegExExpressionError, L"Error in regular expression at offset %d: %s" 417 | System_RegularExpressionsConsts_SRegExStudyError, L"Error studying the regex: %s" 418 | System_RegularExpressionsConsts_SRegExMatchRequired, L"Successful match required" 419 | System_RegularExpressionsConsts_SRegExStringsRequired, L"Strings parameter cannot be nil" 420 | System_RegularExpressionsConsts_SRegExInvalidIndexType, L"Invalid index type" 421 | System_RegularExpressionsConsts_SRegExIndexOutOfBounds, L"Index out of bounds (%d)" 422 | System_RegularExpressionsConsts_SRegExInvalidGroupName, L"Invalid group name (%s)" 423 | System_Win_ComConst_SOleError, L"OLE error %.8x" 424 | System_Win_ComConst_SNoMethod, L"Method '%s' not supported by automation object" 425 | FMX_Consts_SInvalidSpan, L"'%d' is not a valid span" 426 | FMX_Consts_SInvalidRowIndex, L"Row index, %d, out of bounds" 427 | FMX_Consts_SInvalidColumnIndex, L"Column index, %d, out of bounds" 428 | FMX_Consts_SInvalidControlItem, L"ControlItem.Control cannot be set to owning GridPanel" 429 | FMX_Consts_SCannotDeleteColumn, L"Cannot delete a column that contains controls" 430 | FMX_Consts_SCannotDeleteDefColumn, L"You can't delete a column by default" 431 | FMX_Consts_SCannotDeleteRow, L"Cannot delete a row that contains controls" 432 | FMX_Consts_SCellMember, L"Member" 433 | FMX_Consts_SCellSizeType, L"Size Type" 434 | FMX_Consts_SCellValue, L"Value" 435 | FMX_Consts_SCellAutoSize, L"Auto" 436 | FMX_Consts_SCellPercentSize, L"Percent" 437 | FMX_Consts_SCellAbsoluteSize, L"Absolute" 438 | FMX_Consts_SCellColumn, L"Column%d" 439 | FMX_Consts_SCellRow, L"Row%d" 440 | FMX_Consts_SWrongModelClassType, L"Model is not valid class. Expected [%s], but received [%s]" 441 | FMX_Consts_SRetrieveSurfaceContents, L"Could not retrieve surface contents." 442 | FMX_Consts_SInvalidCallingConditions, L"Invalid calling conditions for '%s'." 443 | FMX_Consts_SCannotFindSuitablePixelFormat, L"Cannot find a suitable pixel format for '%s'." 444 | FMX_Consts_SCannotFindSuitableShader, L"Cannot find a suitable shader for '%s'." 445 | FMX_Consts_SCannotDetermineDirect3DLevel, L"Cannot determine Direct3D support level." 446 | FMX_Consts_SCannotCreateD2DFactory, L"Cannot create Direct2D Factory object for '%s'." 447 | FMX_Consts_SCannotCreateDWriteFactory, L"Cannot create DirectWrite Factory object for '%s'." 448 | FMX_Consts_SCannotCreateWICImagingFactory, L"Cannot create WIC Imaging Factory object for '%s'." 449 | FMX_Consts_SCannotCreateRenderTarget, L"Cannot create rendering target for '%s'." 450 | FMX_Consts_SCannotCreateD3DDevice, L"Cannot create Direct3D device for '%s'." 451 | FMX_Consts_SCannotAcquireDXGIFactory, L"Cannot acquire DXGI factory from Direct3D device for '%s'." 452 | FMX_Consts_SCannotResizeBuffers, L"Cannot resize buffers for '%s'." 453 | FMX_Consts_SCannotCreateTexture, L"Cannot create texture for '%s'." 454 | FMX_Consts_SCannotCreateRenderTargetView, L"Cannot create render target view for '%s'." 455 | FMX_Consts_SCannotCreateSwapChain, L"Cannot create a swap chain for '%s'." 456 | FMX_Consts_SCannotAddFixedSize, L"Cannot add columns or rows while expand style is fixed size" 457 | FMX_Consts_SVTIFFImages, L"TIFF Images" 458 | FMX_Consts_SVJPGImages, L"JPEG Images" 459 | FMX_Consts_SVPNGImages, L"PNG Images" 460 | FMX_Consts_SVGIFImages, L"GIF Images" 461 | FMX_Consts_SWMPImages, L"WMP Images" 462 | FMX_Consts_StrEChangeFixed, L"The \"%s\" cannot be modified (Fixed = True)" 463 | FMX_Consts_StrEDupScale, L"Duplicate scale value %s" 464 | FMX_Consts_StrOther, L"Other scale" 465 | FMX_Consts_StrScale1, L"Normal" 466 | FMX_Consts_SBitmapIncorrectSize, L"Incorrect size of bitmap parameter(s)." 467 | FMX_Consts_SBitmapLoadingFailed, L"Loading bitmap failed." 468 | FMX_Consts_SBitmapLoadingFailedNamed, L"Loading bitmap failed (%s)." 469 | FMX_Consts_SBitmapSizeTooBig, L"Bitmap size too big." 470 | FMX_Consts_SInvalidCanvasParameter, L"Invalid call of GetParameter." 471 | FMX_Consts_SThumbnailLoadingFailedNamed, L"Loading thumbnail failed (%s)." 472 | FMX_Consts_SBitmapSavingFailed, L"Saving bitmap failed." 473 | FMX_Consts_SPassword, L"&Password" 474 | FMX_Consts_SDomain, L"&Domain" 475 | FMX_Consts_SLogin, L"Login" 476 | FMX_Consts_SAppDefault, L"application" 477 | FMX_Consts_SEditCopy, L"Copy" 478 | FMX_Consts_SEditCut, L"Cut" 479 | FMX_Consts_SEditPaste, L"Paste" 480 | FMX_Consts_SEditDelete, L"Delete" 481 | FMX_Consts_SEditSelectAll, L"Select All" 482 | FMX_Consts_SCannotCreateCircularDependence, L"Cannot create a circular dependency between components" 483 | FMX_Consts_SPrinterDPIChangeError, L"Active printer DPI can't be changed while printing" 484 | FMX_Consts_SPrinterSettingsReadError, L"Error occured while reading printer settings: %s" 485 | FMX_Consts_SPrinterSettingsWriteError, L"Error occured while writing printer settings: %s" 486 | FMX_Consts_SVAllFiles, L"All Files" 487 | FMX_Consts_SVBitmaps, L"Bitmaps" 488 | FMX_Consts_SVIcons, L"Icons" 489 | FMX_Consts_SMsgDlgInformation, L"Information" 490 | FMX_Consts_SMsgDlgConfirm, L"Confirm" 491 | FMX_Consts_SMsgDlgYes, L"Yes" 492 | FMX_Consts_SMsgDlgNo, L"No" 493 | FMX_Consts_SMsgDlgOK, L"OK" 494 | FMX_Consts_SMsgDlgCancel, L"Cancel" 495 | FMX_Consts_SMsgDlgHelp, L"Help" 496 | FMX_Consts_SMsgDlgAbort, L"Abort" 497 | FMX_Consts_SMsgDlgRetry, L"Retry" 498 | FMX_Consts_SMsgDlgIgnore, L"Ignore" 499 | FMX_Consts_SMsgDlgAll, L"All" 500 | FMX_Consts_SMsgDlgNoToAll, L"No to All" 501 | FMX_Consts_SMsgDlgYesToAll, L"Yes to &All" 502 | FMX_Consts_SMsgDlgClose, L"Close" 503 | FMX_Consts_SWindowsVistaRequired, L"%s requires Windows Vista or later" 504 | FMX_Consts_SUsername, L"&Username" 505 | FMX_Consts_SRemoveIStylusSyncPluginError, L"Unable to remove IStylusSyncPlugin: %s" 506 | FMX_Consts_SStylusHandleError, L"Unable to get or set window handle: %s" 507 | FMX_Consts_SStylusEnableError, L"Unable to enable or disable IRealTimeStylus: %s" 508 | FMX_Consts_SEnableRecognizerError, L"Unable to enable or disable IGestureRecognizer: %s" 509 | FMX_Consts_SInitialGesturePointError, L"Unable to retrieve initial gesture point" 510 | FMX_Consts_SSetStylusGestureError, L"Unable to set stylus gestures: %s" 511 | FMX_Consts_StrESingleMainMenu, L"The main menu can be only a single instance" 512 | FMX_Consts_SMainMenuSupportsOnlyTMenuItems, L"A main menu only supports TMenuItem children" 513 | FMX_Consts_SNoImplementation, L"No %s implementation found" 514 | FMX_Consts_SBitmapSizeNotEqual, L"Bitmap size must be equal in copy operation" 515 | FMX_Consts_SInvalidSceneUpdatingPairCall, L"Invalid IScene.DisableUpdating/IScene.EnableUpdating call pair" 516 | FMX_Consts_SNoPlatformStyle, L"No platform styles found" 517 | FMX_Consts_SInvalidPlatformStyle, L"No platform style found for the current platform" 518 | FMX_Consts_SNoIDeviceBehaviorBehavior, L"Required IDeviceBehavior is not registered" 519 | FMX_Consts_SMsgDlgWarning, L"Warning" 520 | FMX_Consts_SMsgDlgError, L"Error" 521 | FMX_Consts_SPromptArrayEmpty, L"Prompt array must not be empty" 522 | FMX_Consts_SUnsupportedPlatformService, L"Unsupported platform service: %s" 523 | FMX_Consts_SServiceAlreadyRegistered, L"Service %s already registered" 524 | FMX_Consts_SUnsupportedOSVersion, L"Unsupported OS version: %s" 525 | FMX_Consts_SNotInstance, L"Instance of \"%s\" not created" 526 | FMX_Consts_SFlasherNotRegistered, L"Class of flashing control, is not registered" 527 | FMX_Consts_SUnsupportedInterface, L"Class %0:s does not support interface %1:s" 528 | FMX_Consts_SNullException, L"Handled null exception" 529 | FMX_Consts_SErrorShortCut, L"An unknown combination of keys %s" 530 | FMX_Consts_SEUseHeirs, L"You can use only the inheritors of class \"%s\"" 531 | FMX_Consts_SUnavailableMenuId, L"Cannot create menu ID. All IDs have already been assigned" 532 | FMX_Consts_SInvalidGestureID, L"Invalid gesture ID (%d)" 533 | FMX_Consts_SOutOfRange, L"Value must be between %d and %d" 534 | FMX_Consts_SAddIStylusAsyncPluginError, L"Unable to add IStylusAsyncPlugin: %s" 535 | FMX_Consts_SAddIStylusSyncPluginError, L"Unable to add IStylusSyncPlugin: %s" 536 | FMX_Consts_SRemoveIStylusAsyncPluginError, L"Unable to remove IStylusAsyncPlugin: %s" 537 | System_RTLConsts_sBeginInvokeDestroying, L"Cannot call BeginInvoke on a TComponent in the process of destruction" 538 | FMX_Consts_SInvalidPrinterOp, L"Operation not supported on selected printer" 539 | FMX_Consts_SInvalidPrinter, L"Printer selected is not valid" 540 | FMX_Consts_SPrinterIndexError, L"Printer index out of range" 541 | FMX_Consts_SDeviceOnPort, L"%s on %s" 542 | FMX_Consts_SNoDefaultPrinter, L"There is no default printer currently selected" 543 | FMX_Consts_SNotPrinting, L"Printer is not currently printing" 544 | FMX_Consts_SPrinting, L"Printing in progress" 545 | FMX_Consts_StrCannotFocus, L"Cannot focus this control" 546 | FMX_Consts_SResultCanNotBeNil, L"The function '%s' must not return nil value" 547 | FMX_Consts_SInvalidStyleForPlatform, L"The style you have chosen is not available for your currently selected target platform. You can select a custom style or remove the stylebook to allow FireMonkey to automatically load the native style at run time" 548 | FMX_Consts_SCannotLoadStyleFromStream, L"Can't load style from stream" 549 | FMX_Consts_SCannotLoadStyleFromRes, L"Can't load style from resource" 550 | FMX_Consts_SCannotLoadStyleFromFile, L"Can't load style from file %s" 551 | FMX_Consts_SInvalidPrinterClass, L"Invalid printer class: %s" 552 | FMX_Consts_SPromptArrayTooShort, L"Length of value array must be >= length of prompt array" 553 | System_RTLConsts_SWindows8, L"Windows 8" 554 | System_RTLConsts_SWindows8Point1, L"Windows 8.1" 555 | System_RTLConsts_SWindows10, L"Windows 10" 556 | System_RTLConsts_sObserverUnsupported, L"Observer is not supported" 557 | System_RTLConsts_sObserverMultipleSingleCast, L"Cannot have multiple single cast observers added to the observers collection" 558 | System_RTLConsts_sObserverNoInterface, L"The object does not implement the observer interface" 559 | System_RTLConsts_sObserverNoSinglecastFound, L"No single cast observer with ID %d was added to the observer collection" 560 | System_RTLConsts_sObserverNoMulticastFound, L"No multi cast observer with ID %d was added to the observer collection" 561 | System_RTLConsts_sObserverNotAvailable, L"Observer is not available" 562 | System_RTLConsts_SInvalidDateString, L"Invalid date string: %s" 563 | System_RTLConsts_SInvalidTimeString, L"Invalid time string: %s" 564 | System_RTLConsts_SInvalidOffsetString, L"Invalid time Offset string: %s" 565 | System_RTLConsts_sCannotManuallyConstructDevice, L"Manual construction of TDeviceInfo is not supported" 566 | System_RTLConsts_sAttributeExists, L"Attribute '%s' already exists" 567 | System_RTLConsts_sDeviceExists, L"Device '%s' already exists" 568 | System_RTLConsts_sMustWaitOnOneEvent, L"Must wait on at least one event" 569 | System_RTLConsts_SServiceNotFound, L"Specified Login Credential Service not found" 570 | System_RTLConsts_SVersionStr, L"%s (Version %d.%d, Build %d, %5:s)" 571 | System_RTLConsts_SSPVersionStr, L"%s Service Pack %4:d (Version %1:d.%2:d, Build %3:d, %5:s)" 572 | System_RTLConsts_SVersion32, L"32-bit Edition" 573 | System_RTLConsts_SVersion64, L"64-bit Edition" 574 | System_RTLConsts_SWindows, L"Windows" 575 | System_RTLConsts_SWindowsVista, L"Windows Vista" 576 | System_RTLConsts_SWindowsServer2008, L"Windows Server 2008" 577 | System_RTLConsts_SWindows7, L"Windows 7" 578 | System_RTLConsts_SWindowsServer2008R2, L"Windows Server 2008 R2" 579 | System_RTLConsts_SWindows2000, L"Windows 2000" 580 | System_RTLConsts_SWindowsXP, L"Windows XP" 581 | System_RTLConsts_SWindowsServer2003, L"Windows Server 2003" 582 | System_RTLConsts_SWindowsServer2003R2, L"Windows Server 2003 R2" 583 | System_RTLConsts_SWindowsServer2012, L"Windows Server 2012" 584 | System_RTLConsts_SWindowsServer2012R2, L"Windows Server 2012 R2" 585 | System_RTLConsts_sInvalidTimeoutValue, L"Invalid Timeout value: %s" 586 | System_RTLConsts_sSpinCountOutOfRange, L"SpinCount out of range. Must be between 0 and %d" 587 | System_RTLConsts_sTimespanTooLong, L"Timespan too long" 588 | System_RTLConsts_sInvalidTimespanDuration, L"The duration cannot be returned because the absolute value exceeds the value of TTimeSpan.MaxValue" 589 | System_RTLConsts_sTimespanValueCannotBeNan, L"Value cannot be NaN" 590 | System_RTLConsts_sCannotNegateTimespan, L"Negating the minimum value of a Timespan is invalid" 591 | System_RTLConsts_sInvalidTimespanFormat, L"Invalid Timespan format" 592 | System_RTLConsts_sTimespanElementTooLong, L"Timespan element too long" 593 | System_RTLConsts_SArgumentOutOfRange, L"Argument out of range" 594 | System_RTLConsts_SArgumentNil, L"Argument must not be nil" 595 | System_RTLConsts_SGenericItemNotFound, L"Item not found" 596 | System_RTLConsts_SGenericDuplicateItem, L"Duplicates not allowed" 597 | System_RTLConsts_SInsufficientRtti, L"Insufficient RTTI available to support this operation" 598 | System_RTLConsts_SParameterCountMismatch, L"Parameter count mismatch" 599 | System_RTLConsts_SNonPublicType, L"Type '%s' is not declared in the interface section of a unit" 600 | System_RTLConsts_SByRefArgMismatch, L"VAR and OUT arguments must match parameter type exactly" 601 | System_RTLConsts_SInputBufferExceed, L"Input buffer exceeded for %s = %d, %s = %d" 602 | System_RTLConsts_SInvalidCharsInPath, L"Invalid characters in path" 603 | System_RTLConsts_SPathTooLong, L"The specified path is too long" 604 | System_RTLConsts_SPathNotFound, L"The specified path was not found" 605 | System_RTLConsts_SPathFormatNotSupported, L"The path format is not supported" 606 | System_RTLConsts_SFileNotFound, L"The specified file was not found" 607 | System_RTLConsts_SFileAlreadyExists, L"The specified file already exists" 608 | System_RTLConsts_SMissingDateTimeField, L"?" 609 | System_RTLConsts_sArgumentInvalid, L"Invalid argument" 610 | System_RTLConsts_sArgumentOutOfRange_Index, L"Index out of range (%d). Must be >= 0 and < %d" 611 | System_RTLConsts_sArgumentOutOfRange_StringIndex, L"String index out of range (%d). Must be >= %d and <= %d" 612 | System_RTLConsts_sArgumentOutOfRange_InvalidUTF32, L"Invalid UTF32 character value. Must be >= 0 and <= $10FFFF, excluding surrogate pair ranges" 613 | System_RTLConsts_sArgument_InvalidHighSurrogate, L"High surrogate char without a following low surrogate char at index: %d. Check that the string is encoded properly" 614 | System_RTLConsts_sArgument_InvalidLowSurrogate, L"Low surrogate char without a preceding high surrogate char at index: %d. Check that the string is encoded properly" 615 | System_RTLConsts_sInvalidStringAndObjectArrays, L"Length of Strings and Objects arrays must be equal" 616 | System_RTLConsts_sNoConstruct, L"Class %s is not intended to be constructed" 617 | System_RTLConsts_SSeekNotImplemented, L"%s.Seek not implemented" 618 | System_RTLConsts_SSortedListError, L"Operation not allowed on sorted list" 619 | System_RTLConsts_SStringExpected, L"String expected" 620 | System_RTLConsts_SSymbolExpected, L"%s expected" 621 | System_RTLConsts_SUnknownGroup, L"%s not in a class registration group" 622 | System_RTLConsts_SUnknownProperty, L"Property %s does not exist" 623 | System_RTLConsts_SWriteError, L"Stream write error" 624 | System_RTLConsts_SThreadCreateError, L"Thread creation error: %s" 625 | System_RTLConsts_SThreadError, L"Thread Error: %s (%d)" 626 | System_RTLConsts_SThreadExternalTerminate, L"Cannot terminate an externally created thread" 627 | System_RTLConsts_SThreadExternalWait, L"Cannot wait for an externally created thread" 628 | System_RTLConsts_SThreadStartError, L"Cannot call Start on a running or suspended thread" 629 | System_RTLConsts_SThreadExternalCheckTerminated, L"Cannot call CheckTerminated on an externally created thread" 630 | System_RTLConsts_SThreadExternalSetReturnValue, L"Cannot call SetReturnValue on an externally create thread" 631 | System_RTLConsts_SParamIsNil, L"Parameter %s cannot be nil" 632 | System_RTLConsts_SParamIsNegative, L"Parameter %s cannot be a negative value" 633 | System_RTLConsts_SInvalidPropertyPath, L"Invalid property path" 634 | System_RTLConsts_SInvalidPropertyValue, L"Invalid property value" 635 | System_RTLConsts_SInvalidString, L"Invalid string constant" 636 | System_RTLConsts_SLineTooLong, L"Line too long" 637 | System_RTLConsts_SListCapacityError, L"List capacity out of bounds (%d)" 638 | System_RTLConsts_SListCountError, L"List count out of bounds (%d)" 639 | System_RTLConsts_SListIndexError, L"List index out of bounds (%d)" 640 | System_RTLConsts_SMemoryStreamError, L"Out of memory while expanding memory stream" 641 | System_RTLConsts_SNoComSupport, L"%s has not been registered as a COM class" 642 | System_RTLConsts_SNumberExpected, L"Number expected" 643 | System_RTLConsts_SAnsiUTF8Expected, L"ANSI or UTF8 encoding expected" 644 | System_RTLConsts_SParseError, L"%s on line %d" 645 | System_RTLConsts_SPropertyException, L"Error reading %s%s%s: %s" 646 | System_RTLConsts_SReadError, L"Stream read error" 647 | System_RTLConsts_SReadOnlyProperty, L"Property is read-only" 648 | System_RTLConsts_SResNotFound, L"Resource %s not found" 649 | System_RTLConsts_SDuplicateItem, L"List does not allow duplicates ($0%x)" 650 | System_RTLConsts_SDuplicateName, L"A component named %s already exists" 651 | System_RTLConsts_SDuplicateString, L"String list does not allow duplicates" 652 | System_RTLConsts_SFCreateErrorEx, L"Cannot create file \"%s\". %s" 653 | System_RTLConsts_SFOpenErrorEx, L"Cannot open file \"%s\". %s" 654 | System_RTLConsts_SIdentifierExpected, L"Identifier expected" 655 | System_RTLConsts_SIniFileWriteError, L"Unable to write to %s" 656 | System_RTLConsts_StrNoClientClass, L"The client can not be an instance of class %s" 657 | System_RTLConsts_StrEActionNoSuported, L"Class %s does not support the action" 658 | System_RTLConsts_SInvalidBinary, L"Invalid binary value" 659 | System_RTLConsts_SInvalidFileName, L"Invalid file name - %s" 660 | System_RTLConsts_SInvalidImage, L"Invalid stream format" 661 | System_RTLConsts_SInvalidMask, L"'%s' is an invalid mask at (%d)" 662 | System_RTLConsts_SInvalidName, L"''%s'' is not a valid component name" 663 | System_RTLConsts_SInvalidProperty, L"Invalid property value" 664 | System_RTLConsts_SInvalidPropertyElement, L"Invalid property element: %s" 665 | System_SysConst_SInvalidDestinationArray, L"Invalid destination array" 666 | System_SysConst_SCharIndexOutOfBounds, L"Character index out of bounds (%d)" 667 | System_SysConst_SByteIndexOutOfBounds, L"Start index out of bounds (%d)" 668 | System_SysConst_SInvalidCharCount, L"Invalid count (%d)" 669 | System_SysConst_SInvalidDestinationIndex, L"Invalid destination index (%d)" 670 | System_SysConst_SInvalidCodePage, L"Invalid code page" 671 | System_SysConst_SInvalidEncodingName, L"Invalid encoding name" 672 | System_SysConst_SNoMappingForUnicodeCharacter, L"No mapping for the Unicode character exists in the target multi-byte code page" 673 | System_RTLConsts_SAncestorNotFound, L"Ancestor for '%s' not found" 674 | System_RTLConsts_SAssignError, L"Cannot assign a %s to a %s" 675 | System_RTLConsts_SBitsIndexError, L"Bits index out of range" 676 | System_RTLConsts_SCantWriteResourceStreamError, L"Can't write to a read-only resource stream" 677 | System_RTLConsts_SCharExpected, L"''%s'' expected" 678 | System_RTLConsts_SCheckSynchronizeError, L"CheckSynchronize called from thread $%x, which is NOT the main thread" 679 | System_RTLConsts_SClassNotFound, L"Class %s not found" 680 | System_RTLConsts_SDuplicateClass, L"A class named %s already exists" 681 | System_SysConst_SShortDayNameSun, L"Sun" 682 | System_SysConst_SShortDayNameMon, L"Mon" 683 | System_SysConst_SShortDayNameTue, L"Tue" 684 | System_SysConst_SShortDayNameWed, L"Wed" 685 | System_SysConst_SShortDayNameThu, L"Thu" 686 | System_SysConst_SShortDayNameFri, L"Fri" 687 | System_SysConst_SShortDayNameSat, L"Sat" 688 | System_SysConst_SLongDayNameSun, L"Sunday" 689 | System_SysConst_SLongDayNameMon, L"Monday" 690 | System_SysConst_SLongDayNameTue, L"Tuesday" 691 | System_SysConst_SLongDayNameWed, L"Wednesday" 692 | System_SysConst_SLongDayNameThu, L"Thursday" 693 | System_SysConst_SLongDayNameFri, L"Friday" 694 | System_SysConst_SLongDayNameSat, L"Saturday" 695 | System_SysConst_SCannotCreateDir, L"Unable to create directory" 696 | System_SysConst_SInvalidSourceArray, L"Invalid source array" 697 | System_SysConst_SShortMonthNameSep, L"Sep" 698 | System_SysConst_SShortMonthNameOct, L"Oct" 699 | System_SysConst_SShortMonthNameNov, L"Nov" 700 | System_SysConst_SShortMonthNameDec, L"Dec" 701 | System_SysConst_SLongMonthNameJan, L"January" 702 | System_SysConst_SLongMonthNameFeb, L"February" 703 | System_SysConst_SLongMonthNameMar, L"March" 704 | System_SysConst_SLongMonthNameApr, L"April" 705 | System_SysConst_SLongMonthNameMay, L"May" 706 | System_SysConst_SLongMonthNameJun, L"June" 707 | System_SysConst_SLongMonthNameJul, L"July" 708 | System_SysConst_SLongMonthNameAug, L"August" 709 | System_SysConst_SLongMonthNameSep, L"September" 710 | System_SysConst_SLongMonthNameOct, L"October" 711 | System_SysConst_SLongMonthNameNov, L"November" 712 | System_SysConst_SLongMonthNameDec, L"December" 713 | System_SysConst_SNoMonitorSupportException, L"Monitor support function not initialized" 714 | System_SysConst_SNotImplemented, L"Feature not implemented" 715 | System_SysConst_SObjectDisposed, L"Method called on disposed object" 716 | System_SysConst_SAssertError, L"%s (%s, line %d)" 717 | System_SysConst_SAbstractError, L"Abstract Error" 718 | System_SysConst_SModuleAccessViolation, L"Access violation at address %p in module '%s'. %s of address %p" 719 | System_SysConst_SOSError, L"System Error. Code: %d.\r\n%s%s" 720 | System_SysConst_SUnkOSError, L"A call to an OS function failed" 721 | System_SysConst_SShortMonthNameJan, L"Jan" 722 | System_SysConst_SShortMonthNameFeb, L"Feb" 723 | System_SysConst_SShortMonthNameMar, L"Mar" 724 | System_SysConst_SShortMonthNameApr, L"Apr" 725 | System_SysConst_SShortMonthNameMay, L"May" 726 | System_SysConst_SShortMonthNameJun, L"Jun" 727 | System_SysConst_SShortMonthNameJul, L"Jul" 728 | System_SysConst_SShortMonthNameAug, L"Aug" 729 | System_SysConst_SVarTypeOutOfRangeWithPrefix, L"Custom variant type (%s%.4x) is out of range" 730 | System_SysConst_SVarTypeAlreadyUsedWithPrefix, L"Custom variant type (%s%.4x) already used by %s" 731 | System_SysConst_SVarTypeNotUsableWithPrefix, L"Custom variant type (%s%.4x) is not usable" 732 | System_SysConst_SVarTypeTooManyCustom, L"Too many custom variant types have been registered" 733 | System_SysConst_SVarTypeCouldNotConvert, L"Could not convert variant of type (%s) into type (%s)" 734 | System_SysConst_SVarTypeConvertOverflow, L"Overflow while converting variant of type (%s) into type (%s)" 735 | System_SysConst_SVarOverflow, L"Variant overflow" 736 | System_SysConst_SVarInvalid, L"Invalid argument" 737 | System_SysConst_SVarBadType, L"Invalid variant type" 738 | System_SysConst_SVarNotImplemented, L"Operation not supported" 739 | System_SysConst_SVarUnexpected, L"Unexpected variant error" 740 | System_SysConst_SExternalException, L"External exception %x" 741 | System_SysConst_SAssertionFailed, L"Assertion failed" 742 | System_SysConst_SIntfCastError, L"Interface not supported" 743 | System_SysConst_SSafecallException, L"Exception in safecall method" 744 | System_SysConst_SMonitorLockException, L"Object lock not owned" 745 | System_SysConst_SException, L"Exception %s in module %s at %p.\r\n%s%s\r\n" 746 | System_SysConst_SExceptTitle, L"Application Error" 747 | System_SysConst_SInvalidFormat, L"Format '%s' invalid or incompatible with argument" 748 | System_SysConst_SArgumentMissing, L"No argument for format '%s'" 749 | System_SysConst_SDispatchError, L"Variant method calls not supported" 750 | System_SysConst_SReadAccess, L"Read" 751 | System_SysConst_SWriteAccess, L"Write" 752 | System_SysConst_SExecuteAccess, L"Execution" 753 | System_SysConst_SInvalidAccess, L"Invalid access" 754 | System_SysConst_SVarArrayCreate, L"Error creating variant or safe array" 755 | System_SysConst_SVarArrayBounds, L"Variant or safe array index out of bounds" 756 | System_SysConst_SVarArrayLocked, L"Variant or safe array is locked" 757 | System_SysConst_SInvalidVarCast, L"Invalid variant type conversion" 758 | System_SysConst_SInvalidVarOp, L"Invalid variant operation" 759 | System_SysConst_SInvalidVarNullOp, L"Invalid NULL variant operation" 760 | System_SysConst_SInvalidVarOpWithHResultWithPrefix, L"Invalid variant operation (%s%.8x)\n%s" 761 | System_SysConst_SInvalidInput, L"Invalid numeric input" 762 | System_SysConst_SDivByZero, L"Division by zero" 763 | System_SysConst_SRangeError, L"Range check error" 764 | System_SysConst_SIntOverflow, L"Integer overflow" 765 | System_SysConst_SInvalidOp, L"Invalid floating point operation" 766 | System_SysConst_SZeroDivide, L"Floating point division by zero" 767 | System_SysConst_SOverflow, L"Floating point overflow" 768 | System_SysConst_SUnderflow, L"Floating point underflow" 769 | System_SysConst_SInvalidPointer, L"Invalid pointer operation" 770 | System_SysConst_SInvalidCast, L"Invalid class typecast" 771 | System_SysConst_SAccessViolationArg3, L"Access violation at address %p. %s of address %p" 772 | System_SysConst_SAccessViolationNoArg, L"Access violation" 773 | System_SysConst_SStackOverflow, L"Stack overflow" 774 | System_SysConst_SControlC, L"Control-C hit" 775 | System_SysConst_SPrivilege, L"Privileged instruction" 776 | System_SysConst_SOperationAborted, L"Operation aborted" 777 | System_SysConst_SUnknown, L"" 778 | System_SysConst_SInvalidInteger, L"'%s' is not a valid integer value" 779 | System_SysConst_SInvalidFloat, L"'%s' is not a valid floating point value" 780 | System_SysConst_SInvalidDate, L"'%s' is not a valid date" 781 | System_SysConst_SInvalidTime, L"'%s' is not a valid time" 782 | System_SysConst_SInvalidDateTime, L"'%s' is not a valid date and time" 783 | System_SysConst_SInvalidTimeStamp, L"'%d.%d' is not a valid timestamp" 784 | System_SysConst_SInvalidGUID, L"'%s' is not a valid GUID value" 785 | System_SysConst_STimeEncodeError, L"Invalid argument to time encode" 786 | System_SysConst_SDateEncodeError, L"Invalid argument to date encode" 787 | System_SysConst_SOutOfMemory, L"Out of memory" 788 | System_SysConst_SInOutError, L"I/O error %d" 789 | System_SysConst_STooManyOpenFiles, L"Too many open files" 790 | System_SysConst_SAccessDenied, L"File access denied" 791 | System_SysConst_SEndOfFile, L"Read beyond end of file" 792 | System_SysConst_SDiskFull, L"Disk full" 793 | END 794 | 795 | /* c:\program files (x86)\embarcadero\studio\17.0\lib\Win32\release\FMX.Filter.res */ 796 | /* c:\program files (x86)\embarcadero\studio\17.0\lib\Win32\release\FMX.Controls.Win.res */ 797 | /* Z:\My Documents\Scripta\Books\MVVM In Delphi\Code\Final Code Files\Chapter 7\POSAppMVVMFinal\Views\View.InvoiceForm.fmx */ 798 | /* Z:\My Documents\Scripta\Books\MVVM In Delphi\Code\Final Code Files\Chapter 7\POSAppMVVMFinal\Views\View.MainForm.fmx */ 799 | /* Z:\My Documents\Scripta\Books\MVVM In Delphi\Code\Final Code Files\Chapter 7\POSAppMVVMFinal\POSAppMVVMFinal.res */ 800 | /* Z:\My Documents\Scripta\Books\MVVM In Delphi\Code\Final Code Files\Chapter 7\POSAppMVVMFinal\POSAppMVVMFinal.drf */ 801 | -------------------------------------------------------------------------------- /POSAppMVVMFinal.dproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | {A3F69FBF-2ED8-4499-9670-D64950176451} 4 | 18.0 5 | FMX 6 | POSAppMVVMFinal.dpr 7 | True 8 | Debug 9 | Win32 10 | 1119 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 | Base 44 | true 45 | 46 | 47 | true 48 | Base 49 | true 50 | 51 | 52 | true 53 | Base 54 | true 55 | 56 | 57 | true 58 | Cfg_1 59 | true 60 | true 61 | 62 | 63 | true 64 | Cfg_1 65 | true 66 | true 67 | 68 | 69 | true 70 | Base 71 | true 72 | 73 | 74 | true 75 | Cfg_2 76 | true 77 | true 78 | 79 | 80 | true 81 | Cfg_2 82 | true 83 | true 84 | 85 | 86 | $(BDS)\bin\delphi_PROJECTICON.ico 87 | true 88 | true 89 | POSAppMVVMFinal 90 | true 91 | true 92 | true 93 | true 94 | true 95 | true 96 | true 97 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) 98 | true 99 | $(BDS)\bin\delphi_PROJECTICNS.icns 100 | .\$(Platform)\$(Config) 101 | .\$(Platform)\$(Config) 102 | false 103 | false 104 | false 105 | false 106 | false 107 | 108 | 109 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png 110 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png 111 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png 112 | true 113 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;DataSnapFireDAC;tethering;bindcompfmx;FmxTeeUI;FireDACIBDriver;fmx;FireDACDBXDriver;dbexpress;IndyCore;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;ibmonitor;FMXTee;soaprtl;DbxCommonDriver;ibxpress;xmlrtl;soapmidas;DataSnapNativeClient;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;CustomIPTransport;bindcomp;LockBox3DR;IndyIPClient;dbxcds;aurelius;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;OnGuardFMXDR;$(DCC_UsePackage) 114 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png 115 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png 116 | android-support-v4.dex.jar;apk-expansion.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar 117 | Debug 118 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png 119 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png 120 | 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= 121 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png 122 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png 123 | 124 | 125 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_87x87.png 126 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1004.png 127 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png 128 | true 129 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_57x57.png 130 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png 131 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_320x480.png 132 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_50x50.png 133 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png 134 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png 135 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x748.png 136 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png 137 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;DataSnapFireDAC;tethering;bindcompfmx;FmxTeeUI;FireDACIBDriver;fmx;FireDACDBXDriver;dbexpress;IndyCore;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;ibmonitor;FMXTee;soaprtl;DbxCommonDriver;ibxpress;xmlrtl;soapmidas;DataSnapNativeClient;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;aurelius;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;OnGuardFMXDR;fmxase;$(DCC_UsePackage) 138 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_114x114.png 139 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1496.png 140 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png 141 | iPhoneAndiPad 142 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_640x1136.png 143 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_29x29.png 144 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_58x58.png 145 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_100x100.png 146 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2008.png 147 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png 148 | $(MSBuildProjectName) 149 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png 150 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_72x72.png 151 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png 152 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png 153 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_144x144.png 154 | Debug 155 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png 156 | $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_29x29.png 157 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png 158 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_640x960.png 159 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_750x1334.png 160 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_1242x2208.png 161 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png 162 | CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes= 163 | $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png 164 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2208x1242.png 165 | 166 | 167 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_87x87.png 168 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1004.png 169 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png 170 | true 171 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_57x57.png 172 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png 173 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_320x480.png 174 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_50x50.png 175 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png 176 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png 177 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x748.png 178 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png 179 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;DataSnapFireDAC;tethering;bindcompfmx;FmxTeeUI;FireDACIBDriver;fmx;FireDACDBXDriver;dbexpress;IndyCore;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;ibmonitor;FMXTee;paxcomp_x10;soaprtl;DbxCommonDriver;ibxpress;xmlrtl;soapmidas;DataSnapNativeClient;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;RFindUnit;CustomIPTransport;bindcomp;IndyIPClient;dbxcds;aurelius;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;OnGuardFMXDR;fmxase;$(DCC_UsePackage) 180 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_114x114.png 181 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1496.png 182 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png 183 | iPhoneAndiPad 184 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_640x1136.png 185 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_29x29.png 186 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_58x58.png 187 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_100x100.png 188 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2008.png 189 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png 190 | $(MSBuildProjectName) 191 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png 192 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_72x72.png 193 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png 194 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png 195 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_144x144.png 196 | Debug 197 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png 198 | $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_29x29.png 199 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png 200 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_640x960.png 201 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_750x1334.png 202 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_1242x2208.png 203 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png 204 | CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes= 205 | $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png 206 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2208x1242.png 207 | 208 | 209 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png 210 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_87x87.png 211 | true 212 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_57x57.png 213 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1004.png 214 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_50x50.png 215 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png 216 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png 217 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png 218 | iPhoneAndiPad 219 | DBXSqliteDriver;RESTComponents;DBXInterBaseDriver;emsclientfiredac;DataSnapFireDAC;tethering;bindcompfmx;FmxTeeUI;FireDACIBDriver;fmx;FireDACDBXDriver;dbexpress;IndyCore;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;soapserver;bindengine;CloudService;FireDACCommonDriver;DataSnapClient;inet;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;ibmonitor;FMXTee;soaprtl;DbxCommonDriver;ibxpress;xmlrtl;soapmidas;DataSnapNativeClient;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;CustomIPTransport;bindcomp;LockBox3DR;IndyIPClient;dbxcds;aurelius;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;OnGuardFMXDR;fmxase;$(DCC_UsePackage) 220 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x748.png 221 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_114x114.png 222 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1496.png 223 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png 224 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_640x1136.png 225 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png 226 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_29x29.png 227 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_58x58.png 228 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png 229 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_100x100.png 230 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png 231 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png 232 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2008.png 233 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_72x72.png 234 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png 235 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_144x144.png 236 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png 237 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_1242x2208.png 238 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_750x1334.png 239 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png 240 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_320x480.png 241 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_640x960.png 242 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png 243 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2208x1242.png 244 | CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes= 245 | $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_29x29.png 246 | $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png 247 | 248 | 249 | true 250 | DBXSqliteDriver;RESTComponents;DataSnapServerMidas;DBXInterBaseDriver;emsclientfiredac;DataSnapFireDAC;tethering;FireDACMSSQLDriver;bindcompfmx;DBXOracleDriver;inetdb;FmxTeeUI;FireDACIBDriver;fmx;fmxdae;FireDACDBXDriver;dbexpress;IndyCore;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;soapserver;bindengine;DBXMySQLDriver;FireDACOracleDriver;CloudService;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonDriver;DataSnapClient;inet;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;FireDAC;FireDACSqliteDriver;FireDACPgDriver;ibmonitor;FireDACASADriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;ibxpress;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;bindcomp;DBXInformixDriver;LockBox3DR;IndyIPClient;dbxcds;FireDACODBCDriver;DataSnapIndy10ServerTransport;aurelius;dsnapxml;DataSnapProviderClient;dbrtl;inetdbxpress;FireDACMongoDBDriver;IndyProtocols;OnGuardFMXDR;fmxase;$(DCC_UsePackage) 251 | Debug 252 | CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user 253 | 254 | 255 | 1033 256 | true 257 | DBXSqliteDriver;RESTComponents;DataSnapServerMidas;DBXDb2Driver;DBXInterBaseDriver;TMSFMXPackPkgDEDXE9;vclactnband;frxe23;vclFireDAC;emsclientfiredac;DataSnapFireDAC;svnui;tethering;FireDACADSDriver;TMSFMXPackPkgDXE9;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;Intraweb;DBXOracleDriver;inetdb;FmxTeeUI;FireDACIBDriver;fmx;fmxdae;vclib;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;frxTee23;vclie;bindengine;DBXMySQLDriver;FireDACOracleDriver;CloudService;FireDACMySQLDriver;DBXFirebirdDriver;FixInsight_10;FireDACCommonDriver;DataSnapClient;inet;DialogButtonsPackage;bindcompdbx;IndyIPCommon;vcl;DBXSybaseASEDriver;IndyIPServer;IndySystem;FireDACDb2Driver;neTabControlPackage;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;FireDACSqliteDriver;FireDACPgDriver;ibmonitor;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;paxcomp_x10;soaprtl;DbxCommonDriver;ibxpress;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;TMSFMXChartPkgDXE9;DBXSybaseASADriver;RFindUnit;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;LockBox3DR;IndyIPClient;EurekaLogCore;neTMSFMXLabelEditPackage;bindcompvcl;frxDB23;TeeUI;vclribbon;dbxcds;VclSmp;TMSFMXChartPkgDEDXE9;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;aurelius;dsnapxml;DataSnapProviderClient;dbrtl;inetdbxpress;FireDACMongoDBDriver;IndyProtocols;frx23;OnGuardFMXDR;Styled1Demo;fmxase;$(DCC_UsePackage) 258 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 259 | $(BDS)\bin\default_app.manifest 260 | CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= 261 | 262 | 263 | 1033 264 | true 265 | DBXSqliteDriver;RESTComponents;DataSnapServerMidas;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;emsclientfiredac;DataSnapFireDAC;tethering;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;Intraweb;DBXOracleDriver;inetdb;FmxTeeUI;FireDACIBDriver;fmx;fmxdae;vclib;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;DataSnapCommon;emsclient;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;FireDACOracleDriver;CloudService;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonDriver;DataSnapClient;inet;bindcompdbx;IndyIPCommon;vcl;DBXSybaseASEDriver;IndyIPServer;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;FireDACSqliteDriver;FireDACPgDriver;ibmonitor;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;ibxpress;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;LockBox3DR;IndyIPClient;bindcompvcl;TeeUI;vclribbon;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;aurelius;dsnapxml;DataSnapProviderClient;dbrtl;inetdbxpress;FireDACMongoDBDriver;IndyProtocols;OnGuardFMXDR;fmxase;$(DCC_UsePackage) 266 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) 267 | $(BDS)\bin\default_app.manifest 268 | CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= 269 | 270 | 271 | DEBUG;$(DCC_Define) 272 | true 273 | false 274 | true 275 | true 276 | true 277 | 278 | 279 | 3 280 | 1033 281 | true 282 | true 283 | true 284 | false 285 | 286 | 287 | true 288 | true 289 | 290 | 291 | false 292 | RELEASE;$(DCC_Define) 293 | 0 294 | 0 295 | 296 | 297 | true 298 | true 299 | 300 | 301 | true 302 | true 303 | 304 | 305 | 306 | MainSource 307 | 308 | 309 |
MainForm
310 | fmx 311 |
312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 |
SalesInvoiceForm
323 | fmx 324 |
325 | 326 | 327 | 328 | Cfg_2 329 | Base 330 | 331 | 332 | Base 333 | 334 | 335 | Cfg_1 336 | Base 337 | 338 |
339 | 340 | Delphi.Personality.12 341 | Application 342 | 343 | 344 | 345 | POSAppMVVMFinal.dpr 346 | 347 | 348 | Microsoft Office 2000 Sample Automation Server Wrapper Components 349 | Microsoft Office XP Sample Automation Server Wrapper Components 350 | 351 | 352 | 353 | 354 | 355 | true 356 | 357 | 358 | 359 | 360 | true 361 | 362 | 363 | 364 | 365 | true 366 | 367 | 368 | 369 | 370 | POSAppMVVMFinal.exe 371 | true 372 | 373 | 374 | 375 | 376 | 1 377 | 378 | 379 | 1 380 | 381 | 382 | 383 | 384 | Contents\Resources 385 | 1 386 | 387 | 388 | 389 | 390 | classes 391 | 1 392 | 393 | 394 | 395 | 396 | Contents\MacOS 397 | 0 398 | 399 | 400 | 1 401 | 402 | 403 | Contents\MacOS 404 | 1 405 | 406 | 407 | 408 | 409 | 1 410 | 411 | 412 | 1 413 | 414 | 415 | 1 416 | 417 | 418 | 419 | 420 | res\drawable-xxhdpi 421 | 1 422 | 423 | 424 | 425 | 426 | library\lib\mips 427 | 1 428 | 429 | 430 | 431 | 432 | 0 433 | 434 | 435 | 1 436 | 437 | 438 | Contents\MacOS 439 | 1 440 | 441 | 442 | 1 443 | 444 | 445 | library\lib\armeabi-v7a 446 | 1 447 | 448 | 449 | 1 450 | 451 | 452 | 453 | 454 | 0 455 | 456 | 457 | Contents\MacOS 458 | 1 459 | .framework 460 | 461 | 462 | 463 | 464 | 1 465 | 466 | 467 | 1 468 | 469 | 470 | 1 471 | 472 | 473 | 474 | 475 | 1 476 | 477 | 478 | 1 479 | 480 | 481 | 1 482 | 483 | 484 | 485 | 486 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 487 | 1 488 | 489 | 490 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 491 | 1 492 | 493 | 494 | 495 | 496 | library\lib\x86 497 | 1 498 | 499 | 500 | 501 | 502 | 1 503 | 504 | 505 | 1 506 | 507 | 508 | 1 509 | 510 | 511 | 512 | 513 | 1 514 | 515 | 516 | 1 517 | 518 | 519 | 1 520 | 521 | 522 | 523 | 524 | library\lib\armeabi 525 | 1 526 | 527 | 528 | 529 | 530 | 0 531 | 532 | 533 | 1 534 | 535 | 536 | Contents\MacOS 537 | 1 538 | 539 | 540 | 541 | 542 | 1 543 | 544 | 545 | 1 546 | 547 | 548 | 1 549 | 550 | 551 | 552 | 553 | res\drawable-normal 554 | 1 555 | 556 | 557 | 558 | 559 | res\drawable-xhdpi 560 | 1 561 | 562 | 563 | 564 | 565 | res\drawable-large 566 | 1 567 | 568 | 569 | 570 | 571 | 1 572 | 573 | 574 | 1 575 | 576 | 577 | 1 578 | 579 | 580 | 581 | 582 | ../ 583 | 1 584 | 585 | 586 | ../ 587 | 1 588 | 589 | 590 | 591 | 592 | res\drawable-hdpi 593 | 1 594 | 595 | 596 | 597 | 598 | library\lib\armeabi-v7a 599 | 1 600 | 601 | 602 | 603 | 604 | Contents 605 | 1 606 | 607 | 608 | 609 | 610 | ../ 611 | 1 612 | 613 | 614 | 615 | 616 | 1 617 | 618 | 619 | 1 620 | 621 | 622 | 1 623 | 624 | 625 | 626 | 627 | res\values 628 | 1 629 | 630 | 631 | 632 | 633 | res\drawable-small 634 | 1 635 | 636 | 637 | 638 | 639 | res\drawable 640 | 1 641 | 642 | 643 | 644 | 645 | 1 646 | 647 | 648 | 1 649 | 650 | 651 | 1 652 | 653 | 654 | 655 | 656 | 1 657 | 658 | 659 | 660 | 661 | res\drawable 662 | 1 663 | 664 | 665 | 666 | 667 | 0 668 | 669 | 670 | 0 671 | 672 | 673 | Contents\Resources\StartUp\ 674 | 0 675 | 676 | 677 | 0 678 | 679 | 680 | 0 681 | 682 | 683 | 0 684 | 685 | 686 | 687 | 688 | library\lib\armeabi-v7a 689 | 1 690 | 691 | 692 | 693 | 694 | 0 695 | .bpl 696 | 697 | 698 | 1 699 | .dylib 700 | 701 | 702 | Contents\MacOS 703 | 1 704 | .dylib 705 | 706 | 707 | 1 708 | .dylib 709 | 710 | 711 | 1 712 | .dylib 713 | 714 | 715 | 716 | 717 | res\drawable-mdpi 718 | 1 719 | 720 | 721 | 722 | 723 | res\drawable-xlarge 724 | 1 725 | 726 | 727 | 728 | 729 | res\drawable-ldpi 730 | 1 731 | 732 | 733 | 734 | 735 | 0 736 | .dll;.bpl 737 | 738 | 739 | 1 740 | .dylib 741 | 742 | 743 | Contents\MacOS 744 | 1 745 | .dylib 746 | 747 | 748 | 1 749 | .dylib 750 | 751 | 752 | 1 753 | .dylib 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 765 | True 766 | True 767 | True 768 | True 769 | True 770 | True 771 | True 772 | 773 | 774 | 12 775 | 776 | 777 | 778 | 779 |
780 | 781 | 795 | --------------------------------------------------------------------------------