So it makes sense that
But how am I to change the X of the value?
In DataToSeriesHandler it is set by AItem.X := AIndex*some_value; but CS0.Item is not accessible.
My example follows the data structure that you gave in the first post. This defines a matrix of floats where the columns correspond to the first index, and the y values correspond to the second index. There is no X value in this structure. For plotting, it is assumed that the x values are equal to the data point index, multiplied by some scaling factor.
The idea behind the UserDefinedChartSource is that you have your data in any structure, an array of x/y records, separate arrays for x and y, a TList, columns in a string grid, or whatever. The UserdefineChartSource is the link between this arbitrary data structure and the series. Whatever you want to do with the data points in the series, must be done in this external datastructure, and then redraw the series. So, when your data structure does not provide an x value because you plot against the index, you must exchange the values in the data structure if you want the move a data point to another x position.
Also, when I drag a point will the DATA array change according the new value of the dragged point?[/size]
You mean: dragging with the TDatapointDragTool? This is not possible because when you drag a datapoint on the screen the series must write the edited value back to the chartsource. But the UserDefinedChartSource does not know how data are stored. If you insist on the possibility to drag data points (how do you do this, BTW, when you have 10 millions per channel?) is to return to the TListChartSource, and AddXY values to the series as you did initially. And this brings you back the speed problem...
Is it absolutely necessary that you display all 10 millions of data values? You can't see any details here at all, just a broad colored band. Therefore I'd suggest that you have a zoomed view displaying only 1000 values (or so). In this case you'd only have to read these 1000 values into the series (AddXY), and everything will be much faster. And when you scroll through the original data set you erase the series and reload those 1000 in the current viewport.
In the attached project you can see the principle. When the checkbox is checked only a viewport with 1000 values is visible, but you can use the scrollbar to scroll through all data. In this state, the series gets the data from the internal chartsource (TListChartSource) and you thus are able to drag data points (CTRL+Left mouse button) (I restricted dragging to the y value only because I did not want to confuse by rearranging the original data array when the dragged value must be written back to the original data array. In this window mode, handling is very fast and fluent. On the other hand, when you uncheck the checkbox the series are connected to the UserdefinedChartSources to display all the data, and the program becomes slow again because millions of data points must be handled.