Schöne kleine Aufgabe:
Erstmal kannst du ja mit POS(SubString, String) herausbekommen, ob SubString in String vorkommt und wo.
Dann folgendes:
Du gehst in A alle Zeilen durch und prüftst für jede Zeile, ob die korrespondierende Zeile aus B darin vorkommt.
"Korrespondierende" ist das Zauberwort. Hier ist ein Billig-Langsam-und-Teuer-Ansatz:
Delphi-Quellcode:
For i:=0 To A.Count - B.Count do
If Matches (A,i,B) Then Showmessage (Format ('B wurde ab Zeile %d gefunden',[i]));
wobei die Funktion Matches so definiert ist:
Delphi-Quellcode:
Function Matches (aSrc : TstringList; aStartIndex : Integer; aPattern : TStringList) : Boolean;
Var
i : Integer;
Begin
Result := False; // Erstmal gehen wir davon aus das es nicht passt
For i:=0 To aPattern.Count - 1 do // für jede Zeile in B (unser Pattern)
If aStartIndex + i < aSrc.Count Then // passt das überhaupt noch in A ?
If Pos (aPattern[i], aSrc[aStartIndex + i])<>1 Then // fängt die Zeile mit B[i] an?
Exit // nein, also raus
Else
Else
Exit; // Kann eigentlich nicht passieren, aber sicher ist sicher
Result := True; // Wenn wir hier sind, haben wir eine Übereinstimmung
End;
Was ich hier gemacht habe, nennt sich 'stepwise refinement', also schrittweise Verfeinerung. Der erste Ansatz ist klar: Ich zähle alle Infrage kommenden Zeilen durch, ob B an dieser Stelle passt ('Matches').
Die Funktion Matches prüft dann nur noch, ob ab einer Position 'StartIndex' alle folgenden Zeilen mit B übereinstimmen.
Das Verfahren ist leider sehr langsam. Mit ein bischen Überlegung kann man das noch schneller machen. Aber wenn's so reicht...