Einzelnen Beitrag anzeigen

choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#2

Re: String nach Wort durchsuchen

  Alt 14. Jan 2004, 14:13
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);
gruß, choose
  Mit Zitat antworten Zitat