2011-12-26 5 views
0

TStringListに特定のシンボルが含まれているかどうかを確認するにはどうすればよいですか?私は、次のいずれかが文字列リストで発見された場合にメッセージを表示したいTStringListに特定のシンボルが含まれているかどうかを確認しますか?

\ /:*? 「<> |のような

何か:

var 
    SL: TStringList; 
    i: Integer; 
begin 
    SL := TStringList.Create; 
    try 
    for i := 0 to SL.Count -1 do 
    begin 
     if SL.Strings[i] ?? then 
     begin 
     MessageDlg('Stringlist contains bad characters', mtError, [mbOK], 0); 
     end else 
     begin 
     // no bad characters 
     end; 
    end; 
    finally 
    SL.Free; 
    end; 
end; 

答えて

1

あなたは、文字列が特定の文字が含まれているかどうかをテストするために、POS()関数を使用することができます。そして、SL.Textは、1つの文字列内のすべての文字列である。

など

+0

これはすばらしいおかげです。とても簡単です:) –

+0

チェックする文字の数に応じてチェックする最後の文字のみが表示される場合はかなり遅くなる可能性があります.Posは、チェックしたい先行するすべての文字についてすべてのテキストを繰り返し処理する必要があります。 @マーティン・ジェイムズの答えは、テキストを1回だけ繰り返すので、その場合の方がパフォーマンスが向上します。 –

1
const 
    ForbiddenChars = ['\','/',':','*','?','"','<','>','|']; 
var 
    SL: TStringList; 
    StrTemp: String; 
    i,j: Integer; 
begin 
    SL := TStringList.Create; 
    try 
    for i := 0 to SL.Count - 1 do 
    begin 
     StrTemp := SL.Strings[i]; 
     for j := 1 to Length(StrTemp) do 
     begin 
     if StrTemp[j] in ForbiddenChars then 
     begin 
      MessageDlg('Stringlist contains bad characters', mtError, [mbOK], 0); 
     end; 
     end; 
    end; 
    finally 
    SL.Free; 
    end; 
end; 

それとも、無料パスカルを使用する場合はStrUtils.PosSet(ForbiddenChars,SL.Strings[i])単純に使用することができますが、私はこの機能はまた、Delphiで存在しているかどうかわからない

+0

私は、PosSet関数を見ていきます。おかげで、セットから悪い文字を見つけやすくなりました。編集:私はあなたがFreePascalを言った気づいたことはありません、私はDelphi StrUtilsでPosSetを見つけることができません。ロバーツの答えはとにかく完璧に動作します:) –

2

pos()関数を使用して、TStringList.Textプロパティの各シンボルを検索します。または、TStringList.Textプロパティの文字を入れて、それらが不正な文字のセットに含まれているかどうかを確認します。 2番目の方法はおそらく速いでしょう:

Function Tsomething.CheckList(list:TStringList;badChars:set of char):boolean; 
var charIndex:integer; 
    thisChar:char; 
begin 
    result:=false; // in case of empty list 
    for charIndex:=1 to length(list.text) do // indices into a string start at 1 
    begin 
    thisChar:=list.text[charIndex]; 
    result:=thisChar in badChars; 
    if result then exit; 
    end; 
end; 
.. 
    if CheckList(myList,['\','/',':','*','?','"','<','>','|']) then application.messageBox(blah); 

しかし、両方を試してみてください。

+0

チェックする各文字のテキストを反復処理しないための+1。 –

+0

私は自分自身に-1を働かせない関数を与えるべきです:)文字列プロパティインデックスは0ではなく1から始まるので、ループは1からlength(list.text)まで動くべきです。私の悪い、このエラーはすぐに見つかりました。 –

+0

。私はそれを見つけませんでした...しかし、あなたはまだあなたの答えを編集していませんでしたか?とにかく、私はあなたのためにそうしました。だからあなたはサポート電子メールを受け取ってくれません:...-) –

関連する問題