TMS WEB Core wrapper for Apache ECharts library. Provides declarative chart configuration with automatic resize handling and theme support.
TEChartsChart wraps the ECharts JavaScript library for use in TMS WEB Core applications:
Location: Framework/Components/Charts/SOURCE/Obj.Charts.ECharts.pas
Required: ECharts library loaded in HTML (CDN or local)
| Property | Type | Description |
|---|---|---|
ChartOption | TJSObject | ECharts option object (JSON structure) |
Theme | String | Theme name: 'dark', 'light', or custom |
AutoResize | Boolean | Auto-resize on container size change |
Animation | Boolean | Enable/disable chart animations |
Renderer | TChartRenderer | crCanvas or crSVG |
PROCEDURE InitChart; /// Initialize ECharts instance
PROCEDURE DisposeChart; /// Dispose and cleanup
PROCEDURE SetOption(Option: TJSObject); /// Apply new chart options
PROCEDURE SetOptionJSON(JSON: STRING); /// Apply options from JSON string
PROCEDURE UpdateSeries(Index: Integer; Data: TJSArray);
PROCEDURE AppendData(SeriesIndex: Integer; Data: TJSArray);
PROCEDURE ClearChart; /// Remove all data
PROCEDURE Resize; /// Force resize recalculation
PROCEDURE ShowLoading; /// Show loading spinner
PROCEDURE HideLoading; /// Hide loading spinner
PROCEDURE SaveAsImage: STRING; /// Get base64 PNG image
Set via series[].type in ChartOption:
| Type | Description |
|---|---|
line | Line chart, time series |
bar | Bar chart, vertical or horizontal |
pie | Pie/donut chart |
scatter | Scatter plot |
gauge | Gauge/meter display |
heatmap | Heat map visualization |
radar | Radar/spider chart |
PROCEDURE LoadFromDataset(Dataset: TAPIDataset;
XField, YField: STRING; SeriesName: STRING = '');
/// Build data array manually
VAR
Data: TJSArray;
BEGIN
Data := TJSArray.new;
WHILE NOT Dataset.EOF DO
BEGIN
Data.push(TJSArray._of(
Dataset.FieldByName('timestamp').AsString,
Dataset.FieldByName('value').AsFloat));
Dataset.Next;
END;
Chart.UpdateSeries(0, Data);
END;
/// PostgreSQL getchartdata() returns ready-to-use JSON
dsChartData.Load(
PROCEDURE
BEGIN
Chart.SetOptionJSON(dsChartData.FieldByName('chartoption').AsString);
END);
Chart.Theme := 'dark'; /// Dark background theme
Chart.Theme := 'light'; /// Light background theme
/// Register custom theme in JavaScript first
/// echarts.registerTheme('myTheme', {...})
Chart.Theme := 'myTheme';
/// Override colors in option
Option := TJSObject.new;
Option['color'] := TJSArray._of('#66b3ff', '#55d38a', '#ffbf66');
Chart.SetOption(Option);
PROCEDURE TfrmChart.CreateLineChart;
VAR
Option: TJSObject;
BEGIN
Option := TJSJSON.parseObject('{
"xAxis": {"type": "category", "data": ["Mon","Tue","Wed","Thu","Fri"]},
"yAxis": {"type": "value"},
"series": [{"type": "line", "data": [150, 230, 224, 218, 135]}]
}');
Chart.SetOption(Option);
END;
PROCEDURE TfrmChart.dsSensorDataAfterOpen(Dataset: TDataset);
VAR
Option: TJSObject;
Data: TJSArray;
BEGIN
Data := TJSArray.new;
Dataset.First;
WHILE NOT Dataset.EOF DO
BEGIN
Data.push(TJSArray._of(
Dataset.FieldByName('readingtime').AsString,
Dataset.FieldByName('value').AsFloat));
Dataset.Next;
END;
Option := TJSJSON.parseObject('{
"xAxis": {"type": "time"},
"yAxis": {"type": "value", "name": "Reading"},
"series": [{"type": "line", "smooth": true}]
}');
Option['series'][0]['data'] := Data;
Chart.SetOption(Option);
END;
PROCEDURE TfrmChart.UpdateGauge(Value: Double);
VAR
Option: TJSObject;
BEGIN
Option := TJSJSON.parseObject('{
"series": [{
"type": "gauge",
"min": 0,
"max": 100,
"detail": {"formatter": "{value}%"},
"data": [{"value": ' + FloatToStr(Value) + '}]
}]
}');
Chart.SetOption(Option);
END;