5

使用できる文字は、A から Z、a から z、0 から 9 です。システムは入力への応答に時間がかかるため、最小限のコードまたは単一の関数が最適です。

4

4 に答える 4

11

私があなたを正しく理解していれば、次のような関数を使用できます。

function StripNonAlphaNumeric(const AValue: string): string;
var
  SrcPtr, DestPtr: PChar;
begin
  SrcPtr := PChar(AValue);
  SetLength(Result, Length(AValue));
  DestPtr := PChar(Result);
  while SrcPtr[0] <> #0 do begin
    if SrcPtr[0] in ['a'..'z', 'A'..'Z', '0'..'9'] then begin
      DestPtr[0] := SrcPtr[0];
      Inc(DestPtr);
    end;
    Inc(SrcPtr);
  end;
  SetLength(Result, DestPtr - PChar(Result));
end;

これはPChar最高速度で使用されます (可読性が低下します)。

編集:DestPtr[0]の代わりに使用することに関する gabr のコメントを再確認してDestPtr^ください: これはとにかく同じバイトにコンパイルする必要がありますが、同様のコードに優れたアプリケーションがあり、先を見る必要があります。改行を置き換えたいとしたら、次のようなことができます

function ReplaceNewlines(const AValue: string): string;
var
  SrcPtr, DestPtr: PChar;
begin
  SrcPtr := PChar(AValue);
  SetLength(Result, Length(AValue));
  DestPtr := PChar(Result);
  while SrcPtr[0] <> #0 do begin
    if (SrcPtr[0] = #13) and (SrcPtr[1] = #10) then begin
      DestPtr[0] := '\';
      DestPtr[1] := 't';
      Inc(SrcPtr);
      Inc(DestPtr);
    end else
      DestPtr[0] := SrcPtr[0];
    Inc(SrcPtr);
    Inc(DestPtr);
  end;
  SetLength(Result, DestPtr - PChar(Result));
end;

したがって、通常は使用しません^

于 2009-02-22T10:05:12.613 に答える
9
uses JclStrings;

  S := StrKeepChars('mystring', ['A'..'Z', 'a'..'z', '0'..'9']);
于 2009-06-08T20:38:06.267 に答える
3

一言だけ補足します。

セットを使用したソリューションは、Delphi 7 では問題ありませんが、Delphi 2009 では、セットを char にすることができないため(ansichar に変換されるため)、いくつかの問題が発生する可能性があります。

使用できるソリューションは次のとおりです。

case key of 
  'A'..'Z', 'a'..'z', '0'..'9' : begin end; // No action
else
  Key := #0;
end;

しかし、もちろん、最も用途の広い方法は次のとおりです。

if not ValidChar(key) then
  Key := #0;

その場合、ValidChar を複数の場所で使用できます。変更する必要がある場合は、一度変更するだけで済みます。

于 2009-02-22T10:01:39.063 に答える
0

OnKeypressイベント

そうでない場合は開始(['A' ..'Z'、'a' ..'z'、 '0' .. '9']のキー)then Key:=#0; 終わり;

于 2009-02-22T09:20:57.697 に答える