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

投稿時間:2005/02/23(Wed) 20:14
投稿者名:MIYA
Eメール:
URL :
タイトル:
テキストボックス内でのドラッグ&ドロップが出来ない
テキストボックス内でAPIにてワードラップを抑止(EM_SETWORDBREAKPROCを使用)しているとマウスに
よるドラッグ&ドロップ操作ができません。
テキストボックスのプロパティは、OLEDragMode=自動、OLEDropMode=自動、MultiLine=trueにしてい
ます。

試しにワードラップ抑止の処理させないで実行するとドラック&ドロップ操作が出来てしまいます。
どうしてワードラップ抑止の処理させると出来なくなるのか判りません。ワードラップ抑止の処理を
有効にしたまま、ドラッグ&ドロップ処理が出来るようにすることが出来ないでしょうか?
御教授をお願い致します。

実行環境:Windows XP Home Edition SP2、VB 6.0 SP5

以下がワードラップ抑止のソースです。(標準モジュール内に作成しています)
(ワードラップ抑止処理の呼び出しは、テキストボックスのChangeイベントより呼び出しています)
' ワードラップ関数に置き換えることを示す定数の宣言
Public Const EM_SETWORDBREAKPROC = &HD0

Public Function NonWordrap(txtText As TextBox)
Dim lngSubProcAddress     As Long
Dim strSaveText           As String
Dim lngSaveStart          As Long
Dim lngWin32apiResultCode As Long
    
    ' テキストを保存
    strSaveText = txtText.text
    lngSaveStart = txtText.SelStart
    ' テキストを初期化
    txtText.text = ""
    ' コールバック関数のアドレスをLong値に変換
    lngSubProcAddress = _
       GetSubProcAddress(AddressOf EditWordBreakProc)
    ' ワードラップを抑止
    lngWin32apiResultCode = _
        SendMessage(txtText.hWnd, _
                    EM_SETWORDBREAKPROC, _
                    0, _
                    ByVal lngSubProcAddress)
    ' 保存したテキストを戻す
    txtText.text = strSaveText
    txtText.SelStart = lngSaveStart
End Function

' コールバック関数のアドレスをLong値に変換
'
Public Function GetSubProcAddress _
       (ByVal lngProcAddress As Long) As Long
    GetSubProcAddress = lngProcAddress
End Function

'
' コールバック関数 - ワードブレイク処理
'
Public Function EditWordBreakProc _
       (ByVal lpch As Long, _
        ByVal ichCurrent As Long, _
        ByVal cch As Long, _
        ByVal action As Long) As Long
    ' 抑止処理なし
    EditWordBreakProc = 0
End Function

投稿時間:2005/02/24(Thu) 02:27
投稿者名:Starfish
Eメール:
URL :
タイトル:
Re: テキストボックス内でのドラッグ&ドロップが出来ない
> テキストボックス内でAPIにてワードラップを抑止(EM_SETWORDBREAKPROCを使用)しているとマウスに
> よるドラッグ&ドロップ操作ができません。
> テキストボックスのプロパティは、OLEDragMode=自動、OLEDropMode=自動、MultiLine=trueにしてい
> ます。
>
> 試しにワードラップ抑止の処理させないで実行するとドラック&ドロップ操作が出来てしまいます。
> どうしてワードラップ抑止の処理させると出来なくなるのか判りません。ワードラップ抑止の処理を
> 有効にしたまま、ドラッグ&ドロップ処理が出来るようにすることが出来ないでしょうか?
> 御教授をお願い致します。
>
> 実行環境:Windows XP Home Edition SP2、VB 6.0 SP5
>
> 以下がワードラップ抑止のソースです。(標準モジュール内に作成しています)
> (ワードラップ抑止処理の呼び出しは、テキストボックスのChangeイベントより呼び出しています)

 NonWordrap 関数をテキストボックスのChangeイベントで呼び出すと、NonWordrap 関数
の中でテキストボックスの値を変更しているので、連続してChangeイベントが発生して
「スタック領域が不足しています」のエラーで正常に動きません。

 NonWordrap 関数をコマンドボタン等で動かすと、ワードラップ抑止を実行しても
ドラック&ドロップ操作が出来ます。

 再現手順を確認してください。

実行環境:Windows XP Home Edition SP2、VB 6.0 SP6

投稿時間:2005/02/25(Fri) 09:47
投稿者名:MIYA
Eメール:
URL :
タイトル:
Re^2: テキストボックス内でのドラッグ&ドロップが出来ない
Starfishさん、御教授有難う御座います。返信が遅くなり申し訳ありません。
NonWordrap関数を使用する場合、コマンドボタン等でのユーザー操作によって動かしてもらうしかない
のですね。
初歩的な質問で申し訳無いのですが、「スタック領域が不足しています」等のエラーは必ず発生するも
のなのでしょうか?

投稿時間:2005/02/26(Sat) 14:03
投稿者名:Starfish
Eメール:
URL :
タイトル:
Re^3: テキストボックス内でのドラッグ&ドロップが出来ない
> NonWordrap関数を使用する場合、コマンドボタン等でのユーザー操作によって動かしてもらうしか


> のですね。

 フォームのLoadイベントとかで設定しておけばいいのでは?
1回設定しておけば、何度も設定する必要はないと思いますが

> 初歩的な質問で申し訳無いのですが、「スタック領域が不足しています」等のエラーは必ず発生す


> のなのでしょうか?

 テキストボックスのChengeイベントで、そのテキストボックスを変更しているので
連鎖的にイベントが発生してしまっているのだけですが。

投稿時間:2005/02/26(Sat) 15:50
投稿者名:MIYA
Eメール:
URL :
タイトル:
Re^4: テキストボックス内でのドラッグ&ドロップが出来ない
Statfishさん、御教授有難う御座います。
ご指摘の通り、フォームのLoadイベント等で試してみます。
結果は、後日報告したいと思います。

投稿時間:2005/02/26(Sat) 19:22
投稿者名:MIYA
Eメール:
URL :
タイトル:
Re^5: テキストボックス内でのドラッグ&ドロップが出来ない
フォームのLoadイベントにて処理をさせたところ、上手く動作しました。
Startfishさん、色々と有難う御座いました。