ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
雷電
記事: 104 登録日時: 2006年8月21日(月) 14:26
お住まい: 兵庫県
連絡する:
#1
投稿記事
by 雷電 » 2006年10月23日(月) 20:44
”検索&置き換えのウィンドウ”から引き続き質問ですが、InStr関数は戻り値を初めの文字から何文字目というものしか返しませんが、終わるときは何文字目かを取得するにはどうしたらいいでしょう?
例えば・・・
コード: 全て選択
Dim A As String
A="--RAIDEN--"
InStr(A,"RAIDEN")
こうした場合は、Rが始まる3文字目なので、3が返ってくるのですが、終わりのNを取得するにはどうしたらいいでしょう?
調べ方が悪いのかもしれませんが、そのような関数が見つかりません。
===============================
MyHomePage;; raiden.no.land.to/
===============================
Indigo Visualist
記事: 33 登録日時: 2006年5月22日(月) 21:01
お住まい: 山口
連絡する:
#2
投稿記事
by Indigo Visualist » 2006年10月23日(月) 23:06
「始めの文字の位置+キー文字列の長さ-1」ではいけませんか?
質問を勘違いしていたらすみません。
コード: 全て選択
Dim str As String, keystr As String
Dim pstart As Long, pend As Long
str="--RAIDEN--"
keystr="RAIDEN"
pstart=InStr(1,str,keystr)
pend=pstart+lstrlen(keystr)-1
雷電
記事: 104 登録日時: 2006年8月21日(月) 14:26
お住まい: 兵庫県
連絡する:
#3
投稿記事
by 雷電 » 2006年10月24日(火) 21:02
Indigo Visualistさんありがとうございます。
投稿してから、あれ?これって文字列の長さをたしたらいいだけだ・・・
と、おもってしまいました・・・
トピックを消してしまうと、いろんな人の意見が聞けなくなるので、一応残しておきました。
今回はどうもありがとうございました。
他に聞きたいことがあったらまたこのトピックで質問したいと思います。
===============================
MyHomePage;; raiden.no.land.to/
===============================
雷電
記事: 104 登録日時: 2006年8月21日(月) 14:26
お住まい: 兵庫県
連絡する:
#4
投稿記事
by 雷電 » 2006年10月24日(火) 21:44
初歩的な質問かもしれませんが、文字列を選択するには、どうすればいいでしょう?
EM_SETSELを使おうとしたのですが、できませんでした。
===============================
MyHomePage;; raiden.no.land.to/
===============================
7
記事: 473 登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:
#5
投稿記事
by 7 » 2006年10月24日(火) 21:54
> EM_SETSELを使おうとしたのですが、できませんでした。
EM_SETSEL の直後、SetFocus()関数でフォーカスを与えてみてください。
雷電
記事: 104 登録日時: 2006年8月21日(月) 14:26
お住まい: 兵庫県
連絡する:
#6
投稿記事
by 雷電 » 2006年10月24日(火) 22:10
コード: 全て選択
Sub FindStr_CommandButton1_Click()
Dim FindString As String
Dim buffer As String
Dim MOJISU As Long
Dim Num As Long
GetDlgItemTextStr(hMainWnd,EditBox1,buffer)
GetDlgItemTextStr(hFindStr,ComboBox1,FindString)
Num=InStr(1,buffer,FindString)
MOJISU = Num + lstrlen(FindString)-1
SendDlgItemMessage(hMainWnd,EditBox1,EM_SETSEL,Num,MOJISU)
SetFocus(GetDlgItem(hMainWnd,EditBox1))
End Sub
直後に入れてみましたが、やはりダメです
===============================
MyHomePage;; raiden.no.land.to/
===============================
7
記事: 473 登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:
#7
投稿記事
by 7 » 2006年10月24日(火) 22:24
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします] コード: 全て選択
Dim FindString As String
Dim buffer As String
Dim MOJISU As Long
Dim Num As Long
GetDlgItemTextStr(hMainWnd,EditBox1,buffer)
GetDlgItemTextStr(hFindStr,ComboBox1,FindString)
Num=InStr(1,buffer,FindString)-1
MOJISU = Num + Len(FindString)
SendDlgItemMessage(hMainWnd,EditBox1,EM_SETSEL,Num,MOJISU)
SetFocus(GetDlgItem(hMainWnd,EditBox1))
こうした場合はどうでしょう?
マティ
記事: 161 登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
連絡する:
#8
投稿記事
by マティ » 2006年10月24日(火) 22:33
7 さんに質問です
7さんのコード [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします] コード: 全て選択
Dim FindString As String
Dim buffer As String
Dim MOJISU As Long
Dim Num As Long
GetDlgItemTextStr(hMainWnd,EditBox1,buffer)
GetDlgItemTextStr(hFindStr,ComboBox1,FindString)
Num=InStr(1,buffer,FindString)-1
MOJISU = Num + Len(FindString)
SendDlgItemMessage(hMainWnd,EditBox1,EM_SETSEL,Num,MOJISU)
SetFocus(GetDlgItem(hMainWnd,EditBox1))
GetDlgItemTextStr ってバッファーを渡す必要があると思っていたのですが、
String型で使用する場合に、初期化を行わなくても大丈夫なのでしょうか?
余談、
SendDlgItemMessage で検索結果を表示するのはナイスアドバイスだと思います。
あとは、見つからなかった場合の処理も必要だと・・・
雷電さん、
InStr 関数の戻り値で判断できるので、がんばってみて下さい。
7
記事: 473 登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:
#9
投稿記事
by 7 » 2006年10月25日(水) 08:08
> GetDlgItemTextStr ってバッファーを渡す必要があると思っていたのですが、
> String型で使用する場合に、初期化を行わなくても大丈夫なのでしょうか?
GetDlgItemTextStr関数はたしかイグトランスさんが作った関数で、その辺りの処理、大丈夫だったはずです。
String型を渡す場合、初期化を必要とするのはたしかGetDlgItemText()関数ですね。
> 余談、SendDlgItemMessage で検索結果を表示するのはナイスアドバイスだと思います。
これは主要なコントロールのハンドルを取得しておいてSendMessage()関数を使った方が良いと思うんですけど、GetDlgItemTextStr関数に合わせてSendDlgItemMessage()関数にしてみました。
雷電
記事: 104 登録日時: 2006年8月21日(月) 14:26
お住まい: 兵庫県
連絡する:
#10
投稿記事
by 雷電 » 2006年10月25日(水) 22:48
やはり無理です・・・
コード: 全て選択
Num=InStr(1,buffer,FindString)-1
MOJISU = Num + Len(FindString)
この部分を改造なされたんでしょ?
こうすると、検索する元の文字列が、
"aaiiuueeoo"
だとして、iiを検索する場合、InStr関数は、3を返します。
そして、7さんのコードだと、最終的には2を返すんですね。
だから、EM_SETSELメッセージでセットするとなると2~4となってしまいます。
しかし、EM_SETSELってどうやって使うんでしょうか・・・
EM_のなかで一番理解しにくいメッセージです
===============================
MyHomePage;; raiden.no.land.to/
===============================
マティ
記事: 161 登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
連絡する:
#11
投稿記事
by マティ » 2006年10月25日(水) 23:18
極論ですが・・・
検索結果を表示したら・・・ってのが7さん の話でした。
私が話を難しくしてしまったのですが・・・
根本的には帰ってきた数値を補正すると、想定の機能を実現できると言いたかったのです。
説明不足で迷惑をかけた事をお詫びします。
7
記事: 473 登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:
#12
投稿記事
by 7 » 2006年10月26日(木) 08:08
> この部分を改造なされたんでしょ?
> こうすると、検索する元の文字列が、
> "aaiiuueeoo"
> だとして、iiを検索する場合、InStr関数は、3を返します。
> そして、7さんのコードだと、最終的には2を返すんですね。
> だから、EM_SETSELメッセージでセットするとなると2~4となってしまいます。
それで良いはずです。EM_SETSEL のwParam に渡すべき値は0から始まります。InStr関数の戻り値は1からなので、-1にしています。
SetFocus()関数でフォーカス与えれば反映されるはずなんですけど、なんででしょうね...。我が家では普通に選択されるんですけど。
エディットボックスの「常に選択を表示」にチェック入れるとどうなりますか?
雷電
記事: 104 登録日時: 2006年8月21日(月) 14:26
お住まい: 兵庫県
連絡する:
#13
投稿記事
by 雷電 » 2006年10月26日(木) 22:04
できました。
EditBox1の「常に選択を表示」にチェックしていませんでした。
7さん、コードは私の勘違いです・・・お許しください
今回はどうもありがとうございました。
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
このままだと、一番初めに検索された文字列しか表示されないので、Do Loopで検索しなおさないといけないんですね・・・
===============================
MyHomePage;; raiden.no.land.to/
===============================