Delphi-Quellcode:
Function TForm1.ParseAndCalc(
Const S:
String):
String;
Var SL: TStringList;
i: Integer;
Begin
SL := TStringList.Create;
Try
Try
SL.Add('
');
For i := 1
to Length(S)
do
Case S[i]
of
'
0'..'
9', '
,', '
.':
Begin
SL[SL.Count - 1] := SL[SL.Count - 1] + S[i];
End;
'
*', '
/', '
+', '
-':
Begin
If SL[SL.Count - 1] = '
'
Then Begin
// eine leere Zeile kommt vor, wenn mehrere Operatoren
// hintereinander liegen, z.B. bei '1*+2' bzw. '1 * +2'
SL.Delete(SL.Count - 1);
End;
SL.Add(S[i]);
SL.Add('
');
End;
'
': ;
// ignoriere Leerzeichen
Else Raise Exception.CreateFmt('
Ungültiges Zeichen "%s" gefunden.', [S[i]]);
End;
begin
begin
i:=0;
while i < SL.Count
do
begin
if SL[i]='
*'
then
begin
SL[i-1]:=(FloatToStr(StrToFloat(SL[i-1])*StrToFloat(SL[i+1])));
{Zahl vor und nach dem * werden multipliziert und in die Zeile der ersten Zahl geschrieben???}
SL.Delete(i);
{Jetzt soll die Zeile des Operators gelöscht werden}
SL.Delete(i+1);
{und die der zweiten Zahl}
{etwas wurde gefunden - fange von vorn an}
i := -1;
end
else
if SL[i]='
/'
then
begin
SL[i-1]:=(FloatToStr(StrToFloat(SL[i-1])/StrToFloat(SL[i+1])));
SL.Delete(i);
SL.Delete(i+1);
i := -1;
end
else
i := i + 1;
end;
i:=0;
while i < SL.Count
do
begin
if SL[i]='
+'
then
begin
SL[i-1]:=(FloatToStr(StrToFloat(SL[i-1])+StrToFloat(SL[i+1])));
{Zahl vor und nach dem * werden multipliziert und in die Zeile der ersten Zahl geschrieben???}
SL.Delete(i);
{Jetzt soll die Zeile des Operators gelöscht werden}
SL.Delete(i+1);
{und die der zweiten Zahl}
{etwas wurde gefunden - fange von vorn an}
i := -1;
end
else
if SL[i]='
-'
then
begin
SL[i-1]:=(FloatToStr(StrToFloat(SL[i-1])-StrToFloat(SL[i+1])));
SL.Delete(i);
SL.Delete(i+1);
i := -1;
end
else
i := i + 1;
end;
end;
end;
Finally
Result := '
';
For i := 0
to SL.Count - 1
do Result := Result + SL[i];
End;
Finally
SL.Free;
End;
End;
Hab das jetzt da stehen. Die erste Schleife kommt später noch, wird ja bei 1+2*3 nicht benötigt.
Ich klick auf = und krieg die Meldung: Der Index der Liste überschreitet das Maximum (2).
Vorher hatte ich immer die Meldung: Der Index der Liste überschreitet das Maximum(Anzahl der Zeilen der Stringlist)...