diff --git a/applications/lazstats/source/LazStats.lpi b/applications/lazstats/source/LazStats.lpi index bc3275f9e..00d42de95 100644 --- a/applications/lazstats/source/LazStats.lpi +++ b/applications/lazstats/source/LazStats.lpi @@ -865,7 +865,7 @@ - + diff --git a/applications/lazstats/source/forms/analysis/financial/loanitunit.lfm b/applications/lazstats/source/forms/analysis/financial/loanitunit.lfm index 23deb0808..9f7175f37 100644 --- a/applications/lazstats/source/forms/analysis/financial/loanitunit.lfm +++ b/applications/lazstats/source/forms/analysis/financial/loanitunit.lfm @@ -1,431 +1,368 @@ -object LoanItFrm: TLoanItFrm +inherited LoanItForm: TLoanItForm Left = 310 - Height = 377 + Height = 406 Top = 131 - Width = 353 + Width = 723 HelpType = htKeyword HelpKeyword = 'html/LoanAmortizationSchedule.htm' - AutoSize = True - BorderStyle = bsDialog Caption = 'Loan Calculation and Amortization' - ClientHeight = 377 - ClientWidth = 353 - OnActivate = FormActivate - OnShow = FormShow - Position = poMainFormCenter - LCLVersion = '2.1.0.0' - object Label1: TLabel - AnchorSideTop.Control = AmountEdit - AnchorSideTop.Side = asrCenter - AnchorSideRight.Control = Label2 - AnchorSideRight.Side = asrBottom - Left = 103 - Height = 15 - Top = 123 - Width = 93 - Anchors = [akTop, akRight] - BorderSpacing.Left = 8 - Caption = 'Principal Amount' - ParentColor = False - end - object Label2: TLabel - AnchorSideLeft.Control = Owner - AnchorSideTop.Control = InterestEdit - AnchorSideTop.Side = asrCenter - Left = 24 - Height = 15 - Top = 162 - Width = 172 - BorderSpacing.Left = 24 - Caption = 'Annual Percentage Rate (APR %)' - ParentColor = False - end - object Label3: TLabel - AnchorSideTop.Control = YearsEdit - AnchorSideTop.Side = asrCenter - AnchorSideRight.Control = Label2 - AnchorSideRight.Side = asrBottom - Left = 59 - Height = 15 - Top = 189 - Width = 137 - Anchors = [akTop, akRight] - BorderSpacing.Left = 8 - Caption = 'Number of Years to Repay' - ParentColor = False - end - object Label4: TLabel - AnchorSideTop.Control = PayPerYrEdit - AnchorSideTop.Side = asrCenter - AnchorSideRight.Control = Label2 - AnchorSideRight.Side = asrBottom - Left = 38 - Height = 15 - Top = 216 - Width = 158 - Anchors = [akTop, akRight] - BorderSpacing.Left = 8 - Caption = 'Number of Payments Per Year' - ParentColor = False - end - object Label5: TLabel - AnchorSideTop.Control = RePayEdit - AnchorSideTop.Side = asrCenter - AnchorSideRight.Control = Label2 - AnchorSideRight.Side = asrBottom - Left = 149 - Height = 15 - Top = 259 - Width = 47 - Anchors = [akTop, akRight] - BorderSpacing.Left = 8 - Caption = 'Payment' - ParentColor = False - end - object Label6: TLabel - AnchorSideLeft.Control = Owner - AnchorSideTop.Control = NameEdit - AnchorSideTop.Side = asrCenter - Left = 24 - Height = 15 - Top = 12 - Width = 65 - BorderSpacing.Left = 24 - Caption = 'Your Name: ' - ParentColor = False - end - object AmountEdit: TEdit - AnchorSideLeft.Control = InterestEdit - AnchorSideTop.Control = Bevel2 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = NameEdit - AnchorSideRight.Side = asrBottom - Left = 204 - Height = 23 - Top = 119 - Width = 125 - Alignment = taRightJustify - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 16 - TabOrder = 3 - Text = 'AmountEdit' - end - object InterestEdit: TEdit - AnchorSideLeft.Control = Label2 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = AmountEdit - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = AmountEdit - AnchorSideRight.Side = asrBottom - Left = 204 - Height = 23 - Top = 158 - Width = 125 - Alignment = taRightJustify - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Left = 8 - BorderSpacing.Top = 16 - TabOrder = 4 - Text = 'InterestEdit' - end - object YearsEdit: TEdit - AnchorSideLeft.Control = InterestEdit - AnchorSideTop.Control = InterestEdit - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = InterestEdit - AnchorSideRight.Side = asrBottom - Left = 204 - Height = 23 - Top = 185 - Width = 125 - Alignment = taRightJustify - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 4 - TabOrder = 5 - Text = 'YearsEdit' - end - object PayPerYrEdit: TEdit - AnchorSideLeft.Control = InterestEdit - AnchorSideTop.Control = YearsEdit - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = InterestEdit - AnchorSideRight.Side = asrBottom - Left = 204 - Height = 23 - Top = 212 - Width = 125 - Alignment = taRightJustify - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 4 - TabOrder = 6 - Text = 'PayPerYrEdit' - end - object RePayEdit: TEdit - AnchorSideLeft.Control = InterestEdit - AnchorSideTop.Control = Bevel4 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = AmountEdit - AnchorSideRight.Side = asrBottom - Left = 204 - Height = 23 - Top = 255 - Width = 125 - Alignment = taRightJustify - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 8 - Font.Style = [fsBold] - ParentFont = False - ReadOnly = True - TabOrder = 7 - Text = 'RePayEdit' - end - object ResetBtn: TButton - AnchorSideTop.Control = Bevel1 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = AmortizeBtn - Left = 144 - Height = 25 - Top = 333 - Width = 54 - Anchors = [akTop, akRight] - AutoSize = True - BorderSpacing.Top = 8 - BorderSpacing.Right = 8 - BorderSpacing.Bottom = 8 - Caption = 'Reset' - OnClick = ResetBtnClick - TabOrder = 9 - end - object AmortizeBtn: TButton - AnchorSideTop.Control = Bevel1 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = CloseBtn - Left = 206 - Height = 25 - Top = 333 - Width = 76 - Anchors = [akTop, akRight] - AutoSize = True - BorderSpacing.Top = 8 - BorderSpacing.Right = 8 - BorderSpacing.Bottom = 8 - Caption = 'Compute' - OnClick = AmortizeBtnClick - TabOrder = 10 - end - object CloseBtn: TButton - AnchorSideTop.Control = Bevel1 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = Owner - AnchorSideRight.Side = asrBottom - Left = 290 - Height = 25 - Top = 333 - Width = 55 - Anchors = [akTop, akRight] - AutoSize = True - BorderSpacing.Top = 8 - BorderSpacing.Right = 8 - Caption = 'Close' - ModalResult = 11 - TabOrder = 11 - end - object NameEdit: TEdit - AnchorSideLeft.Control = Label6 - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = Owner - AnchorSideRight.Control = Owner - AnchorSideRight.Side = asrBottom - Left = 97 - Height = 23 - Top = 8 - Width = 232 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Left = 8 - BorderSpacing.Top = 8 - BorderSpacing.Right = 24 - TabOrder = 0 - Text = 'NameEdit' - end - object PrintChk: TCheckBox - AnchorSideLeft.Control = Owner - AnchorSideTop.Control = RePayEdit - AnchorSideTop.Side = asrBottom - Left = 24 - Height = 19 - Top = 290 - Width = 188 - BorderSpacing.Left = 24 - BorderSpacing.Top = 12 - Caption = 'Print the Amortization Schedule' - TabOrder = 8 - end - object Bevel1: TBevel - AnchorSideLeft.Control = Owner - AnchorSideTop.Control = PrintChk - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = Owner - AnchorSideRight.Side = asrBottom - Left = 0 - Height = 8 - Top = 317 - Width = 353 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 8 - Shape = bsBottomLine - end - object CalendarBtn: TButton - AnchorSideTop.Side = asrCenter - AnchorSideRight.Control = NameEdit - AnchorSideRight.Side = asrBottom - AnchorSideBottom.Control = Panel1 - AnchorSideBottom.Side = asrBottom - Left = 294 - Height = 25 - Top = 58 - Width = 35 - Anchors = [akRight, akBottom] - AutoSize = True - Caption = '...' - OnClick = CalendarBtnClick - TabOrder = 2 - end - object Panel1: TPanel - AnchorSideTop.Control = NameEdit - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = CalendarBtn - Left = 30 - Height = 40 - Top = 43 - Width = 260 - Anchors = [akTop, akRight] - AutoSize = True - BorderSpacing.Left = 24 - BorderSpacing.Top = 12 - BorderSpacing.Right = 4 - BevelOuter = bvNone - ChildSizing.HorizontalSpacing = 12 - ChildSizing.ControlsPerLine = 1 - ClientHeight = 40 - ClientWidth = 260 - TabOrder = 1 - object MonthLabel: TLabel - AnchorSideLeft.Control = Panel1 + ClientHeight = 406 + ClientWidth = 723 + inherited ParamsPanel: TPanel + Height = 390 + ClientHeight = 390 + inherited CloseBtn: TButton + Top = 365 + end + inherited ComputeBtn: TButton + Top = 365 + end + inherited ResetBtn: TButton + Top = 365 + end + inherited HelpBtn: TButton + Top = 365 + end + inherited ButtonBevel: TBevel + Top = 349 + end + object Label6: TLabel[5] + AnchorSideLeft.Control = ParamsPanel + AnchorSideTop.Control = NameEdit + AnchorSideTop.Side = asrCenter + Left = 24 + Height = 15 + Top = 4 + Width = 65 + BorderSpacing.Left = 24 + Caption = 'Your Name: ' + ParentColor = False + end + object NameEdit: TEdit[6] + AnchorSideLeft.Control = Label6 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = ParamsPanel + AnchorSideRight.Control = ParamsPanel + AnchorSideRight.Side = asrBottom + Left = 97 + Height = 23 + Top = 0 + Width = 194 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Left = 8 + TabOrder = 4 + Text = 'NameEdit' + end + object CalendarBtn: TButton[7] + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = NameEdit + AnchorSideRight.Side = asrBottom + AnchorSideBottom.Control = Panel1 + AnchorSideBottom.Side = asrBottom + Left = 256 + Height = 25 + Top = 50 + Width = 35 + Anchors = [akRight, akBottom] + AutoSize = True + Caption = '...' + OnClick = CalendarBtnClick + TabOrder = 5 + end + object Panel1: TPanel[8] + AnchorSideTop.Control = NameEdit + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = CalendarBtn + Left = -8 + Height = 40 + Top = 35 + Width = 260 + Anchors = [akTop, akRight] + AutoSize = True + BorderSpacing.Left = 24 + BorderSpacing.Top = 12 + BorderSpacing.Right = 4 + BevelOuter = bvNone + ChildSizing.HorizontalSpacing = 12 + ChildSizing.ControlsPerLine = 1 + ClientHeight = 40 + ClientWidth = 260 + TabOrder = 6 + object MonthLabel: TLabel + AnchorSideLeft.Control = Panel1 + AnchorSideTop.Control = Panel1 + AnchorSideRight.Side = asrBottom + Left = 0 + Height = 15 + Top = 0 + Width = 98 + Caption = 'Current Month No' + ParentColor = False + end + object DayLabel: TLabel + AnchorSideLeft.Control = MonthLabel + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = Panel1 + AnchorSideRight.Side = asrBottom + Left = 110 + Height = 15 + Top = 0 + Width = 73 + Caption = 'Day of Month' + ParentColor = False + end + object YearLabel: TLabel + AnchorSideLeft.Control = DayLabel + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = Panel1 + AnchorSideRight.Side = asrBottom + Left = 195 + Height = 15 + Top = 0 + Width = 65 + Caption = 'Current Year' + ParentColor = False + end + object MonthEdit: TEdit + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = MonthLabel + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = MonthLabel + AnchorSideRight.Side = asrBottom + Left = 38 + Height = 23 + Top = 17 + Width = 60 + Alignment = taRightJustify + Anchors = [akTop, akRight] + BorderSpacing.Top = 2 + TabOrder = 0 + Text = 'MonthEdit' + end + object DayEdit: TEdit + AnchorSideLeft.Control = DayLabel + AnchorSideLeft.Side = asrCenter + AnchorSideTop.Control = DayLabel + AnchorSideTop.Side = asrBottom + AnchorSideRight.Side = asrBottom + Left = 116 + Height = 23 + Top = 17 + Width = 60 + Alignment = taRightJustify + BorderSpacing.Top = 2 + TabOrder = 1 + Text = 'DayEdit' + end + object YearEdit: TEdit + AnchorSideLeft.Control = YearLabel + AnchorSideTop.Control = YearLabel + AnchorSideTop.Side = asrBottom + AnchorSideRight.Side = asrBottom + Left = 195 + Height = 23 + Top = 17 + Width = 60 + Alignment = taRightJustify + BorderSpacing.Top = 2 + TabOrder = 2 + Text = 'YearEdit' + end + end + object Bevel2: TBevel[9] + AnchorSideLeft.Control = ParamsPanel AnchorSideTop.Control = Panel1 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = ParamsPanel AnchorSideRight.Side = asrBottom Left = 0 - Height = 15 - Top = 0 - Width = 98 - Caption = 'Current Month No' - ParentColor = False + Height = 8 + Top = 87 + Width = 291 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 12 + Shape = bsBottomLine end - object DayLabel: TLabel - AnchorSideLeft.Control = MonthLabel - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = Panel1 + object Label1: TLabel[10] + AnchorSideTop.Control = AmountEdit + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = Label2 AnchorSideRight.Side = asrBottom - Left = 110 + Left = 103 Height = 15 - Top = 0 - Width = 73 - Caption = 'Day of Month' + Top = 115 + Width = 93 + Anchors = [akTop, akRight] + BorderSpacing.Left = 8 + Caption = 'Principal Amount' ParentColor = False end - object YearLabel: TLabel - AnchorSideLeft.Control = DayLabel - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = Panel1 + object Label2: TLabel[11] + AnchorSideLeft.Control = ParamsPanel + AnchorSideTop.Control = InterestEdit + AnchorSideTop.Side = asrCenter + Left = 24 + Height = 15 + Top = 154 + Width = 172 + BorderSpacing.Left = 24 + Caption = 'Annual Percentage Rate (APR %)' + ParentColor = False + end + object Label3: TLabel[12] + AnchorSideTop.Control = YearsEdit + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = Label2 AnchorSideRight.Side = asrBottom - Left = 195 + Left = 59 Height = 15 - Top = 0 - Width = 65 - Caption = 'Current Year' + Top = 181 + Width = 137 + Anchors = [akTop, akRight] + BorderSpacing.Left = 8 + Caption = 'Number of Years to Repay' ParentColor = False end - object MonthEdit: TEdit - AnchorSideLeft.Side = asrBottom - AnchorSideTop.Control = MonthLabel - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = MonthLabel + object Label4: TLabel[13] + AnchorSideTop.Control = PayPerYrEdit + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = Label2 AnchorSideRight.Side = asrBottom Left = 38 - Height = 23 - Top = 17 - Width = 60 - Alignment = taRightJustify + Height = 15 + Top = 208 + Width = 158 Anchors = [akTop, akRight] - BorderSpacing.Top = 2 - TabOrder = 0 - Text = 'MonthEdit' + BorderSpacing.Left = 8 + Caption = 'Number of Payments Per Year' + ParentColor = False end - object DayEdit: TEdit - AnchorSideLeft.Control = DayLabel - AnchorSideLeft.Side = asrCenter - AnchorSideTop.Control = DayLabel - AnchorSideTop.Side = asrBottom + object Label5: TLabel[14] + AnchorSideTop.Control = RePayEdit + AnchorSideTop.Side = asrCenter + AnchorSideRight.Control = Label2 AnchorSideRight.Side = asrBottom - Left = 116 - Height = 23 - Top = 17 - Width = 60 - Alignment = taRightJustify - BorderSpacing.Top = 2 - TabOrder = 1 - Text = 'DayEdit' + Left = 149 + Height = 15 + Top = 251 + Width = 47 + Anchors = [akTop, akRight] + BorderSpacing.Left = 8 + Caption = 'Payment' + ParentColor = False end - object YearEdit: TEdit - AnchorSideLeft.Control = YearLabel - AnchorSideTop.Control = YearLabel + object AmountEdit: TEdit[15] + AnchorSideLeft.Control = InterestEdit + AnchorSideTop.Control = Bevel2 AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = NameEdit AnchorSideRight.Side = asrBottom - Left = 195 + Left = 204 Height = 23 - Top = 17 - Width = 60 + Top = 111 + Width = 87 Alignment = taRightJustify - BorderSpacing.Top = 2 - TabOrder = 2 - Text = 'YearEdit' + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 16 + TabOrder = 7 + Text = 'AmountEdit' + end + object InterestEdit: TEdit[16] + AnchorSideLeft.Control = Label2 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = AmountEdit + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = AmountEdit + AnchorSideRight.Side = asrBottom + Left = 204 + Height = 23 + Top = 150 + Width = 87 + Alignment = taRightJustify + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Left = 8 + BorderSpacing.Top = 16 + TabOrder = 8 + Text = 'InterestEdit' + end + object YearsEdit: TEdit[17] + AnchorSideLeft.Control = InterestEdit + AnchorSideTop.Control = InterestEdit + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = InterestEdit + AnchorSideRight.Side = asrBottom + Left = 204 + Height = 23 + Top = 177 + Width = 87 + Alignment = taRightJustify + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 4 + TabOrder = 9 + Text = 'YearsEdit' + end + object PayPerYrEdit: TEdit[18] + AnchorSideLeft.Control = InterestEdit + AnchorSideTop.Control = YearsEdit + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = InterestEdit + AnchorSideRight.Side = asrBottom + Left = 204 + Height = 23 + Top = 204 + Width = 87 + Alignment = taRightJustify + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 4 + TabOrder = 10 + Text = 'PayPerYrEdit' + end + object RePayEdit: TEdit[19] + AnchorSideLeft.Control = InterestEdit + AnchorSideTop.Control = Bevel4 + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = AmountEdit + AnchorSideRight.Side = asrBottom + Left = 204 + Height = 23 + Top = 247 + Width = 87 + Alignment = taRightJustify + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 8 + Font.Style = [fsBold] + ParentFont = False + ReadOnly = True + TabOrder = 11 + Text = 'RePayEdit' + end + object Bevel4: TBevel[20] + AnchorSideLeft.Control = ParamsPanel + AnchorSideTop.Control = PayPerYrEdit + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = ParamsPanel + AnchorSideRight.Side = asrBottom + Left = 0 + Height = 8 + Top = 231 + Width = 291 + Anchors = [akTop, akLeft, akRight] + BorderSpacing.Top = 4 + Shape = bsBottomLine end end - object Bevel2: TBevel - AnchorSideLeft.Control = Owner - AnchorSideTop.Control = Panel1 - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = Owner - AnchorSideRight.Side = asrBottom - Left = 24 - Height = 8 - Top = 95 - Width = 305 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Left = 24 - BorderSpacing.Top = 12 - BorderSpacing.Right = 24 - Shape = bsBottomLine + inherited ParamsSplitter: TSplitter + Height = 406 end - object Bevel4: TBevel - AnchorSideLeft.Control = Label5 - AnchorSideTop.Control = PayPerYrEdit - AnchorSideTop.Side = asrBottom - AnchorSideRight.Control = Owner - AnchorSideRight.Side = asrBottom - Left = 149 - Height = 8 - Top = 239 - Width = 180 - Anchors = [akTop, akLeft, akRight] - BorderSpacing.Top = 4 - BorderSpacing.Right = 24 - Shape = bsBottomLine + inherited PageControl: TPageControl + Height = 390 + Width = 403 end - object CalendarDialog1: TCalendarDialog + object CalendarDialog1: TCalendarDialog[3] Date = 43890 OKCaption = '&OK' CancelCaption = 'Cancel' - Left = 40 - Top = 312 + Left = 56 + Top = 264 end end diff --git a/applications/lazstats/source/forms/analysis/financial/loanitunit.pas b/applications/lazstats/source/forms/analysis/financial/loanitunit.pas index 5818948d7..eea7796ee 100644 --- a/applications/lazstats/source/forms/analysis/financial/loanitunit.pas +++ b/applications/lazstats/source/forms/analysis/financial/loanitunit.pas @@ -5,21 +5,20 @@ unit LoanItUnit; interface uses - Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, - StdCtrls, ExtCtrls, ExtDlgs; + Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, + StdCtrls, ExtCtrls, ExtDlgs, ComCtrls, TACustomSeries, TAIntervalSources, + ChartFrameUnit, BasicStatsReportAndChartFormUnit; type - { TLoanItFrm } + { TLoanItForm } - TLoanItFrm = class(TForm) - Bevel1: TBevel; + TLoanItForm = class(TBasicStatsReportAndChartForm) Bevel2: TBevel; Bevel4: TBevel; CalendarBtn: TButton; CalendarDialog1: TCalendarDialog; Panel1: TPanel; - PrintChk: TCheckBox; DayEdit: TEdit; YearEdit: TEdit; MonthEdit: TEdit; @@ -28,9 +27,6 @@ type YearLabel: TLabel; NameEdit: TEdit; Label6: TLabel; - ResetBtn: TButton; - AmortizeBtn: TButton; - CloseBtn: TButton; AmountEdit: TEdit; InterestEdit: TEdit; YearsEdit: TEdit; @@ -41,131 +37,99 @@ type Label3: TLabel; Label4: TLabel; Label5: TLabel; - procedure AmortizeBtnClick(Sender: TObject); procedure CalendarBtnClick(Sender: TObject); - procedure FormActivate(Sender: TObject); - procedure FormShow(Sender: TObject); - procedure ResetBtnClick(Sender: TObject); private - { private declarations } - function Validate(out AMsg: String; out AControl: TWinControl): boolean; + FBalanceRemainSeries: TChartSeries; + FTotalInterestSeries: TChartSeries; + FTotalPaidSeries: TChartSeries; + + protected + procedure AdjustConstraints; override; + procedure Compute; override; + function Validate(out AMsg: String; out AControl: TWinControl): boolean; override; + public - { public declarations } + constructor Create(AOwner: TComponent); override; + procedure Reset; override; end; var - LoanItFrm: TLoanItFrm; + LoanItForm: TLoanItForm; implementation +{$R *.lfm} + uses - Math, DateUtils, OutputUnit; + Math, DateUtils, + TAChartUtils, TALegend, TASeries; -{ TLoanItFrm } +{ TLoanItForm } -procedure TLoanItFrm.ResetBtnClick(Sender: TObject); +constructor TLoanItForm.Create(AOwner: TComponent); begin - NameEdit.Text := ''; - MonthEdit.Text := ''; - DayEdit.Text := ''; - YearEdit.Text := ''; - YearsEdit.Text := ''; - AmountEdit.Text := ''; - InterestEdit.Text := ''; - PayPerYrEdit.Text := ''; - RepayEdit.Text := ''; -end; + inherited; -procedure TLoanItFrm.FormShow(Sender: TObject); -begin - ResetBtnClick(self); -end; - -procedure TLoanItFrm.AmortizeBtnClick(Sender: TObject); -var - no_per_year, year_payed, month_payed, day, month, j, k : integer; - fraction, interest, numerator, denominator, payment, total_interest : double; - amount, interest_payment, total_payed, pcnt_interest, years, no_years : double; - aname: string; - msg: String; - C: TWinControl; - lReport: TStrings; -begin - if not Validate(msg, C) then begin - C.SetFocus; - MessageDlg(msg, mtError, [mbOk], 0); - ModalResult := mrNone; - exit; + FBalanceRemainSeries := TLineSeries.Create(FChartFrame); + with TLineSeries(FBalanceRemainSeries) do + begin + LinePen.Color := DATA_COLORS[0]; + LinePen.Width := 2; + Title := 'Remaining balance'; end; + FChartFrame.Chart.AddSeries(FBalanceRemainSeries); - aname := NameEdit.Text; - no_per_year := StrToInt(PayPerYrEdit.Text); - day := StrToInt(DayEdit.Text); - month := StrToInt(MonthEdit.Text); - years := StrToFloat(YearEdit.Text); - amount := StrToFloat(AmountEdit.Text); - no_years := StrToFloat(YearsEdit.Text); - pcnt_interest := StrToFloat(InterestEdit.Text); - - interest := pcnt_interest / 100.0; - numerator := interest * amount / no_per_year; - denominator := 1.0 - (1.0 / power((interest / no_per_year + 1.0), (no_per_year * no_years) ) ); - payment := numerator / denominator; - RePayEdit.Text := Format('%.2f', [payment]); - - if not PrintChk.Checked then - exit; - - if (no_per_year < 12) then - fraction := 12.0 / no_per_year else fraction := 1.0; - - lReport := TStringList.Create; - try - lReport.Add( 'PAYMENT SCHEDULE PROGRAM by W. G. Miller'); - lReport.Add( ''); - lReport.Add( '---------------------------------------------------------------------------'); - lReport.Add( ''); - lReport.Add( 'Name of Borrower: ' + aname); - lReport.Add( 'Amount borrowed: $%.2f at %.2f percent over %.1f years.', [amount, pcnt_interest, no_years]); - lReport.Add( ''); - total_interest := 0.0; - total_payed := 0.0; - for j := 1 to round(no_years) do - begin - lReport.Add('---------------------------------------------------------------------------'); - lReport.Add(' PAYMENT PAYMENT INTEREST BALANCE TOTAL TOTAL'); - lReport.Add(' DATE AMOUNT PAYED REMAINING INTEREST PAID'); - lReport.Add('---------------------------------------------------------------------------'); - // 'xx/xx/xxxx xxxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxxxx - for k := 1 to no_per_year do - begin - year_payed := round(years) + j - 1 ; - month_payed := round(k * fraction + (month - fraction)); - if (month_payed > 12) then - begin - year_payed := year_payed + 1; - month_payed := month_payed - 12; - end; - interest_payment := amount * interest / no_per_year; - amount := amount - payment + interest_payment; - total_interest := total_interest + interest_payment; - total_payed := total_payed + payment; - lReport.Add('%2d/%2d/%4d %12.2f %12.2f %12.2f %12.2f %12.2f', [ - month_payed, day, year_payed, payment, interest_payment, - amount, total_interest, total_payed - ]); - end; // next k - lReport.Add(''); - end; // next j - - DisplayReport(lReport); - - finally - lReport.Free; + FTotalInterestSeries := TLineSeries.Create(FChartFrame); + with TLineSeries(FTotalInterestSeries) do + begin + LinePen.Color := DATA_COLORS[1]; + Title := 'Total interest'; end; + FChartFrame.Chart.AddSeries(FTotalInterestSeries); + + FTotalPaidSeries := TLineSeries.Create(FChartFrame); + with TLineSeries(FTotalPaidSeries) do + begin + LinePen.Color := DATA_COLORS[2]; + Title := 'Total paid'; + end; + FChartFrame.Chart.AddSeries(FTotalPaidSeries); + + FChartFrame.Chart.Legend.Visible := true; + FChartFrame.Chart.Legend.ColumnCount := 3; + FChartFrame.Chart.Legend.Alignment := laBottomCenter; + + FChartFrame.Chart.BottomAxis.Marks.Source := TDateTimeIntervalchartSource.Create(FChartFrame); + with TDateTimeIntervalChartSource(FChartFrame.Chart.BottomAxis.Marks.Source) do + begin + Params.MaxLength := 120; + Params.MinLength := 50; + end; + FChartFrame.Chart.BottomAxis.Marks.Style := smsLabel; + FChartFrame.Chart.LeftAxis.Marks.Format := '%.0n'; + + FChartFrame.SetXTitle('Date'); + FChartFrame.SetYTitle('Amounts'); + FChartFrame.SetTitle('Amortization Schedule'); + + PageControl.ActivePageIndex := 0; end; -procedure TLoanItFrm.CalendarBtnClick(Sender: TObject); + +procedure TLoanItForm.AdjustConstraints; +begin + inherited; + + ParamsPanel.Constraints.MinWidth := Max( + Panel1.Width + Panel1.BorderSpacing.Right + CalendarBtn.Width, + 4 * CloseBtn.Width + 3 * CloseBtn.BorderSpacing.Left + ); + ParamsPanel.Constraints.MinHeight := RepayEdit.Top + RepayEdit.Height + + ButtonBevel.Height + CloseBtn.BorderSpacing.Top + CloseBtn.Height; +end; + + +procedure TLoanItForm.CalendarBtnClick(Sender: TObject); var d: TDate; dy, mn, yr: Integer; @@ -186,23 +150,108 @@ begin end; end; -procedure TLoanItFrm.FormActivate(Sender: TObject); + +procedure TLoanItForm.Compute; var - w: Integer; + no_per_year, year_paid, month_paid, day, month, j, k: integer; + fraction, interest, numerator, denominator, payment, total_interest: double; + amount, interest_payment, total_paid, pcnt_interest, years, no_years: double; + aname: string; + paymentDate: TDate; + lReport: TStrings; begin - w := MaxValue([ResetBtn.Width, AmortizeBtn.Width, CloseBtn.Width]); - ResetBtn.Constraints.MinWidth := w; - AmortizeBtn.Constraints.MinWidth := w; - CloseBtn.Constraints.MinWidth := w; - { - w := DayEdit.Width; - DayEdit.Constraints.MaxWidth := w; - MonthEdit.Constraints.MaxWidth := w; - YearEdit.Constraints.MaxWidth := w; - } + FBalanceRemainSeries.Clear; + FTotalInterestSeries.Clear; + FTotalPaidSeries.Clear; + + aname := NameEdit.Text; + no_per_year := StrToInt(PayPerYrEdit.Text); + day := StrToInt(DayEdit.Text); + month := StrToInt(MonthEdit.Text); + years := StrToFloat(YearEdit.Text); + amount := StrToFloat(AmountEdit.Text); + no_years := StrToFloat(YearsEdit.Text); + pcnt_interest := StrToFloat(InterestEdit.Text); + + interest := pcnt_interest / 100.0; + numerator := interest * amount / no_per_year; + denominator := 1.0 - (1.0 / power((interest / no_per_year + 1.0), (no_per_year * no_years) ) ); + payment := numerator / denominator; + RePayEdit.Text := Format('%.2f', [payment]); + + if (no_per_year < 12) then + fraction := 12.0 / no_per_year + else + fraction := 1.0; + + lReport := TStringList.Create; + try + lReport.Add( 'PAYMENT SCHEDULE PROGRAM by W. G. Miller'); + lReport.Add( ''); + lReport.Add( '---------------------------------------------------------------------------'); + lReport.Add( ''); + lReport.Add( 'Name of Borrower: ' + aname); + lReport.Add( 'Amount borrowed: $%.2f at %.2f percent over %.1f years.', [amount, pcnt_interest, no_years]); + lReport.Add( ''); + total_interest := 0.0; + total_paid := 0.0; + for j := 1 to round(no_years) do + begin + lReport.Add('---------------------------------------------------------------------------'); + lReport.Add(' PAYMENT PAYMENT INTEREST BALANCE TOTAL TOTAL'); + lReport.Add(' DATE AMOUNT PAYED REMAINING INTEREST PAID'); + lReport.Add('---------------------------------------------------------------------------'); + // 'xx/xx/xxxx xxxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxxxx + for k := 1 to no_per_year do + begin + year_paid := round(years) + j - 1 ; + month_paid := round(k * fraction + (month - fraction)); + if (month_paid > 12) then + begin + year_paid := year_paid + 1; + month_paid := month_paid - 12; + end; + interest_payment := amount * interest / no_per_year; + amount := amount - payment + interest_payment; + total_interest := total_interest + interest_payment; + total_paid := total_paid + payment; + lReport.Add('%.2d/%.2d/%4d %12.2f %12.2f %12.2f %12.2f %12.2f', [ + month_paid, day, year_paid, payment, interest_payment, + amount, total_interest, total_paid + ]); + + paymentDate := EncodeDate(year_paid, month_paid, day); + FBalanceRemainSeries.AddXY(paymentDate, amount); + FTotalInterestSeries.AddXY(paymentDate, total_interest); + FTotalPaidSeries.AddXY(paymentDate, total_paid); + end; // next k + lReport.Add(''); + end; // next j + + FReportFrame.DisplayReport(lReport); + + finally + lReport.Free; + end; end; -function TLoanItFrm.Validate(out AMsg: String; out AControl: TWinControl): Boolean; + +procedure TLoanItForm.Reset; +begin + inherited; + + NameEdit.Text := ''; + MonthEdit.Text := ''; + DayEdit.Text := ''; + YearEdit.Text := ''; + YearsEdit.Text := ''; + AmountEdit.Text := ''; + InterestEdit.Text := ''; + PayPerYrEdit.Text := ''; + RepayEdit.Text := ''; +end; + +function TLoanItForm.Validate(out AMsg: String; out AControl: TWinControl): Boolean; var n: Integer; x: Double; @@ -315,9 +364,6 @@ begin Result := true; end; -initialization - - {$I loanitunit.lrs} end. diff --git a/applications/lazstats/source/forms/mainunit.pas b/applications/lazstats/source/forms/mainunit.pas index a28f4354f..5c546c84b 100644 --- a/applications/lazstats/source/forms/mainunit.pas +++ b/applications/lazstats/source/forms/mainunit.pas @@ -1817,9 +1817,9 @@ end; // Menu "Analysis" > "Financial" > "Loan Amortization Schedule" procedure TOS3MainFrm.MenuItem10Click(Sender: TObject); begin - if LoanItFrm = nil then - Application.CreateForm(TLoanItFrm, LoanItFrm); - LoanItFrm.ShowModal; + if LoanItForm = nil then + Application.CreateForm(TLoanItForm, LoanItForm); + LoanItForm.Show; end; // Menu "Analysis" > "Nonparametric" > "Cochran Q Test"