Thanks Alex, this is very helpful.
The only problem I see is that the timing for each stroke is exactly the same. For example, if I am drawing a lower case i, the dot on top will take just as long to reveal as the line beneath it. For what I am using it for thought, I don’t think it will be noticeable. Here is the expressions incase anyone else is interested.
//Add an expression slider on the shape layer called "Percent"
//Add this Expression for every trim paths 'End'.
pathIndex = thisProperty.propertyGroup(3).propertyIndex;
totalPaths = content.numProperties;
trimPercent = effect("Percent")("Slider");
(effect("Percent")("Slider")*totalPaths) - ((pathIndex-1)*100);
//Add this Expression to the position of the object following the path.
totalPercent = thisComp.layer("Lines").effect("Percent")("Slider");
shapeLayer = thisComp.layer("Lines");
totalPaths = shapeLayer.content.numProperties;
currentPathIndex = Math.ceil(totalPercent*(totalPaths/100));
if((currentPathIndex == 0) || (currentPathIndex > totalPaths)){
[-1000,-1000];//position when totalPercent is 0 or 100.
}else{
currentPath = shapeLayer.content(currentPathIndex).content(1).path
currentPathOffset = shapeLayer.content(currentPathIndex).transform.position
pathPercent = (totalPercent*totalPaths) - (currentPathIndex*100) + 100;
currentPath.pointOnPath(pathPercent/100,time) + currentPathOffset;
}