Hallo Alex,
Ein Alternativ-Vorschlag:
Folgende Routine liefert mir den ersten Teilstring bis zu einem Trenner, oder den ganzen String, wenn es kein Trenner mehr gibt. Gleichzeitig wird der String um den ersten Teilstring verkürzt.
Delphi-Quellcode:
Funtion ExtractString (Var aString : String; Const aDelimiter : String) : String;
Var
P : Integer;
Begin
P := Pos(aDelimiter, aString);
If P=0 Then Begin
Result := Trim (aString);
aString := '';
End
Else Begin
Result := Trim (Copy (1, p-1));
aString := Trim (Copy (aString, p+Length(aDelimiter), MaxInt));
End
End;
(*
s := '12;345';
t := ExtractString(s,';'); // Liefert t<-'12' und s<-'345'
t := ExtractString(s,';'); // Liefert t<-'345' und s<-''
*)
Nun kann ich die Eingabe also Stück für Stück abarbeiten. O.g. Funktion verwende ich in fast jedem Programm irgendwo, sie ist ungeheuer praktisch.
Delphi-Quellcode:
Type
TBooleanDynArray =
Array Of Boolean;
...
Procedure CreatePageNumbers (aPageNumberDesc :
String;
Var aPagesToPrint : TBooleanDynArray);
Var
pageDesc,
rangeStart :
String;
pagenumber, p, q : Integer;
Begin
If aPageNumberDesc = '
'
Then // Initialisieren: Wenn Beschreibung leer ist,...
For p := Low(aPagesToPrint)
To High (aPagesToPrint)
Do // ...dann sollen alle Seiten gedruckt werden
aPagesToPrint[p] := True
else // Sonst sollen erstmal keine Seite gedruckt werden
For p := Low(aPagesToPrint)
To High (aPagesToPrint)
Do
aPagesToPrint[p] := False;
While aPageNumberDesc<>'
'
do Begin // Solange noch etwas in der Seitenangabe drin steht
pageDesc := ExtractString (aPageNumberDesc,'
;');
// Nächsten Teilstring holen
If TryStrToInt (pageDesc, pagenumber)
Then // Teilstring = einzelne Zahl => Zur Liste hinzufügen
aPagesToPrint[pageNumber] := True
else Begin
rangeStart := ExtractString (pageDesc,'
-');
// 1.Teil von <Seite> - <Seite>
If TryStrToInt (pageDesc,q)
And TryStrToInt (rangeStart,p)
Then // Prüfen, ob zwei Nummern vorhanden sind
For pageNumber := p
to q
Do // Ja, also alle Zahlen in die Liste hinzufügen
aPagesToPrint[pageNumber] := True
Else // Keine gültige Bereichsangabe
Raise Exception.Create('
Ungültige Angabe');
// Exception und Ende
End
End
End;
Wie Du siehst, habe ich die Funktion vollständig vom Programm und ihren Strukturen getrennt. Damit ist diese Funktion allgemeingültig und kann in jedem Projekt unmittelbar wiederverwendet werden. Durch die Verlagerung der Problemlösung 'Teilstring extrahieren' ist die Routine auch lesbarer, finde ich.
P.S.: Die Prüfung, ob bei einer Bereichsangabe 'a-b' der Wert a < b ist, habe ich mir erspart, das kannst Du gerne noch implementieren.