[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/07/19(Thu) 14:49
投稿者名:R.S
Eメール:
URL :
タイトル:
SendMessageのEM_FMTLINESについて
 はじめまして、R.Sと申します。
 テキストボックスにEM_FMTLINEをSendMessageし、ソフト改行を入れた形で文字列を取得
したいのですが、入力した文字によって、ソフト改行が入らない場合があります。
 ステータスは成功が帰ってきますが、ソフト改行(VbCr & VbCr & VbLf)が入ってこない
のです・・・
 
 こちらでは、フォームに幅1426、高さ765のテキストボックスを作成し、「abcdefghijklmnopqrstuvwxyzabcde」という文字列を打ち込みSendMessageをすると必ず
ソフト改行が入ってきません。文字列をコピペで貼り付けるとなぜか成功します。
 なにか情報お持ちの方いましたら教えて頂けないでしょうか。よろしくお願い致します。

投稿時間:2007/07/19(Thu) 16:57
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: SendMessageのEM_FMTLINESについて
>  なにか情報お持ちの方いましたら教えて頂けないでしょうか。よろしくお願い致します。

それだけでは誰も答えられないのではないでしょうか?

事象を再現できる最小のコードでも投稿して頂くと何方か試して頂けるかとは
思うのですが。
(投稿してもらってもそのままでは動かないと試してもらえません)

投稿時間:2007/07/19(Thu) 17:34
投稿者名:R.S
Eメール:
URL :
タイトル:
Re^2: SendMessageのEM_FMTLINESについて
> 事象を再現できる最小のコードでも投稿して頂くと何方か試して頂けるかとは
> 思うのですが。

 失礼しました。サンプルコードを記入致します。

 フォームに以下の部品を貼り付けて下さい。
  テキストボックス「Text1」
  コマンドボタン「Command1」

 こちらの環境ですと、フォームのスケールモードをTwipとし、Text1の幅を1426、
高さを765とし、テキストボックスに「abcdefghijklmnopqrstuvwxyzabcde」と打ち
込みコマンドボタンを押すとソフト改行が挿入されません。文字列はコピペだと
挿入に成功します。
 知識不足で申し訳ありませんが、よろしくお願いします。

------以下ソース-------

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long

Private Const EM_FMTLINES = &HC8 'ソフト改行文字を設定/削除する定数

Private Sub Command1_Click()
    Dim str As String
    
    'ソフト改行文字を付加
    Call SendMessage(Text1.hwnd, EM_FMTLINES, 1&, ByVal 0&)

    str = Text1.Text
    If InStr(str, vbCr & vbCr & vbLf) = 0 Then
        MsgBox "ソフト改行は含まれていません"
    Else
        MsgBox "ソフト改行挿入成功"
    End If
    
End Sub

投稿時間:2007/07/19(Thu) 18:23
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: SendMessageのEM_FMTLINESについて
当然、 Text1.MultiLine = True ですよね。

どちらでも問題ありませんが、本当にこのコードを試されたのでしょうか?
他に何か書いたコードがありませんか? 投稿したコードのみで試して見て下さい。

追加したコードは下記の部分だけです。
Private Sub Form_Load()
   Text1.Move 1000, 1000, 1426, 765
  ' Text1.MultiLine = True プロパティで設定
End Sub


Private Sub Command1_Click()
    Dim str As String
    
    'ソフト改行文字を付加
    Call SendMessage(Text1.hwnd, EM_FMTLINES, 1&, ByVal 0&)
    
    Text1.Refresh   '追加 これが原因かも
    
    str = Text1.Text
    If InStr(str, vbCr & vbCr & vbLf) = 0 Then
        MsgBox "ソフト改行は含まれていません"
    Else
        MsgBox "ソフト改行挿入成功"
    End If
    
End Sub

投稿時間:2007/07/19(Thu) 23:30
投稿者名:R.S
Eメール:
URL :
タイトル:
Re^4: SendMessageのEM_FMTLINESについて
返信、検証いただきましてありがとうございます。

MultiLineはTrueとしています。
コードは投稿したコードで、「abcde・・・cde」を入力すると「ソフト改行は含まれて
いません」となってしまいます。ちょうど2行いっぱいに入力された状態です。

同じく花ちゃんさん投稿のコードで実行してもやはり「ソフト改行は含まれていません」
となってしまいます・・・

複数のPCで試しても同じ状況ですが、念のため発生した環境は下記のとおりです。
・OS
 WindowsXP HomeEdition SP2
  WindowsXP Professional SP2
  Windows2000 SP4

VBはSP5を使用しております。

花ちゃんさんのところでは「ソフト改行挿入成功」が必ず帰ってくる状況なのでしょうか・・・

投稿時間:2007/07/20(Fri) 00:07
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^5: SendMessageのEM_FMTLINESについて
   'ソフト改行文字を付加
    'Call SendMessage(Text1.hwnd, EM_FMTLINES, 1&, ByVal 0&)
    
  '私の場合どちらでもOKなのですが、下記が正しいようなのでテストしてみて下さい
    Call SendMessage(Text1.hwnd, EM_FMTLINES, 1&, 0&)  
'    Text1.Refresh   '追加 これが原因かも
'  又は、Doevents

    を追加しましたか?

同じ方ですか?
http://oshiete1.goo.ne.jp/qa3175457.html

投稿時間:2007/07/20(Fri) 00:50
投稿者名:Starfish
Eメール:
URL :
タイトル:
Re^3: SendMessageのEM_FMTLINESについて

>  こちらの環境ですと、フォームのスケールモードをTwipとし、Text1の幅を1426、
> 高さを765とし、テキストボックスに「abcdefghijklmnopqrstuvwxyzabcde」と打ち
> 込みコマンドボタンを押すとソフト改行が挿入されません。文字列はコピペだと
> 挿入に成功します。

 Windows APIは、VB内部でも使用しているので、この場合競合している
ような気がします。

 フォームのロードイベントでも、以下のコードを追加でどうでしょう。
私の環境では、これでいい感じになるのですが。

   'ソフト改行文字を付加
    Call SendMessage(Text1.hwnd, EM_FMTLINES, 1&, ByVal 0&)

投稿時間:2007/07/20(Fri) 13:22
投稿者名:R.S
Eメール:
URL :
タイトル:
Re^4: SendMessageのEM_FMTLINESについて
花ちゃんさん
仰る通り、OkWaveの方でもちょっと前に質問致しました。
マルチ投稿まがいになってしまった事、謝罪致します。
本当に申し訳ありませんでした。

教えて頂いたコードは全て試しましたが、やはり失敗してしまいます。


Starfishさん
>Windows APIは、VB内部でも使用しているので、この場合競合している
>ような気がします。
>フォームのロードイベントでも、以下のコードを追加でどうでしょう。

そんなこともあり得るのですね。ご指摘いただいたとおり、フォームロードに
SendMessageを追加したところ、こちらの環境でもソフト改行が問題なく挿入
されていることが確認できました。


花ちゃんさん、Starfishさん、いろいろ教えて頂き、ありがとうございました。