Kopiowanie kilku wierszy na raz z memo do memo

0

Mam taki temat związany z kopiowaniem danych z memo1 do memo2
Otóż w memo1 są dane jak poniżej:

01840
1537
2456
01841
1432
2672
......

Pierwsze trzy wiersze to komplet danych które chciałbym przekopiować za jednym razem - znacznikiem jest tu pierwsza kolumna - tzn. W jednym ruchu maja być przekopiowane wiersze dla których dane w pierwszej kolumnie rozpoczynaja się od 0 - tzn: 0, 1, 2 kolejne 0 oznacza początek kolejnej grupy do kopiowania, etc

0

Użyj pętli while, w której kopiuj trzy kolejne wiersze w każdym przebiegu i której iterator inkrementuj o 3 (na końcu pętli). while nie repeat, w razie gdyby kontrolka nie zawierała żadnych danych – wyjątek nie poleci. Przed kopiowaniem sprawdź, czy liczba linii jest podzielna przez 3.

W czym problem?

0

OK ,dzieki sprawdzę to dla własnej edukacji, ale bardziej zależy mi na rozwiązaniu jak je opisałem tez. wykrywaniu 0 w pierwszej kolumnie i kopiowaniu wierszy od 0 do kolejnego 0, a to na wypadek jakby między zerami była inna ilość wierszy.
Jakiś pomysł na to?

0
Lolek50 napisał(a):

Jakiś pomysł na to?

Dwie zagnieżdżone pętle – jedna (główna) szuka wiersza z 0, a druga (zagnieżdżona) umożliwia iterowanie po wierszach od tego rozpoczynającego się na 0 aż do napotkania kolejnego z 0 lub końca listy.

W pseudokodzie pisanym z głowy:

var
  LineIndex: Integer = 0;
begin
  // dopóki indeks linii jest prawidłowy
  while LineIndex < Memo.Lines.Count do
    // jeśli linia zaczyna się od '0'
    if Memo.Lines[LineIndex].StartsWith('0') then
    repeat
      // kopiowanie grupy od '0' do kolejnego '0' lub końca listy
      Memo2.Lines.Add(Memo.Lines[LineIndex]);
      LineIndex += 1;
    until (LineIndex = Memo.Lines.Count) or Memo.Lines[LineIndex].StartsWith('0')
    else
      // pominięcie pustej lub nieprawidłowej linii
      LineIndex += 1;
0

Dzięki za podpowiedz, jak rozumiem += to inc

Jeśli tak jest a nie jest to inny zamysł, to nie do końca dział to tak jak chciałem bo nadal kopiowanie odbywa się linia po linii a nie wszystkie wiersze począwszy od pierwszego 0 do kolejnego 0.

1

Nie da się skopiować kilku wierszy na raz, bo zawartość komponentu to lista, która podzielona jest na linie. Jednorazowo możesz odczytać jedną linię, a więc jedną możesz dodać do innej listy. Tak więc kopiowanie kilku wierszy należy wykonać ręcznie, linia po linii, w pętli – jak pokazałem.

0

OK, dzięki za wyjaśnienie

0

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ń.

1 użytkowników online, w tym zalogowanych: 0, gości: 1