Bekanntlich fehlt in den ganz alten Delphi-Versionen die Property StrictDelimited. Diese trägt beim Zuweisen von .DelimitedText dafür Sorge, dass nicht jedes Leerzeichen ebenfalls als Delimiter betrachtet wird. Durch einen kleinen Trick erreicht man aber dies aber auch z.B. in einem Delphi 7, indem man das Leerzeichen vorher durch ein Zeichen ersetzt, was in einer CSV-Datei nicht vorkommen darf.

var
  tsl: TStringList;
  oneLine: String;
begin
  tsl := TStringList.Create;
  oneLine := '1;2  3;5;Achtzehn Uhr';
  try
    tsl.Delimiter := ';';
    // Replace all ' ' by a '#' before assigning it to .DelimitedText
    tsl.DelimitedText := StringReplace(oneLine, ' ', '#', [rfReplaceAll]);
    // Replace it back in the .Text property
    tsl.Text := StringReplace(tsl.Text, '#', ' ', [rfReplaceAll]);
    // ... now all columns are strictly delimited by ;
    // ... tsl[0] = '1', tsl[1]='2  3', tsl[2]='5', tsl[3]='Achtzehn Uhr'