複数行のテキストボックスから指定の行の文字列を"EM_GETLINE"をテキストボックスにSendMessageすることで取得しています。
開発時は問題なく取得できていたのですが、他のマシンにインストールして実行してみたところ文字列があるのにも関わらず長さ0で返ってきてしまいます。
(長さが稀に返ってくることがあるのですが、2バイトコード文字はまったく返ってこないようです。)
また、総行数をEM_GETLINECOUNTメッセージで取得しているのですが、これは正常に取得できています。
セットアップはディストリビューションウィザードで作成しました。
マシンは開発、インストール先 共に Win2000 SP2 です。
何か情報をお持ちの方がいらっしゃいましたら、よろしくお願いします。
下記を試して見て下さい。
http://www.bcap.co.jp/hanafusa/VBHLP/Apointrow.htm
ありがとうございます。
試してみたのですが、うまく取得できる場合と取得できない場合があるようです。
その後開発環境でも取得できないことがありました。
(2バイトコードだからとかいうことも関係ないようです。)
根が深そうです。。。。
ひょっとしてRichTextBoxに表示していませんか?
いえ、TextBoxです。
単一フォームのプログラムでは比較的うまく取得できるようなのですが、
MDIでかつサブクラス化したりとちょっと複雑なプログラムになると
取得できない確率は上がるようです。。。
メッセージのハンドリングに問題があるのではないかと思っていますが、
原因は未だ不明です。
ただ、単一フォームでサブクラス化していないプログラムでも100%取得
できるというわけでも無いようなので。。。
何台かのマシンで試してみたのですが、結果は同じです。
それぐらいのサイズでしたら
FileSystemObject オブジェクトの TextStream オブジェクトを使って
ReadLine / SkipLine メソッドを使用すれば指定行が読み取りできますので
一度そちらを試されたらいかがでしょうか?
テキストボックスの内容を丸ごと保存して、読み取るということでしょうか?
テキストボックスのワードラップされた状態での行単位の文字列を取得したいので、ReadLineでは改行までを一行としてしまいます。
見えている状態を取得したいのですが。
何かよい方法はありませんでしょうか?
ちなみに テキストボックスのソフト改行文字を設定する "EM_FMTLINES" というメッセージも試してみたのですが、これも できたりできなかったりとなぜか不安定です。。。
ところで、改行コードまでの情報を取得するのにわざわざAPIを使用する必要があるのですか?
VB標準関数の「InStr」や「Replace」という便利な機能があると思うのですが…
もし、標準関数を使っても良いのであれば、サンプルとしてテーブル定義作成ツールというソフトを作成したので、参考にしてください。
http://www.takonet.co.jp/~pegasus/
いえ、改行コードまでの情報を取得したいわけではありません。
複数行のテキストボックスに文字を入力していくとテキストボックスの幅まで入力すると単語の途中で切れてしまわないようにワードラップがかかります。
見た目では改行されますが、改行コードが入っているわけではありません。よってテキストボックスのTextプロパティを参照しても、見た目上どこで改行されたのかは判断できないのです。
そこで、EM_GETLINE を送信することで改行までではなく、見た目上の一行分の文字列を取得しようとしていたのです。ところが、この方法ではうまく取得できたりできなかったりと不安定な動きなので困っているのです。
何かよい方法はないでしょうか?
案外、SendMessageのパラメータがおかしい…って事は無いですか?
例えば、「hWnd」が何らかの理由で正しく取得できていないとか・・・
「うまく取得出来なかった時」には、SendMessageの戻り値および
Err.LastDllErrorの値として、それぞれ何が返されていますか?
EM_FMTLINESをSendMessageしてソフト改行文字を挿入する、
というのはどうでしょう?
失礼、
EM_FMTLINESをSendMessageしてソフト改行文字を挿入し、
vbCr & vbNewLineをvbNewLineにReplaceすれば、
それをデリミタにSplitで配列に取れると思いますが・・・。
遅ればせながら失礼します。
当方も同じ現象で悩んでました。
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
ツイート | ![]() |