- 爱易网页
-
C#教程
- 在google上面搜到下面的微软的地址,可是看不了,该怎么解决
日期: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