Pos関数とCopy関数を使うと、InStr関数を作ることはできますが、
Copyを多用すると時間がかかります。
Copyを使わずに、作る方法はありませんか。
かつて 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;
ありがとうございました。
今夜、確認してみます。
あの・・・(恐る恐る)
http://www.wwlnk.com/boheme/delphi/vbtodel/daf0390.html
Delhi Acid Floorによると、
InstrとPosはほぼ同じだそうです。
外していたらゴメンナサイ
> InstrとPosはほぼ同じだそうです。
そうですね。でも質問者の方は、そうは思っていないし、AcidFloor の方も
「Pos関数は検索開始位置がありません。」と書いてあるように、まったく
同じではありません。検索開始位置を指定できることが違うし、これは
かなり大きな違いです。
なるほど。
検索開始位置を指定できないと、下向きに全検索とかが出来ませんね。
その場合、copyすれば簡単に実装できるけど、標題の問題になるわけですね。
読みが浅くて申し訳ありません。
今、Posの代わりにInStrを1ヶ所だけ使ってみましたが、
正常に作動しました。
4MBiteの文字列を分析しますので、Copyを使うと結構時間がかかるのです。
VBで作ると、InStrが使えますので、1/4くらいの時間しかかかりません。
本当に、ありがとうございました。
ツイート | ![]() |