日期:2014-05-19  浏览次数:20832 次

在google上面搜到下面的微软的地址,可是看不了
在google上面搜到下面的微软的地址,可是看不了
有谁可以打开的,把上面的代码放出来看看。

http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-22353.htm

------解决方案--------------------
スレッド: TextBox のワードラップの抑止について
hatayama はオフラインです。最後に活動した時刻: 2005/01/28 17:05:01 hatayama
参加日: 2004-12-23
投稿数: 6


TextBox のワードラップの抑止について
投稿日時: 2004-12-23 午後 3:48
はじめまして、hatayamaといます。

VB.NETのTextBoxで3000~4000文字の長い行を含む入力を行おうとしています。
入力するデータは大量にスペースを含むため、右端で折り返しはしたいがワードラップは要らない状況です。

そこでプロパティを以下のように変更しています。
multiline=True
WordWrap=True
ScrollBars=Both

ワードラップの抑止する方法として、
SendMessageでEM_SETWORDBREAKPROCを送り、
必ず0を戻す関数を設定する方法を本で見つけ、試してみたのですが、
文字を入力中に以下のメッセージを出して落ちてしまいます。
--------------------------------------------------
'System.NullReferenceException ' のハンドルされていない例外が system.windows.forms.dll で発生しました。

追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。
--------------------------------------------------

エラーの回避方法か別のワードラップの抑止方法を教えていただけないでしょうか?
よろしくお願いします。

trapemiya はオフラインです。最後に活動した時刻: 2006/03/20 22:40:21 trapemiya
Top 25 Poster
参加日: 2003-5-6
投稿数: 1641


Re: TextBox のワードラップの抑止について
投稿日時: 2004-12-24 午前 11:54
こんにちは。

外してるかもしれませんが、PostMessageで送ってみたらどうでしょうか?
Lady.BUG はオフラインです。最後に活動した時刻: 2006/03/30 21:33:09 Lady.BUG
Top 25 Poster
参加日: 2004-2-13
投稿数: 1086


Re: TextBox のワードラップの抑止について
投稿日時: 2004-12-24 午後 12:55
PInvoke の FAQかもしれませんが、PInvoke に渡したコールバック用の delegate の参照数が 0 になっていませんか?

参照数が 0 になっているとガーベッジコレクタによって delegate が回収された後に、API が callback を呼び出そうとした時点で上記の例外に遭遇します。

C#
private delegate int WordBreakProc(IntPtr pchText, int cchText, byte bCharset, int code);

private void TextBox1_CreateHandle(object sender, EventArgs e)
{
Control self = sender as Control;

SendMessage(self.Handle, EM.SETWORDBREAKPROCEX, 0, new WordBreakProc(MyWordBreak));
}

VB
Sub TextBox1_CreateHandle(ByVal sender As Object, ByVal e As EventArgs) Handles TextBox1.CreateHandle
Dim self As Control

self = CType(sender, Control)

SendMessage(self.Handle,EM.SETWORDBREAKPROCEX,0,AddressOf MyWordBreak)
End Sub


のようにしてるとダメです。このような場合は GCHandle を利用して、

C#
private delegate int WordBreakProc(IntPtr pchText, int cchText, byte bCharset, int code);

private void TextBox1_HandleCreated(object sender, EventArgs e)
{
Control self = sender as Control;

WordBreakProc proc = new WordBreakProc(MyWordBreak);

// とりあえず Tag プロパティに保存する
self.Tag = GCHandle.Alloc(proc);

// callback を登録
SendMessage(self.Handle, EM.SETWORDBREAKPROCEX, 0, proc);
}

private void TextBox1_HandleDestroyed(object sender, EventArgs e)
{
// 登録していた callback の参照を消す
(self.Tag as GCHandle).Free();
}

VB
Private Sub TextBox1_HandleCreated(ByVal sender As Object, ByVal e As EventArgs) Handles TextBox1.HandleCreated
Dim proc As WordBreakProc

proc = AddressOf MyWordBreak

With CType(sender, Control)
' とりあえず Tag プロパティに保存する
.Tag = GCHandle.Alloc(proc)

' callback を登録する
SendMessage(.Handle, EM.SETWORDBREAKPROCEX, 0, proc)
End With
End Sub

Sub TextBox1_HandleDestroyed(ByVal sender As Object, ByVal e As EventArgs) Handles TextBox1.HandleDestroyed
// 登録していた callback の参照を消す
With CType(self.Tag, GCHandle)
.Free
End With