Я бы здесь вообще не делал бы внешний цикл (тот который проходится по номерам классов). Просто проходишься одним циклом по строкам грида, вынимаешь из строки число и добавляешь в дерево в соответствующую категорию, а если не получилось вынуть число из строки - добавляешь в группу "Другие классы".
Осталось только написать функцию, которая пытается вынуть из начала строки число. Вот она:
Код:
function TryGetInt(const Str: String; out Int: Integer): Boolean;
var
i: Integer;
begin
i := 1;
while (i <= Length(Str)) and (Str[i] in ['0'..'9']) do Inc(i);
Result := TryStrToInt(Copy(Str, 1, i - 1), Int);
end;