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

解決


アルファ  2004-04-08 13:26:17  No: 8273

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


jok  2004-04-08 14:31:44  No: 8274

かつて 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

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

今夜、確認してみます。


ウォレス  2004-04-08 23:30:02  No: 8276

あの・・・(恐る恐る)

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

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


つっか  2004-04-09 01:06:45  No: 8277

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

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


ウォレス  2004-04-09 05:07:55  No: 8278

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

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


アルファ7  2004-04-09 06:05:47  No: 8279

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

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加