Hab ich mir mal angeschaut.
Das ganze wurde m.E. eher suboptimal umgesetzt.
NonAlpha-Zeichen werden in die Berechnung eingeschlossen, mit verwirrenden Ergebnissen.
Beispiel : Die Eingabe "." (Dezimalpunkt) führt zu einer Summe von 4294967278.
Nun kann man der Auffassung sein, es sei Sache des Anwenders, nur solche Zeichen einzugeben, die auch berechnet werden sollen, aber dann müsste man auch der Auffassung sein, dass z.B. Blanks nicht entfernt werden müssen.
Also : Wenn schon "Fehleingaben" erkannt werden, dann bitte konsequent.
Die mit der Ermittlung der Summe verbundenen Aktionen
- Blanks entfernen
- In UpperCase wandeln
- Umlaute entfernen (7 Mal das bummelige StringReplace)
sind alle höchst überflüssig, wenn man die Berechnung etwas besser gestaltet.
Wenn ich die Option "A=1" oder "A=26" klicke, dann erwarte ich, dass die aktuelle Eingabe neu bewertet wird.
Nun ja, ich will nicht nur meckern.
Deshalb nachstehend eine verbesserte Prozedur "Calc", die alle anderen Prozeduren in der
Unit überflüssig macht und deutlich schneller arbeitet, wobei letzteres hier wohl irrelevant ist.
(Hoffentlich habe ich nichts übersehen).
Delphi-Quellcode:
PROCEDURE TGeoToolsWords.Calc(A1:boolean=true);
var n:integer; sum,digsum,corr:cardinal; s:AnsiString; p:PAnsiChar;
PROCEDURE Add(Value:AnsiChar);
overload;
begin
inc(n);
s[n]:=Value;
inc(sum,Ord(Value));
end;
PROCEDURE Add(Value1,Value2:AnsiChar);
overload;
begin
Add(Value1);
Add(Value2);
end;
begin
sum:=0;
if FInputWord<>'
'
then begin
SetLength(s,Length(FInputWord)*2);
p:=PAnsiChar(FInputWord);
n:=0;
repeat
case p^
of
'
A'..'
Z' : Add(p^);
'
a'..'
z' : Add(AnsiChar(Ord(p^)-Ord('
a')+Ord('
A')));
'
Ä','
ä' : Add('
A','
E');
'
Ö','
ö' : Add('
O','
E');
'
Ü','
ü' : Add('
U','
E');
'
ß' : Add('
S','
S');
end;
inc(p);
until p^=#0;
FInputWord:=Copy(s,1,n);
dec(sum,n*(Ord('
A')-1));
if not A1
then sum:=n*27-sum;
end;
FSumLetters:=sum;
digsum:=0;
while sum>0
do begin
inc(digsum,sum
mod 10);
sum:=sum
div 10;
end;
FCrossSum:=digsum;
end;