RichEditのスクロールバーの挙動について

解決


タルト  2014-12-28 01:43:16  No: 46942

DELPHI 5  Win7 64bitの環境です。
RichEditに数行書き込んだあとのスクロールバーの位置が
フォントの大きさによって変わり不審に思っています。

新規フォームにRichEditとButtonを配置し、
procedure TForm1.Button1Click(Sender: TObject);
begin
     RichEdit1.ScrollBars := ssVertical ;
     RichEdit1.Clear ;
     RichEdit1.SelAttributes.Size := 22 ;
     RichEdit1.Lines.Add( 'TEST : 1' ) ;
     RichEdit1.Lines.Add( 'TEST : 2' ) ;
     RichEdit1.Lines.Add( 'TEST : 3' ) ;
     RichEdit1.Lines.Add( 'TEST : 4' ) ;
end;
として実行するとRichEditの縦スクロールの位置が
最終行の状態となります。
フォントサイズが21や23などの場合はスクロールバーは
第1行のままです。

フォームに配置した状態で、RichEditのサイズは横185 縦89、
フォントはMSPゴシックの標準でサイズは9です。

みなさんの環境ではいかがでしょうか。


いまどき  2014-12-28 06:41:25  No: 46943

Delphi5使っている人いるの?


けど  2014-12-28 10:24:59  No: 46944

確かに動きは違いますね
RichEditって癖がキツいんでそんなものだと受け止めるしかないのでは?
画像とか入ってるとまた微妙な動きするし
気にくわないなら自分でスクロールバーの位置を強制的に変えるとかですね

>いまどきさん
自分用のツールとか作る時は今でも使ってるよー(UniCode関係なければね)
軽いし早いしコンポーネントが揃ってるから手放せはしないなー


タルト  2014-12-28 16:45:38  No: 46945

>いまどきさん
5は20年近く前のversionで、いまやXE7ですものね

>けどさん
検証ありがとうございます。
RichEditはそういうものですか。
RichEdit1.Lines[ 0 ] := RichEdit1.Lines[ 0 ] ;
と追加してスクロールバーを第1行に移動させることにします。
他にスマートな方法はあるでしょうか。


  2014-12-30 04:19:44  No: 46946

単に RichEdit1.Selstart := 0  とすればうまくいきますか?


たると  2014-12-30 07:21:03  No: 46947

>あさん
ありがとうございます。
SelStartを設定するだけではスクロールバーの
位置はかわりませんでした。

第1行目に実際に書き込まないと移動しないようです。


igy  2014-12-30 10:47:53  No: 46948

[Delphi-ML:4668] カーソルの位置
http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=004668

あたりは、参考になりませんか?


タルト  2014-12-30 17:49:27  No: 46949

>igyさん
ありがとうございます。たいへん参考になりました。
Delphi-MLの記載をもとに次のような解決法がわかりました。

1)あさんのSelStartの場合は
RichEdi1.SelStart := 0 ;    のあと
RichEdit1.SetFocus ;        を追加する

2)Performを使って
RichEdit1.Perform( EM_LINESCROLL, SB_THUMBTRACK, -RichEdit1.SelStart ) ;

ただD-MLに書かれてあった
RichEdit1.Perform( WM_VSCROLL, SB_THUMBTRACK, 0 ) ;
では第1行は先頭に表示されますがスクロールバーは上端の手前までしか
移動しませんでした。

考えてくださった方々にお礼申し上げます。


タルト  2014-12-31 02:20:58  No: 46950

追記です。

3)  これがもっとも自然な方法かもしれません。
RichEdit1.Perform( EM_SCROLL, SB_THUMBPOSITION, 0 ) ;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加