Here is an example with probably does what you want to achieve. Adjust the parameters to fit your needs.
I used a timer to generate random y values at 250 ms intervals. Whenever the timer fires (i.e. a new data point "arrives") the method AddDataPoint is called with the the elapsed time and the new y value as parameters; the elapsed time is passed as a TDateTime, i.e. is counted in days. AddDataPoint adds the new data to the series' chartsource (by calling AddXY). It also queries the current extent from the series (LineSeries.Extent) which returns the smallest and largest x values in the a and b elements, i.e. ext.b.x - ext.a.x is the current range of times accumulated. When this range exceeds a given value (MAX_VIEWPORT, which is in secounds and thus must be divided by SECONDS_PER_DAY to be counted in days like the x values) all data points outside are deleted.
Since x values are given in day units a TDateTimeIntervalChartSource was added to the form and linked to the Marks.Source of the chart's BottomAxis; after setting Marks.Style to smsLabel the x values will automatically be converted to a convenient format, i.e. 'n:ss' for sort intervals, later hours will be added ('h:n:ss'), etc. (I am expecting a problem when the interval is longer than a day because then days will be added, but this will be calendar days! - Ask again if this should become a problem).
You may also want to set "SuppressPrevUnit" of the DataTimeIntervalChartSource to false to see all parts of the time labels.
In order to avoid the jittering display before the MAX_VIEWPORT is filled, I am forcing the chart's extent to this range (set Chart.Extent). This restriction is released once the data range is wider than the MAX_VIEWPORT so that the labels scroll with data arriving.