demotime.lpr 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. program demotime;
  2. {$MODE OBJFPC}
  3. {$MODESWITCH EXTERNALCLASS}
  4. uses
  5. JS,
  6. Web,
  7. Math,
  8. ChartJS;
  9. function moment(const date: JSValue; const fmt: string): TJSDate; external name 'moment';
  10. function randomNumber(const min, max: Double): Double;
  11. begin
  12. Result := Random * (max - min) + min;
  13. end;
  14. function randomBar(const date: TJSDate; const lastClose: Double): TChartTYData;
  15. var
  16. open, close: Double;
  17. begin
  18. open := randomNumber(lastClose * 0.95, lastClose * 1.05);
  19. close := randomNumber(open * 0.95, open * 1.05);
  20. Result := TChartTYData.new(date.valueOf, close);
  21. end;
  22. procedure generateData(const date, data, labels); assembler;
  23. asm
  24. while (data.length < 60) {
  25. date = date.clone().add(1, 'd');
  26. if (date.isoWeekday() <= 5) {
  27. data.push(pas.program.randomBar(date, data[data.length - 1].y));
  28. labels.push(date);
  29. }
  30. }
  31. end;
  32. const
  33. dateFormat = 'MMMM DD YYYY';
  34. var
  35. select: TJSHTMLSelectElement;
  36. chart: TChart;
  37. config: TChartConfiguration;
  38. dataset: TChartLineDataset;
  39. data, labels: TJSArray;
  40. date: TJSDate;
  41. axis: TChartScaleCartesianTime;
  42. begin
  43. date := moment('April 01 2017', dateFormat);
  44. data := TJSArray.new(randomBar(date, 30));
  45. labels := TJSArray.new(date);
  46. generateData(date, data, labels);
  47. dataset := TChartLineDataset.new;
  48. dataset.label_ := 'CHRT - Chart.js Corporation';
  49. dataset.backgroundColor := 'rgba(255, 99, 132, 0.5)';
  50. dataset.borderColor := 'rgb(255, 99, 132)';
  51. dataset.data_ := data;
  52. dataset.type_ := 'line';
  53. dataset.pointRadius := 0;
  54. dataset.fill := False;
  55. dataset.lineTension := 0;
  56. dataset.borderWidth := 2;
  57. axis := TChartScaleCartesianTime.new;
  58. axis.type_ := 'time';
  59. axis.distribution := 'series';
  60. axis.ticks := TChartScaleCartesianTimeTick.new;
  61. axis.ticks.source := 'labels';
  62. config := TChartConfiguration.new;
  63. config.type_ := 'bar';
  64. config.data := TChartData.new;
  65. config.data.datasets := [dataset];
  66. config.options := TChartOptions.new;
  67. config.options.scales := TChartScalesConfiguration.new;
  68. config.options.scales.xAxes_ := TJSArray.new(axis);
  69. chart := TChart.new('myChart', config);
  70. select := TJSHTMLSelectElement(document.getElementById('type'));
  71. select.addEventListener('change',
  72. procedure
  73. begin
  74. chart.config.data.datasets[0].type_ := select.value;
  75. chart.update;
  76. end);
  77. end.