VBのInStr関数をdelphiで作るには

解決


アルファ  2004-04-08 13:26:17  No: 8273  IP: [192.*.*.*]

Pos関数とCopy関数を使うと、InStr関数を作ることはできますが、
Copyを多用すると時間がかかります。
Copyを使わずに、作る方法はありませんか。

編集    削除
jok  2004-04-08 14:31:44  No: 8274  IP: [192.*.*.*]

かつて VB のユーザでしたが忘れてしまったので

http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/vb_k06.htm

の InStr() の例を参考にしてつくりました。

AnsiStrPos() を使うとコピーをしなくてすみます。

function InStr(StartPos:integer;const Str, SubStr:string):integer ;overload;
var
  pStr,p:PChar;
begin
  pStr := PChar(Str);
  p := AnsiStrPos(PChar(pStr+StartPos-1),PChar(SubStr));
  if p = nil then
    result := 0
  else
    result := p-pStr+1;
end;

function InStr(const Str, SubStr:string):integer ;overload;
begin
  result := InStr(1,Str,SubStr);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := IntToStr(InStr('abcdefdefdef', 'def'));
  Label2.Caption := IntToStr(InStr(5, 'abcdefdefdef', 'def'));
end;

編集    削除
アルファ  2004-04-08 15:58:45  No: 8275  IP: [192.*.*.*]

ありがとうございました。

今夜、確認してみます。

編集    削除
ウォレス  2004-04-08 23:30:02  No: 8276  IP: [192.*.*.*]

あの・・・(恐る恐る)

http://www.wwlnk.com/boheme/delphi/vbtodel/daf0390.html
Delhi Acid Floorによると、
InstrとPosはほぼ同じだそうです。

外していたらゴメンナサイ

編集    削除
つっか  2004-04-09 01:06:45  No: 8277  IP: [192.*.*.*]

> InstrとPosはほぼ同じだそうです。

そうですね。でも質問者の方は、そうは思っていないし、AcidFloor の方も
「Pos関数は検索開始位置がありません。」と書いてあるように、まったく
同じではありません。検索開始位置を指定できることが違うし、これは
かなり大きな違いです。

編集    削除
ウォレス  2004-04-09 05:07:55  No: 8278  IP: [192.*.*.*]

なるほど。
検索開始位置を指定できないと、下向きに全検索とかが出来ませんね。
その場合、copyすれば簡単に実装できるけど、標題の問題になるわけですね。

読みが浅くて申し訳ありません。

編集    削除
アルファ7  2004-04-09 06:05:47  No: 8279  IP: [192.*.*.*]

今、Posの代わりにInStrを1ヶ所だけ使ってみましたが、
正常に作動しました。

4MBiteの文字列を分析しますので、Copyを使うと結構時間がかかるのです。
VBで作ると、InStrが使えますので、1/4くらいの時間しかかかりません。

本当に、ありがとうございました。

編集    削除