diff --git a/.gitattributes b/.gitattributes index 78f38c084e..5c4394f876 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2522,6 +2522,10 @@ components/tachart/demo/extent/extentdemo.lpi svneol=native#text/plain components/tachart/demo/extent/extentdemo.lpr svneol=native#text/plain components/tachart/demo/extent/main.lfm svneol=native#text/plain components/tachart/demo/extent/main.pas svneol=native#text/plain +components/tachart/demo/fit/Main.lfm svneol=native#text/plain +components/tachart/demo/fit/Main.pas svneol=native#text/pascal +components/tachart/demo/fit/fitdemo.lpi svneol=native#text/plain +components/tachart/demo/fit/fitdemo.lpr svneol=native#text/pascal components/tachart/demo/fpvectorial/Main.lfm svneol=native#text/plain components/tachart/demo/fpvectorial/Main.pas svneol=native#text/pascal components/tachart/demo/fpvectorial/fpvectorialdemo.lpi svneol=native#text/plain diff --git a/.gitignore b/.gitignore index 742bb291f0..ac6fcc5354 100644 --- a/.gitignore +++ b/.gitignore @@ -166,6 +166,10 @@ components/tachart/demo/events/lib components/tachart/demo/extent/*.exe components/tachart/demo/extent/*.lps components/tachart/demo/extent/lib +components/tachart/demo/fit/*.exe +components/tachart/demo/fit/*.lps +components/tachart/demo/fit/*.res +components/tachart/demo/fit/lib components/tachart/demo/fpvectorial/*.exe components/tachart/demo/fpvectorial/*.lps components/tachart/demo/fpvectorial/lib diff --git a/components/tachart/demo/fit/Main.lfm b/components/tachart/demo/fit/Main.lfm new file mode 100644 index 0000000000..33195ef5fb --- /dev/null +++ b/components/tachart/demo/fit/Main.lfm @@ -0,0 +1,399 @@ +object frmMain: TfrmMain + Left = 249 + Height = 503 + Top = 242 + Width = 800 + Caption = 'frmMain' + ClientHeight = 503 + ClientWidth = 800 + OnCreate = FormCreate + ShowHint = True + LCLVersion = '0.9.31' + object pnlParams: TPanel + Left = 8 + Height = 487 + Top = 8 + Width = 376 + Align = alLeft + BorderSpacing.Around = 8 + BevelOuter = bvNone + ClientHeight = 487 + ClientWidth = 376 + TabOrder = 0 + object gbDataGeneration: TGroupBox + Left = 0 + Height = 105 + Top = 0 + Width = 376 + Align = alTop + Caption = ' Data generation ' + ClientHeight = 87 + ClientWidth = 372 + TabOrder = 0 + object btnSave: TSpeedButton + Left = 335 + Height = 22 + Hint = 'Export data to verify fit with other software' + Top = 44 + Width = 23 + Glyph.Data = { + 36040000424D3604000000000000360000002800000010000000100000000100 + 2000000000000004000064000000640000000000000000000000FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF006E01 + 4A0066004445650043C60404048A0404048A0404048A0404048A0404048A0404 + 048A650043C6650043C6650043C6650043C666004494FFFFFF00FFFFFF006F01 + 4B416E014ABA9B4880EFB9ABABFFB16598FFB16598FFB5A7A7FFB5A7A7FFB9AB + ABFFB16598FFC377AAFFC074A7FFD68ABDFF6E014ABAFFFFFF00FFFFFF007702 + 50ADD488BBFFAD6194FFBAB1B1FFAD6194FFAD6194FFB1A8A8FFB1A8A8FFBAB1 + B1FFAD6194FFC377AAFFB86C9FFFD88CBFFF770250ADFFFFFF00FFFFFF007B02 + 53A8D286B9FFA95D90FFC0BBBBFF95497CFF95497CFFB7B2B2FFB7B2B2FFC0BB + BBFFA95D90FFC377AAFFB06497FFDA8EC1FF7B0253A8FFFFFF00FFFFFF007E02 + 55A4D589BCFFA5598CFFC8C7C7FFC3C2C2FFC3C2C2FFC3C2C2FFC3C2C2FFC8C7 + C7FFA5598CFFC377AAFFA85C8FFFDD91C4FF7E0255A4FFFFFF00FFFFFF008002 + 57A0D98DC0FFA25689FFA15588FFA15588FFA15588FFA15588FFA15588FFA155 + 88FFA25689FFA25689FFA25689FFE195C8FF800257A0FFFFFF00FFFFFF008302 + 599DDC90C3FFD387BAFFD387BAFFD387BAFFD387BAFFD387BAFFD387BAFFD387 + BAFFD387BAFFD387BAFFD387BAFFDC90C3FF8302599DFFFFFF00FFFFFF008502 + 5A9AE094C7FFF0DDDEFFF4F4E4FFF4F4E4FFF4F4E4FFF4F4E4FFF4F4E4FFF4F4 + E4FFF4F4E4FFF4F4E4FFF0DDDEFFE094C7FF85025A9AFFFFFF00FFFFFF008702 + 5C97E397CAFFF6F6E9FFECECDFFFECECDFFFECECDFFFECECDFFFECECDFFFECEC + DFFFECECDFFFECECDFFFF6F6E9FFE397CAFF87025C97FFFFFF00FFFFFF008A03 + 5E94E69ACDFFF8F8EFFFF1F1E7FFF1F1E7FFF1F1E7FFF1F1E7FFF1F1E7FFF1F1 + E7FFF1F1E7FFF1F1E7FFF8F8EFFFE69ACDFF8A035E94FFFFFF00FFFFFF008C03 + 5F91EA9ED1FFFBFBF5FFF6F6F0FFF6F6F0FFF6F6F0FFF6F6F0FFF6F6F0FFF6F6 + F0FFF6F6F0FFF6F6F0FFFBFBF5FFEA9ED1FF8C035F91FFFFFF00FFFFFF008D03 + 608FECA0D3FFFEFEFBFFFBFBF8FFFBFBF8FFFBFBF8FFFBFBF8FFFBFBF8FFFBFB + F8FFFBFBF8FFFBFBF8FFFEFEFBFFECA0D3FF8D03608FFFFFFF00FFFFFF008F03 + 618DF2A6D9FFFFFFFFFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFF + FEFFFFFFFEFFFFFFFEFFFFFFFFFFF2A6D9FF8F03618DFFFFFF00FFFFFF009003 + 62689003628B7F7F55667F7F55667F7F55667F7F55667F7F55667F7F55667F7F + 55667F7F55667F7F55667F7F55669003628B90036268FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00 + } + NumGlyphs = 0 + OnClick = btnSaveClick + end + object cbTestFunction: TComboBox + Left = 94 + Height = 21 + Hint = 'Select a dataset for fitting' + Top = 8 + Width = 264 + ItemHeight = 13 + OnSelect = cbTestFunctionSelect + Style = csDropDownList + TabOrder = 0 + end + object lblTestFunction: TLabel + Left = 14 + Height = 14 + Top = 12 + Width = 64 + Caption = 'Test function' + ParentColor = False + end + object lblOfRange: TLabel + Left = 195 + Height = 14 + Top = 46 + Width = 56 + Caption = '% of range' + ParentColor = False + end + object lblNoiseY: TLabel + Left = 14 + Height = 14 + Top = 46 + Width = 79 + Caption = 'Noise amplitude ' + ParentColor = False + end + object edNoiseY: TFloatSpinEdit + Left = 118 + Height = 21 + Top = 44 + Width = 66 + DecimalPlaces = 0 + Increment = 1 + MaxValue = 100 + MinValue = 0 + OnChange = edNoiseYChange + TabOrder = 1 + Value = 2 + end + end + object gbFitting: TGroupBox + Left = 0 + Height = 382 + Top = 105 + Width = 376 + Align = alClient + Caption = ' Fitting ' + ClientHeight = 364 + ClientWidth = 372 + TabOrder = 1 + object gbResults: TGroupBox + Left = 14 + Height = 142 + Top = 207 + Width = 344 + Anchors = [akTop, akLeft, akBottom] + Caption = ' Fit results ' + ClientHeight = 124 + ClientWidth = 340 + TabOrder = 0 + object lbResults: TListBox + Left = 12 + Height = 104 + Top = 8 + Width = 316 + Align = alClient + BorderSpacing.Left = 12 + BorderSpacing.Top = 8 + BorderSpacing.Right = 12 + BorderSpacing.Bottom = 12 + ItemHeight = 0 + ParentFont = False + TabOrder = 0 + end + end + object gbFitRange: TGroupBox + Left = 14 + Height = 115 + Top = 84 + Width = 344 + Caption = 'Fit range' + ClientHeight = 97 + ClientWidth = 340 + TabOrder = 1 + object cbFitRangeUseMin: TCheckBox + Left = 17 + Height = 17 + Top = 7 + Width = 81 + Caption = 'Use minimum' + OnClick = cbFitRangeUseMinClick + TabOrder = 0 + end + object cbFitRangeUseMax: TCheckBox + Left = 17 + Height = 17 + Top = 33 + Width = 85 + Caption = 'Use maximum' + OnClick = cbFitRangeUseMaxClick + TabOrder = 1 + end + object edFitRangeMin: TFloatSpinEdit + Left = 150 + Height = 21 + Top = 7 + Width = 90 + Increment = 1 + MaxValue = 1E308 + MinValue = -1E308 + OnChange = edFitRangeMinChange + TabOrder = 2 + Value = 5 + Visible = False + end + object edFitRangeMax: TFloatSpinEdit + Left = 150 + Height = 21 + Top = 35 + Width = 90 + Increment = 1 + MaxValue = 1E308 + MinValue = -1E308 + OnChange = edFitRangeMaxChange + TabOrder = 3 + Value = 20 + Visible = False + end + object cbDrawFitRangeOnly: TCheckBox + Left = 17 + Height = 17 + Top = 64 + Width = 166 + Caption = 'Draw fit curve in fit range only' + Checked = True + Enabled = False + OnClick = cbDrawFitRangeOnlyClick + State = cbChecked + TabOrder = 4 + end + end + object edFitOrder: TSpinEdit + Left = 169 + Height = 21 + Top = 48 + Width = 53 + OnChange = edFitOrderChange + TabOrder = 2 + Value = 2 + end + object lblFitOrder: TLabel + Left = 14 + Height = 14 + Top = 50 + Width = 102 + Caption = 'Degree of polynomial' + ParentColor = False + end + object cbFitEquation: TComboBox + Left = 86 + Height = 21 + Hint = 'Select a function type to be used for fitting to the generated data' + Top = 16 + Width = 272 + ItemHeight = 13 + ItemIndex = 0 + Items.Strings = ( + 'Polynomial (y = b0 + b1*x + ... bn*x^n)' + 'Linear (y = a + b*x)' + 'Exponential (y = a * exp (b * x), linear in semilog plot)' + 'Power (y = a x^b, linear in log-log plot)' + ) + OnSelect = cbFitEquationSelect + Style = csDropDownList + TabOrder = 3 + Text = 'Polynomial (y = b0 + b1*x + ... bn*x^n)' + end + object lblFitEquation: TLabel + Left = 14 + Height = 14 + Top = 19 + Width = 58 + Caption = 'Fit equation' + ParentColor = False + end + end + end + object pnlChart: TPanel + Left = 392 + Height = 487 + Top = 8 + Width = 400 + Align = alClient + BorderSpacing.Around = 8 + BevelOuter = bvNone + ClientHeight = 487 + ClientWidth = 400 + TabOrder = 1 + object Chart: TChart + Left = 0 + Height = 456 + Top = 0 + Width = 400 + AxisList = < + item + Grid.Visible = False + Intervals.Tolerance = 2 + Minors = < + item + Grid.Visible = False + Intervals.MinLength = 5 + Intervals.Options = [aipUseCount, aipUseMinLength] + end> + Title.LabelFont.Orientation = 900 + Title.LabelFont.Style = [fsBold] + Title.Visible = True + Title.Caption = 'y' + end + item + Grid.Visible = False + Intervals.Tolerance = 2 + Alignment = calBottom + Minors = < + item + Grid.Visible = False + Intervals.MinLength = 5 + Intervals.Options = [aipUseCount, aipUseMinLength] + end> + Title.LabelFont.Style = [fsBold] + Title.Visible = True + Title.Caption = 'x' + end> + BackColor = clWhite + Foot.Brush.Color = clBtnFace + Foot.Font.Color = clBlue + Legend.Alignment = laTopCenter + Legend.Visible = True + Title.Brush.Color = clBtnFace + Title.Font.Color = clRed + Title.Text.Strings = ( + 'TAChart' + ) + Align = alClient + DoubleBuffered = True + ParentColor = False + object DataSeries: TLineSeries + Title = 'Test data' + AxisIndexX = 1 + AxisIndexY = 0 + LinePen.Style = psClear + Pointer.Brush.Color = clBlack + Pointer.HorizSize = 1 + Pointer.Style = psCross + Pointer.VertSize = 1 + ShowPoints = True + Source = ListChartSource + end + object FitSeries: TFitSeries + Legend.Format = '%0:s: %2:s' + Title = 'fitted data' + AxisIndexX = 1 + AxisIndexY = 0 + OnFitComplete = FitCompleteHandler + Pen.Color = clRed + Source = ListChartSource + end + end + object pnlLog: TPanel + Left = 0 + Height = 31 + Top = 456 + Width = 400 + Align = alBottom + BevelOuter = bvNone + ClientHeight = 31 + ClientWidth = 400 + TabOrder = 1 + object cbLogX: TCheckBox + Left = 48 + Height = 17 + Top = 3 + Width = 83 + Caption = 'Logarithmic x' + OnClick = cbLogClick + TabOrder = 0 + end + object cbLogY: TCheckBox + Left = 176 + Height = 17 + Top = 3 + Width = 83 + Caption = 'Logarithmic y' + OnClick = cbLogClick + TabOrder = 1 + end + end + end + object ListChartSource: TListChartSource + left = 584 + top = 120 + end + object SaveDialog: TSaveDialog + left = 480 + top = 64 + end + object ChartAxisTransformations: TChartAxisTransformations + left = 584 + top = 184 + object LogarithmAxisTransform: TLogarithmAxisTransform + Base = 10 + end + end +end diff --git a/components/tachart/demo/fit/Main.pas b/components/tachart/demo/fit/Main.pas new file mode 100644 index 0000000000..9f27a79c44 --- /dev/null +++ b/components/tachart/demo/fit/Main.pas @@ -0,0 +1,276 @@ +unit Main; + +{$H+} + +interface + +uses + Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, + StdCtrls, Spin, Buttons, TAGraph, TASeries, TASources, + TAFuncSeries, TATransformations; + +type + + { TfrmMain } + + TfrmMain = class(TForm) + cbTestFunction: TComboBox; + Chart: TChart; + cbDrawFitRangeOnly: TCheckBox; + FitSeries: TFitSeries; + DataSeries: TLineSeries; + cbFitRangeUseMin:TCheckBox; + cbFitRangeUseMax:TCheckBox; + cbFitEquation: TComboBox; + cbLogX: TCheckBox; + cbLogY: TCheckBox; + ChartAxisTransformations: TChartAxisTransformations; + LogarithmAxisTransform: TLogarithmAxisTransform; + edFitRangeMax:TFloatSpinEdit; + edNoiseY: TFloatSpinEdit; + edFitRangeMin:TFloatSpinEdit; + gbFitRange:TGroupBox; + gbDataGeneration: TGroupBox; + gbFitting: TGroupBox; + gbResults: TGroupBox; + lblFitOrder:TLabel; + lblNoiseY: TLabel; + lblFitEquation: TLabel; + lblOfRange: TLabel; + lblTestFunction: TLabel; + lbResults: TListBox; + ListChartSource: TListChartSource; + pnlParams: TPanel; + edFitOrder:TSpinEdit; + pnlLog: TPanel; + pnlChart: TPanel; + SaveDialog: TSaveDialog; + btnSave: TSpeedButton; + procedure btnSaveClick(Sender: TObject); + procedure cbDrawFitRangeOnlyClick(Sender: TObject); + procedure cbFitEquationSelect(Sender: TObject); + procedure cbFitRangeUseMaxClick(Sender:TObject); + procedure cbFitRangeUseMinClick(Sender:TObject); + procedure cbLogClick(Sender: TObject); + procedure cbTestFunctionSelect(Sender: TObject); + procedure edFitOrderChange(Sender:TObject); + procedure edFitRangeMaxChange(Sender:TObject); + procedure edFitRangeMinChange(Sender:TObject); + procedure edNoiseYChange(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FitCompleteHandler(Sender:TObject); + private + procedure CreateData; + end; + +var + frmMain: TfrmMain; + +implementation + +{$R *.lfm} + +uses + Math, TAChartAxis, TAChartUtils, TACustomSource; + +const + // Parameters used for data generation; should be reproduced by the fit. + POLY_PARAMS: array[0..2] of Double = (100, -8, 0.2); + LIN_PARAMS : array[0..1] of Double = (100.0, -2.5); + EXP_PARAMS : array[0..1] of Double = (10.0, -0.05); + PWR_PARAMS : array[0..1] of Double = (3.0, -0.5); + + // Min and max for x axis of the various test functions + // positive numbers only because of the logarithms involved in this example. + XRANGE : array[TFitEquation, 0..1] of Double = ( + (0.1, 50), + (1, 20), + (0.001, 100), + (1, 20) + ); + +{ TfrmMain } + +procedure TfrmMain.btnSaveClick(Sender: TObject); +var + s: TStream; + fs: TFormatSettings; + si: PChartDataItem; +begin + if not SaveDialog.Execute then exit; + fs := DefaultFormatSettings; + fs.DecimalSeparator := '.'; + s := TFileStream.Create(SaveDialog.FileName, fmCreate); + try + for si in ListChartSource do + s.WriteAnsiString(Format('%.9g'#9'%.9g'#13#10, [si^.X, si^.Y], fs)); + finally + s.Free; + end; +end; + +procedure TfrmMain.cbDrawFitRangeOnlyClick(Sender: TObject); +begin + FitSeries.DrawFitRangeOnly := cbDrawFitRangeOnly.Checked; +end; + +procedure TfrmMain.cbFitEquationSelect(Sender: TObject); +var + eq: TFitEquation; +begin + eq := TFitEquation(cbFitEquation.ItemIndex); + FitSeries.FitEquation := eq; + edFitOrder.Enabled := (eq = fePolynomial); + lblFitOrder.Enabled := edFitOrder.Enabled; +end; + +procedure TfrmMain.cbFitRangeUseMaxClick(Sender:TObject); +begin + edFitRangeMax.Visible := cbFitRangeUseMax.Checked; + FitSeries.FitRange.UseMax := cbFitRangeUseMax.Checked; + cbDrawFitRangeOnly.Enabled := cbFitRangeUseMin.Checked or cbFitRangeUseMax.Checked; +end; + +procedure TfrmMain.cbFitRangeUseMinClick(Sender:TObject); +begin + edFitRangeMin.Visible := cbFitRangeUseMin.Checked; + FitSeries.FitRange.UseMin := cbFitRangeUseMin.Checked; + cbDrawFitRangeOnly.Enabled := cbFitRangeUseMin.Checked or cbFitRangeUseMax.Checked; +end; + +procedure TfrmMain.cbLogClick(Sender: TObject); +var + axis: TChartAxis; +begin + if Sender = cbLogX then + axis := Chart.BottomAxis + else + axis := Chart.LeftAxis; + if (Sender as TCheckbox).Checked then begin + axis.Transformations := ChartAxisTransformations; + axis.Intervals.Options := + [aipUseMinLength, aipUseCount, aipGraphCoords, aipUseNiceSteps]; + axis.Intervals.NiceSteps := + Format('%g|%g|%g|%g', [Log10(2), Log10(3), Log10(5), Log10(10)]); + end else begin + axis.Transformations := nil; + axis.Intervals.Options := [aipUseMinLength, aipUseMaxLength, aipUseNiceSteps]; + axis.Intervals.NiceSteps := '0.2|0.5|1.0'; + end; +end; + +procedure TfrmMain.cbTestFunctionSelect(Sender: TObject); +begin + CreateData; +end; + +procedure TfrmMain.CreateData; +const + N = 100; +var + i: Integer; + x, y, xmin, xmax, ymin, ymax, maxNoise: Double; + xarr, yarr: array of Double; +begin + RandSeed := 875876; // Reproducible noise for testing. + + // Calculate test data and store in temporary arrays. + // This is because noise is relative to the data range in this example. + xmin := XRANGE[TFitEquation(cbTestFunction.ItemIndex), 0]; + xmax := XRANGE[TFitEquation(cbTestFunction.ItemIndex), 1]; + SetLength(xarr, N); + SetLength(yarr, N); + for i := 0 to High(xarr) do begin + x := xmin + (xmax - xmin) / (N - 1) * i; + case TFitEquation(cbTestFunction.ItemIndex) of + fePolynomial: y := POLY_PARAMS[0] + POLY_PARAMS[1]*x + POLY_PARAMS[2]*x*x; + feLinear : y := LIN_PARAMS[0] + LIN_PARAMS[1]*x; + feExp : y := EXP_PARAMS[0]*Exp(EXP_PARAMS[1]*x); + fePower : y := PWR_PARAMS[0]*Power(x, PWR_PARAMS[1]); + end; + xarr[i] := x; + yarr[i] := y; + end; + + // Add noise to the y values, and add data to line series. + ymin := MinValue(yarr); + ymax := MaxValue(yarr); + maxNoise := edNoiseY.Value * (ymax - ymin) * 0.01; + DataSeries.BeginUpdate; + try + DataSeries.Clear; + for i := 0 to High(xarr) do begin + x := xarr[i]; + y := yarr[i] + maxNoise * (Random - 0.5); + if TFitEquation(cbTestFunction.ItemIndex) = feExp then + // Make sure that the noise generation does not produce negative + // values for the exponential data set. + while y < 0 do + y := yarr[i] + maxNoise * (Random - 0.5); + DataSeries.AddXY(x, y); + end; + finally + DataSeries.EndUpdate; + end; +end; + +procedure TfrmMain.edFitOrderChange(Sender:TObject); +begin + // Needs one parameter more than degree of fit polynomial. + FitSeries.ParamCount := edFitOrder.Value + 1; +end; + +procedure TfrmMain.edFitRangeMaxChange(Sender:TObject); +begin + FitSeries.FitRange.Max := edFitRangeMax.Value; +end; + +procedure TfrmMain.edFitRangeMinChange(Sender:TObject); +begin + FitSeries.FitRange.Min := edFitRangeMin.Value; +end; + +procedure TfrmMain.edNoiseYChange(Sender: TObject); +begin + CreateData; +end; + +procedure TfrmMain.FitCompleteHandler(Sender:TObject); +var + i: Integer; +begin + with lbResults.Items do begin + BeginUpdate; + Clear; + case TFitEquation(cbFitEquation.ItemIndex) of + fePolynomial: + for i := 0 to FitSeries.ParamCount - 1 do + Add(Format('b[%d] = %g', [i, FitSeries.Param[i]])); + else + Add(Format('a = %g', [FitSeries.Param[0]])); + Add(Format('b = %g', [FitSeries.Param[1]])); + end; + EndUpdate; + end; +end; + +procedure TfrmMain.FormCreate(Sender: TObject); +const + FMT = '%g'; +begin + with cbTestFunction do begin + Items.Add(ParamsToEquation(fePolynomial, POLY_PARAMS, FMT)); + Items.Add(ParamsToEquation(feLinear, LIN_PARAMS, FMT)); + Items.Add(ParamsToEquation(feExp, EXP_PARAMS, FMT)); + Items.Add(ParamsToEquation(fePower, PWR_PARAMS, FMT)); + ItemIndex := Ord(fePolynomial); + end; + + FitSeries.FitRange.Min := edFitRangeMin.Value; + FitSeries.FitRange.Max := edFitRangeMax.Value; + + CreateData; +end; + +end. + diff --git a/components/tachart/demo/fit/fitdemo.lpi b/components/tachart/demo/fit/fitdemo.lpi new file mode 100644 index 0000000000..9d7177679e --- /dev/null +++ b/components/tachart/demo/fit/fitdemo.lpi @@ -0,0 +1,98 @@ + + + + + + + + + + <ResourceType Value="res"/> + <UseXPManifest Value="True"/> + </General> + <i18n> + <EnableI18N LFM="False"/> + </i18n> + <VersionInfo> + <StringTable ProductVersion=""/> + </VersionInfo> + <BuildModes Count="1"> + <Item1 Name="Default" Default="True"/> + </BuildModes> + <PublishOptions> + <Version Value="2"/> + <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/> + <ExcludeFileFilter Value="*.(bak|ppu|o|so);*~;backup"/> + </PublishOptions> + <RunParams> + <local> + <FormatVersion Value="1"/> + </local> + </RunParams> + <RequiredPackages Count="2"> + <Item1> + <PackageName Value="TAChartLazarusPkg"/> + </Item1> + <Item2> + <PackageName Value="LCL"/> + </Item2> + </RequiredPackages> + <Units Count="2"> + <Unit0> + <Filename Value="fitdemo.lpr"/> + <IsPartOfProject Value="True"/> + <UnitName Value="fitdemo"/> + </Unit0> + <Unit1> + <Filename Value="Main.pas"/> + <IsPartOfProject Value="True"/> + <ComponentName Value="frmMain"/> + <ResourceBaseClass Value="Form"/> + <UnitName Value="Main"/> + </Unit1> + </Units> + </ProjectOptions> + <CompilerOptions> + <Version Value="11"/> + <PathDelim Value="\"/> + <Target> + <Filename Value="fitdemo"/> + </Target> + <SearchPaths> + <IncludeFiles Value="$(ProjOutDir)"/> + <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> + </SearchPaths> + <CodeGeneration> + <Checks> + <RangeChecks Value="True"/> + <OverflowChecks Value="True"/> + </Checks> + </CodeGeneration> + <Linking> + <Options> + <Win32> + <GraphicApplication Value="True"/> + </Win32> + </Options> + </Linking> + <Other> + <CompilerMessages> + <UseMsgFile Value="True"/> + </CompilerMessages> + <CompilerPath Value="$(CompPath)"/> + </Other> + </CompilerOptions> + <Debugging> + <Exceptions Count="3"> + <Item1> + <Name Value="EAbort"/> + </Item1> + <Item2> + <Name Value="ECodetoolError"/> + </Item2> + <Item3> + <Name Value="EFOpenError"/> + </Item3> + </Exceptions> + </Debugging> +</CONFIG> diff --git a/components/tachart/demo/fit/fitdemo.lpr b/components/tachart/demo/fit/fitdemo.lpr new file mode 100644 index 0000000000..c441613d84 --- /dev/null +++ b/components/tachart/demo/fit/fitdemo.lpr @@ -0,0 +1,20 @@ +program fitdemo; + +{$mode objfpc}{$H+} + +uses + {$IFDEF UNIX}{$IFDEF UseCThreads} + cthreads, + {$ENDIF}{$ENDIF} + Interfaces, // this includes the LCL widgetset + Forms, Main, tachartlazaruspkg; + +{$R *.res} + +begin + RequireDerivedFormResource := True; + Application.Initialize; + Application.CreateForm(TfrmMain, frmMain); + Application.Run; +end. +