- PR -

TextBoxをScrollToCaretを利用しても任意の位置にスクロール出来ない!

投稿者投稿内容
るる
会議室デビュー日: 2003/11/06
投稿数: 16
投稿日時: 2004-01-20 21:05
こんにちは。皆様。

TextBoxで、ScrollToCaretを利用すれば、スクロールを任意の位置に持ってこれること
は分かりました。
しかし、これを利用してもスクロールできません。

マイクロソフトのページには、
=============================================
コントロールにフォーカスがない場合、またはカレットが既にコントロールの表示領域に位置している場合、このメソッドは無効です。
============================================
とあるので、キットフォーカスがないためだと思われます。

そこで、どのようにフォーカスを当てればよいのかをお教え願いたいのです。

form.Invokeメソッドを使えば良いのではないかというところまでは分かったのですが、
これをどのように利用してよいのかが分かりません。

ご存知の方がいらっしゃいましたら、お教え願います。
よろしくお願いします!

Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-01-20 23:01
諸農です。

引用:

るるさんの書き込み (2004-01-20 21:05) より:

とあるので、キットフォーカスがないためだと思われます。



フォームにMultiLine、ScrolBarをVertcalにしたTextBoxとRichTextBoxと
Buttonを配置して、デザイナでTextBoxに複数行のテキスト(メールのコピペ)を
行ったプロジェクトで、ButtonのクリックイベントでScrollToCaret()を呼び出し
ましたが、期待通りの動作はします。

期待通りにならないと言われている状況をもう少し説明していただけますか。

ではでは(^^)/
_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
るる
会議室デビュー日: 2003/11/06
投稿数: 16
投稿日時: 2004-01-20 23:20
ご返答ありがとうございます。

そして、Jubeiさん、わざわざやってくださったのですね。ありがとうございます。

私も、以前に作成したチャットでは、ScrollToCaret()で動作するのですが、
今回新しく作成したアプリケーションでは動作しません。

少し調べてみましたところ、
「呼び出し元がコントロールの作成されたスレッドと異なるスレッド上にあるため、コントロールに対してメソッドの呼び出しを実行するときに、呼び出し元で invoke メソッドを呼び出す必要がある」
ということを知りました。

このinvokeが必要かどうかは、InvokeRequired プロパティで分かるそうなので
(下記参照)、実際にtextBox1.InvokeRequiredと記述し実行してみましたら、
Trueが返され、invokeが必要であることが分かりました。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformscontrolclassinvokerequiredtopic.asp

現状で分かっているのはこのくらいです。

どうぞよろしくお願いします。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-01-21 01:22
諸農です。

もしかしてマルチスレッドからの呼び出しって事でしょうか?
であるなら、こちらのトピックとサンプルコードが参考になるかも。

SDK1.1 [.NET Framework 開発者ガイド]
「マルチスレッド Windows フォーム コントロールのサンプル [C#]」
ms-help://MS.NETFrameworkSDKv1.1.JA/cpguidenf/html/cpcondevelopingmultithreadedwindowsformscontrol.htm

ではでは(^^)/
_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
るる
会議室デビュー日: 2003/11/06
投稿数: 16
投稿日時: 2004-02-19 14:53
皆様!!!

すごいです。スクロールする方法が分かりました!!
TextBoxではなく、RichTextBoxだったので問題が起こったようです。

public readonly uint EM_LINESCROLL = 0x00B6;

[DllImport("User32.dll")]
public static extern int SendMessage(IntPtr hWnd, uint Msg, uint wParam, uint lparam);

//2行上にスクロールします
SendMessage(richTextBox1.Handle, EM_LINESCROLL, 0, (uint)(2));

ちなみに参考にしたサイトのURLは次の通りです。
http://www.dotnet247.com/247reference/msgs/17/87791.aspx
http://www.experts-exchange.com/Programming/Programming_Languages/C_Sharp/Q_20743071.html
るる
会議室デビュー日: 2003/11/06
投稿数: 16
投稿日時: 2004-02-22 03:02
皆様、

こんにちは。

補足説明です。

上記の記述に加え、あと、
  using System.Runtime.InteropServices;
を追加する必要があります。

以上です。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-02-22 03:25
諸農です。

引用:

すごいです。スクロールする方法が分かりました!!
TextBoxではなく、RichTextBoxだったので問題が起こったようです。



おめでとうございますっ \(^o^)/
実現できて、よかったですね!

Win32と言うことなので、こっちのトピックも参考になるかと(^^
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=8248&forum=7
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=8427&forum=7

ではでは(^^)/
_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
CHN
ぬし
会議室デビュー日: 2002/03/07
投稿数: 382
投稿日時: 2004-02-22 04:26
引用:

るるさんの書き込み (2004-02-19 14:53) より:
皆様!!!

すごいです。スクロールする方法が分かりました!!
TextBoxではなく、RichTextBoxだったので問題が起こったようです。

public readonly uint EM_LINESCROLL = 0x00B6;

[DllImport("User32.dll")]
public static extern int SendMessage(IntPtr hWnd, uint Msg, uint wParam, uint lparam);

//2行上にスクロールします
SendMessage(richTextBox1.Handle, EM_LINESCROLL, 0, (uint)(2));

ちなみに参考にしたサイトのURLは次の通りです。
http://www.dotnet247.com/247reference/msgs/17/87791.aspx
http://www.experts-exchange.com/Programming/Programming_Languages/C_Sharp/Q_20743071.html



おー、これいいですね。私も使いま〜す。
でも、よく考えてみますと、
Win32でアプリを作るとき、自然と思い浮かびますよね、メッセージって。
.NETなら、なんかクラスないかなとか、メソッドないかなとか
探しますよね^-^。
_________________

スキルアップ/キャリアアップ(JOB@IT)