複数行のテキストボックスから指定行のテキストを取得するには?


sato  2003-02-19 19:59:07  No: 77154  IP: [192.*.*.*]

複数行のテキストボックスから指定の行の文字列を"EM_GETLINE"をテキストボックスにSendMessageすることで取得しています。
開発時は問題なく取得できていたのですが、他のマシンにインストールして実行してみたところ文字列があるのにも関わらず長さ0で返ってきてしまいます。
(長さが稀に返ってくることがあるのですが、2バイトコード文字はまったく返ってこないようです。)
また、総行数をEM_GETLINECOUNTメッセージで取得しているのですが、これは正常に取得できています。
セットアップはディストリビューションウィザードで作成しました。
マシンは開発、インストール先 共に Win2000 SP2 です。

何か情報をお持ちの方がいらっしゃいましたら、よろしくお願いします。

編集 削除
VBレスキュ-(花ちゃん)  URL  2003-02-21 22:13:54  No: 77155  IP: [192.*.*.*]

下記を試して見て下さい。

  http://www.bcap.co.jp/hanafusa/VBHLP/Apointrow.htm

編集 削除
sato  2003-02-24 15:11:29  No: 77156  IP: [192.*.*.*]

ありがとうございます。
試してみたのですが、うまく取得できる場合と取得できない場合があるようです。
その後開発環境でも取得できないことがありました。
(2バイトコードだからとかいうことも関係ないようです。)
根が深そうです。。。。

編集 削除
VBレスキュ-(花ちゃん)  2003-02-24 20:52:47  No: 77157  IP: [192.*.*.*]

ひょっとしてRichTextBoxに表示していませんか?

編集 削除
sato  2003-02-25 14:29:07  No: 77158  IP: [192.*.*.*]

いえ、TextBoxです。
単一フォームのプログラムでは比較的うまく取得できるようなのですが、
MDIでかつサブクラス化したりとちょっと複雑なプログラムになると
取得できない確率は上がるようです。。。
メッセージのハンドリングに問題があるのではないかと思っていますが、
原因は未だ不明です。
ただ、単一フォームでサブクラス化していないプログラムでも100%取得
できるというわけでも無いようなので。。。
何台かのマシンで試してみたのですが、結果は同じです。

編集 削除
VBレスキュ-(花ちゃん)  URL  2003-02-25 16:12:51  No: 77159  IP: [192.*.*.*]

それぐらいのサイズでしたら
FileSystemObject オブジェクトの TextStream オブジェクトを使って
ReadLine / SkipLine メソッドを使用すれば指定行が読み取りできますので
一度そちらを試されたらいかがでしょうか?

編集 削除
sato  2003-02-27 16:00:33  No: 77160  IP: [192.*.*.*]

テキストボックスの内容を丸ごと保存して、読み取るということでしょうか?
テキストボックスのワードラップされた状態での行単位の文字列を取得したいので、ReadLineでは改行までを一行としてしまいます。

見えている状態を取得したいのですが。
何かよい方法はありませんでしょうか?

ちなみに テキストボックスのソフト改行文字を設定する "EM_FMTLINES" というメッセージも試してみたのですが、これも できたりできなかったりとなぜか不安定です。。。

編集 削除
とおりすがり  2003-02-27 16:52:19  No: 77161  IP: [192.*.*.*]

ところで、改行コードまでの情報を取得するのにわざわざAPIを使用する必要があるのですか?
VB標準関数の「InStr」や「Replace」という便利な機能があると思うのですが…
もし、標準関数を使っても良いのであれば、サンプルとしてテーブル定義作成ツールというソフトを作成したので、参考にしてください。
http://www.takonet.co.jp/~pegasus/

編集 削除
sato  2003-02-27 17:15:07  No: 77162  IP: [192.*.*.*]

いえ、改行コードまでの情報を取得したいわけではありません。

複数行のテキストボックスに文字を入力していくとテキストボックスの幅まで入力すると単語の途中で切れてしまわないようにワードラップがかかります。
見た目では改行されますが、改行コードが入っているわけではありません。よってテキストボックスのTextプロパティを参照しても、見た目上どこで改行されたのかは判断できないのです。

そこで、EM_GETLINE を送信することで改行までではなく、見た目上の一行分の文字列を取得しようとしていたのです。ところが、この方法ではうまく取得できたりできなかったりと不安定な動きなので困っているのです。
何かよい方法はないでしょうか?

編集 削除
とおりすがり  2003-02-27 17:35:32  No: 77163  IP: [192.*.*.*]

案外、SendMessageのパラメータがおかしい…って事は無いですか?
例えば、「hWnd」が何らかの理由で正しく取得できていないとか・・・

編集 削除
魔界の仮面弁士  2003-02-27 22:26:32  No: 77164  IP: [192.*.*.*]

「うまく取得出来なかった時」には、SendMessageの戻り値および
Err.LastDllErrorの値として、それぞれ何が返されていますか?

編集 削除
Say  2003-02-27 22:45:57  No: 77165  IP: [192.*.*.*]

EM_FMTLINESをSendMessageしてソフト改行文字を挿入する、
というのはどうでしょう?

編集 削除
Say  2003-02-27 22:48:45  No: 77166  IP: [192.*.*.*]

失礼、
EM_FMTLINESをSendMessageしてソフト改行文字を挿入し、
vbCr & vbNewLineをvbNewLineにReplaceすれば、
それをデリミタにSplitで配列に取れると思いますが・・・。

編集 削除
なんでだろ  2004-12-16 17:04:52  No: 77167  IP: [192.*.*.*]

遅ればせながら失礼します。
当方も同じ現象で悩んでました。
EM_GETLINEとReplaceでは、改行できたり出来なかったり不安定なのです。
で、いろいろ悩んだ末、正しい使い方かは判りませんが、以下の方法で対応出来ましたので参考になればと思い記載しておきます。

With Text1
     tmpText = ""
     'テキストボックスの行数を取得
     lngMaxRow = SendMessage(.hWnd, EM_GETLINECOUNT, 0&, 0&)
     For i = 0 To lngMaxRow - 1
         strBuffer = ""
     '行毎の文字列を取得
         lngCharsNumber = SendMessage(.hWnd, EM_GETLINE, i, _
                                       ByVal strBuffer)
     '改行し再度テキスト整形
            tmpText = tmpText & RTrim$(Left$(strBuffer, _                                                   lngCharsNumber)) & vbNewLine
        Next
        .Text = tmpText
End With

編集 削除