Podane rozwiązanie zadziała. Jest to niejawny parser. Ja bym go troszkę bardziej sformalizował, jeśli bloki mają się zaczynać zawsze od 0 ..1...2...0... Narysował bym sobie diagram stanów, nazwał je (odczyt bloku 0, odczyt bloku1, odczyt bloku 2, start, stop, błąd), oraz zaprojektował tranzycje między stanami (ob0->ob1->ob2->ob0; <start>->ob0; ob2->stop; <jakikolwiek>-><błąd>). Zrobił bym jakiegoś enuma, nadał stan początkowy i w pętli odczytującej dane z memo, użył bym instrukcji case do reakcji w danym stanie na odpowiedni blok. Kontrolę przejścia do kolejnego stanu i obróbkę danych zaszyć trzeba w odpowiednich wariantach case.... albo ... zamiast enuma ze stanem zrobić klasę, która będzie przyjmować dany stan i mieć procedurę przejścia do kolejnego TParser.NextState(AState : TState), która będzie pilnować, czy możemy przejść do konkretnego stanu (rozumiem, że nie może być po 0 odczytane 2 bo pomijamy 1 i to błąd). Z kolei można zrobić procedurę, która będzie przerabiać dany string jakoś potem np. TParser.ProcessInCurrentState(AIn : string); No zależy tak naprawdę, czy zależy nam na pilnowaniu formatu pliku, czy nie. Jeśli ma być to użyte raz i zapomniane to kod wyżej zaproponowany jest spoko (poza brakiem bloków begin...end). Jeśli chcemy się pobawić, zrobić parser bardziej uniwersalny, łatwy w rozbudowie kiedy format się zmieni to może warto zaimplementować taki stanowy parser. Często w przemyśle się takiego czegoś używa np. do parsowania komend z komunikacji np. odczyt rs232 po UART, czy odczyt już wyższego protokołów zbudowanych na ramkach rs232, np. komend drukarki fiskalnej, terminala, magazynu automatycznego etc. Warto poznać takie podejście. Generalnie wzorzec maszyny stanowej ma wiele zastosowań.