Hallo devnull,
ich habe mir Deine Funktion nur bis zu den ersten vier Zeilen angesehen, sorry.
Zunächst einmal solltest Du bei Parametern, die Du als groß empfindest und innerhalb von Routinen keine Änderung an ihnen vornimmst, das Schlüsselwort
const verwenden (Strings bilden hier zwar bedingt eine Ausnahme, es schadet aber auch dort nicht).
Dann reicht ein
UpperCase nicht aus, um die Groß-/Kleinschreibung zu ignorieren, weil Umlaute von ihr nicht betrachtet werden.
Darüber hinaus gibt es bereits die Funktion
Pos die einen Teilstring in einem anderen sucht. Statt nun
Pos(AnsiUpperCase(AString), AnsiUpperCase(ASubString))
als eigentlichen Vergleich zu verwenden, bietet sich die Routine
AnsiContainsText aus
StrUtils an.
Die Lösung Deines Problems könnte also wie folgt vereinfacht lauten:
Delphi-Quellcode:
function ASuitableName(const AString, AnotherString: string): Boolean;
begin
Result:= AnsiContainsText(AString, AnotherString) or
AnsiContainsText(AnotherString, AString);
end;
Die Fallunterscheidung nach der Länge wird ohnehin innerhalb von
AnsiContainsText vorgenommen...
Für die Unterscheidung ob CaseInsensitiv oder CaseSensitiv bietet sich ein zusätzlicher (optionaler) Parameter an, damit Du die Funktion auch in anderen Projekten verwenden kannst, also zB
Delphi-Quellcode:
function ASuitableName(const AString, AnotherString: string;
const ACaseSensitiv: Boolean=True): Boolean;
begin
if ACaseSensitiv then
Result:= AnsiContainsStr(AString, AnotherString) or
AnsiContainsStr(AnotherString, AString)
else
Result:= AnsiContainsText(AString, AnotherString) or
AnsiContainsText(AnotherString, AString)
end;
bzw wenn Du zunächst zwei separate Funktionen
ASuitableNameStr und
ASuitableNameText erstellst, die case-sensitiv bzw. case-insensitiv sind, sogar nocht etwas übersichtlicher in der Form
Delphi-Quellcode:
function ASuitableName(const AString, AnotherString: string;
const ACaseSensitiv: Boolean=True): Boolean;
begin
if ACaseSensitiv then
Result:= ASuitableNameStr(AString, AnotherString)
else
Result:= ASuitableNameText(AString, AnotherString)
end;
Aufgerufen werden kann die Funktion dann zB in der Form
Result:= ASuitableName('abcde', 'cd');
bzw
Result:= ASuitableName('CD', 'aBcDeF', False);