掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
行の取得がうまくいかないときがあるは何故ですか? (ID:43122)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>これでは、スクロールバーの位置scrollposを0にできないんですか? > i:=SetScrollPos(RichEdit1.Handle,0,0,BO); >以外で、0にする方法を教えてくださいませんか。 えーと、回答をすべて読まれていらっしゃるのでしょうか? 前回書きましたが、SetScrollPos関数の第2引数を0にすると 横スクロールバーが対象になります。 行方向つまり縦スクロールなら i:=SetScrollPos(RichEdit1.Handle,SB_VERT,0,BO); ですね。 さらに、この関数の戻り値は http://msdn.microsoft.com/ja-jp/library/cc411085.aspx ここによると >関数が成功すると、スクロールボックスのそれまでの位置が返ります。 とありますので、この関数を実行する前の位置が返ります。 つまりスクロールバーが左端(上下なら上端)にない場合は 0以外の値が返ることになります。 また、実験してみると(見かけ上の)スクロールバーの位置と 返ってくる値にズレがあるようです。 この関数を呼んだだけでは、スクロールバーは移動しますが カーソル位置は変化しません。 SetScrollPos関数を呼んでスクロールバーが先頭に移動した後 さらにスクロールバーの左端(あるいは上端)の三角マークボタンをクリックすると 動かないはずのスクロールバーが先ほどの位置辺りへ移動します。 この動作から、スクロールバーの表示はマウスによる操作の際に カーソル位置から再計算されるのではないかと思われますが 何か不可解な動作をします。(詳しく調査すれば分かりそうだが無意味なのでパス) いずれにしても、この関数は移動前の位置を返しますので 現在のスクロールバーの位置を調べるには不適切でしょう。 では、どうすればいいかという事ですが、上記のサイトの上のほうに >注意 SetScrollPos 関数は、下位互換性の目的で提供されています。新しいアプリケーションは、代わりに SetScrollInfo 関数を使うべきです。 とありますので、SetScrollInfoを使えばいいでしょう。 具体的には var ScrollInfo: TScrollInfo; begin ScrollInfo.cbSize := SizeOf(ScrollInfo); ScrollInfo.fMask := SIF_POS; ScrollInfo.nPos := 0; //新しい位置 SetScrollInfo(RichEdit1.Handle, SB_VERT, ScrollInfo, True); end; とすれば、スクロールバーの位置を0にできます。 おっと、本来は現在の位置を取得するのでしたね var ScrollInfo: TScrollInfo; p: integer; begin ScrollInfo.cbSize := SizeOf(ScrollInfo); ScrollInfo.fMask := SIF_POS; GetScrollInfo(RichEdit1.Handle, SB_VERT, ScrollInfo); p := ScrollInfo.nPos; end; とすれば、pに現在のスクロールバーの位置が返ります。 が、TRichEdit.CaretPosで大元の目的を達成されているので 今後このスレッドを見た人に、なんらかのヒントになればと。 ちなみに、SetScrollPosについての情報はグーグル先生に聞きました。 あぁ、こう書くと分からない人もいるかもしれないので(^^;) グーグルでSetScrollPosを検索したら一番最初にでてきました。 第2引数を0にすると横スクロールになるというのは SetScrollPos関数のページに出てきたSB_CTL、SB_HORZ、SB_VERTを さらにグーグルで検索したら0がSB_HORZであることが分かりました。 GetScrollInfoのDelphiでの使い(書き)方については (少々の)C言語の知識と(ある程度の)Delphiでの経験値が必要でしたが。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.