検索終ったあとのINIへの書込み

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: 検索終ったあとのINIへの書込み

by 雷電 » 2006年12月30日(土) 21:43

できました。
最後まで教えていただき、ありがとうございました。

返信@yu0627

by yu0627 » 2006年12月30日(土) 20:36

 INIファイル関係の関数はどうやらINIファイルが入っているフォルダが存在していないと関数に失敗するようです。
ですので、以下のプログラムを組んでみてください。

1、GetFileAttributes関数でINIファイルを保存するフォルダがあるかどうか調べる。
2、もし存在しないなら(上の関数の戻り値が&HFFFFFFFF(-1))CreateDirectory関数でフォルダを作成する。

 では。

by 雷電 » 2006年12月30日(土) 17:20

上手くいきました。
検索したい文字列がなければInStr関数の戻り値が0になることと、始まりが1ということですね。
ありがとうございました。
今後も、宜しくお願いします。

あと、カレントディレクトリでiniを書き込む際、
".\test\findstr.ini"
とちゃんとできないのですが、どうやればフォルダの中に作ってやれるのでしょうか?

返信@yu0627

by yu0627 » 2006年12月30日(土) 15:06

 こうするとうまくいきませんか?

Re: あれれ??

by 7 » 2006年12月30日(土) 10:26

コード: 全て選択

If InStr(0, FindStringHistory, FindString) = -1 Then
InStr関数で文字列が見つからなかった場合の戻り値は0です。

by 雷電 » 2006年12月30日(土) 10:12

所得できていることをデバッグでつきとめました
FindString.Chars="test"
その後の処理に問題があるのではないかと見ています。

返信@yu0627

by yu0627 » 2006年12月30日(土) 00:36

そりゃ動きません(爆
コンボボックスで選択中の文字列はGetDlgItemText(Str)では取得できません。

もう遅いので(日付変わっちゃってるし)、プログラムはバイト終わってから書きます。
夕方になると思います。

あれれ??

by 雷電 » 2006年12月29日(金) 22:29

こうしたら、また動かなくなってしまった。
何ゆえ?

返信@yu0627

by yu0627 » 2006年12月29日(金) 21:57

 警告文を見るとAB5.0を利用されているようですね。
今までのプログラムをAB5.0のコンパイラに通してみたらかなりエラーが出るんです...○| ̄|_
すなわち今まで以上に型チェックなどが厳しくなっています。

今後とも頑張って下さい。

by 雷電 » 2006年12月29日(金) 21:42

コードの提供ありがとうございました。
早速、プログラムを少し、こちらの環境に合わせてやって見ました。

すると

コード: 全て選択

FindStr.sbp(57) - [警告] 一時オブジェクトの解放を行えません。キャスト用オブジェクトを用意してください。
というのが出ました。
しかし、コンパイルは一応終了して、問題なく動きました。

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

返信@yu0627

by yu0627 » 2006年12月29日(金) 18:59

とりあえずプログラムを組んでみました。
簡略化させるために検索したらすぐINIファイルに追加するようにしましたが、良かったでしょうか?
Yahoo!ブリーフケースから「プログラム名.zip」をダウンロードして、ファイルを解凍してください。
その中にあるプロジェクトファイルがそうです。
(諸事情によりURLは除去いたしました)
一部無駄な処理も入っていますが...。参考にどうぞ。

#久しぶりのString型だった...。

返信@yu0627

by yu0627 » 2006年12月29日(金) 18:25

INIファイルに書き込まれている項目の数を取得することができないと思うので自分は以下のようにしようと思います。
 う~ん。文が説明不足でした。
INIファイルの中に項目数を書き込んでいるんです...。
そして読み込み時にそれを読み込んで処理するということでした...。
僕に対して書いてるんでしょうか...?
イグトランスさんが考案された関数ですよ。
 いえ、雷電さんにです。
とりあえず関数をコピーしてきたので、使用します。

by 7 » 2006年12月29日(金) 18:13

INIファイルに書き込まれている項目の数を取得することができないと思うので自分は以下のようにしようと思います。

書き込む場合
  • 1.保存時にコンボボックスの項目(文字列)をすべて取得する
    2.項目(文字列)と項目(文字列)の間に特殊な文字を挿入し、複数の項目(文字列)を一つの文字列にしてしまう
    3.生成された文字列をINIファイルに書き込む
読み込む場合
  • 1.INIファイルから文字列を読み込む
    2.文字列の中の特殊な文字を判定して複数の文字列に分解する
    3.分解された複数の文字列(項目)をコンボボックスの項目として設定する
こんな感じでしょうか。

>  GetDlgItemTextStr関数は申し訳ありませんが使わない予定です...。
僕に対して書いてるんでしょうか...?
イグトランスさんが考案された関数ですよ。

返信@yu0627

by yu0627 » 2006年12月29日(金) 17:59

 すみません。
こちら側で前々にちょっと作ったプログラムを見たところそうでした。
EM_SETSEL、その時以来使っていなかったので多分忘れていました...。
そしてなぜか文字単位の指定というように記憶がなっていました...。
あと、InStrは本当に最初のほうしか使っていません。その後はmemicmpとかlstrcmpを使っています。

#とりあえずプログラムを書いています。
 GetDlgItemTextStr関数は申し訳ありませんが使わない予定です...。

Re: 返信@yu0627

by 7 » 2006年12月29日(金) 17:49

> これではもし英数字と日本語が検索文字列に混在する時に選択位置がずれてしまいます。
> 選択する位置の指定は文字単位なので1Byte文字(=英数字)と2Byte(=日本語)は同じ一文字として認識されます。
C++言語のサンプルコードでも以下のようになっています。

コード: 全て選択

SendMessage(hEdit,EM_SETSEL,dwPos,strlen(lpfr->lpstrFindWhat)+dwPos);
他のトピックで他の方も同じようなことを仰ってましたけど、その情報はどこに書いてあるんでしょう?
複数の方がそう思っているということはどこかにそう説いている物があると思うんですけど、特に見当たりません...。

EM_SETSELはたしかに「文字列の選択」という機能を持ってますが文字単位の計算ではないはずだと思います。GetWindowTextLength()関数などでも「あ」は2バイトと取得されますよね?
EM_SETSELだけ文字単位の計算なら、GetWindowTextLength()関数の戻り値やlstrlen()関数などで選択範囲を決めようとすると面倒なことになります。

WIN32APIの関数に使われる開始値はすべて(おそらく)0から始まる値であるのに、ActiveBasicのInStr関数が1から始まってしまってて、戻り値も+1されてるので勘違いする方が居ると思うんですよね...。

ページトップ