Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2015年07月23日] [更新 2015年07月23日] Delphi サンプルプログラム集
076_TRichEdit のスクロールバーの表示制御
動作確認等 Windows 7 U64(SP1) + Delphi XE(UP1) Pro
076_TRichEdit_ScrollBar.zip [1,126 KB] 2015年07月23日版 (EXE 同梱)







TRichEdit のスクロールバーの表示制御


TRichEdit のスクロールバーの設定関係のサンプルです.



[備考]
TMemo は Windows のエディットコントロールをカプセル化したコンポーネントです.TRichEdit はリッチエディットコントロールをカプセル化したものですが,メッセージは EM_XXX という形式となっていて,共通して使用可能なメッセージが多くあります.





01_TRichEdit のスクロールバーを常に表示


TRichEdit の ScrollBars プロパティの値を ssBoth にしても,例えば,垂直方向に表示すべきテキストが全て表示された状態になると,垂直スクロールバーは非表示になります.
水平方向にテキストが収まれば,水平スクロールバーが非表示となります.これが TRichEdit のデフォルトの仕様です.

HideScrollBars プロパティの値を False にすると常にスクロールバーを表示するようになります.その動作確認用のサンプルです.




図1
設計時の画面
図2
実行開始画面
  • 垂直方向 (縦方向) にスクロールする部分がない場合
  • スクロールバーが見えているが,スクロール操作はできない
図3
フォームをリサイズ
  • スクロールバーが操作可能になる

リスト1
TRichEdit の垂直スクロールバーを常に表示
HideScrollBars プロパティの値を False にする
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    RichEdit1: TRichEdit;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//=============================================================================
//  フォーム生成時の処理
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
  RichEdit1.WordWrap       := False;
  RichEdit1.ScrollBars     := ssBoth;
  RichEdit1.HideScrollBars := False;

  RichEdit1.Lines.LoadFromFile('RichText.RTF');
end;

//=============================================================================
//  フォームのOnResizeイベント処理
//  筆者の環境では,TRichEditのクライアント領域にテキストが収まるようになっても
//  スクロールバーが操作可能な状態にならなかったので,その対策
//=============================================================================
procedure TForm1.FormResize(Sender: TObject);
begin
  RichEdit1.Invalidate;
end;

//=============================================================================
//  スクロールバー表示・非表示のトグル
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  RichEdit1.HideScrollBars := not RichEdit1.HideScrollBars;
end;

end.




02_TRichEdit のスクロールバーのコンテキストメニュー


TRichEdit のスクロールバー上で,マウスの右ボタンをクリックすると,下図のようなコンテキストメニューが現れます.このコンテキストメニューを表示しないようにするサンプルです.

コンテキストメニューが表示する際,WM_CONTEXTMENU メッセージが発生します.このメッセージ処理内で何もしなければコンテキストメニューは現れません.何もしないと,TRichEdit で TPopupMenue コンポーネント等を使用していると,そのポップアップメニューも表示しなくなってしまいます.
そこで,マウスクリックの位置が,TRichEdit のクライアント領域の時は,WM_CONTEXTMENU メッセージ本来の処理を実行するようにしています.

以下のコードは,TRichEdit の継承クラスを生成して処理する場合です.サブクラス化関数を使用する方法は,TScrollBox の場合のサンプルを参考にしてください.




図4
スクロールバーのコンテキストメニュー
  • このコンテキストメニューを表示しないようにする

リスト2
TRichEdit のスクロールバーのコンテキストメニューを表示しないようにする
継承クラス (コンポーネント) を使用して処理する場合
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls, Menus;

type
  TplRichEdit = class(TRichEdit)
  protected
    procedure WMContextMenu(var Message: TWMContextMenu);
      message WM_CONTEXTMENU;
  end;

  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
  private
    { Private 宣言 }
    plRichEdit1 : TplRichEdit;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

uses Types;

{$R *.dfm}

//=============================================================================
//  フォーム生成時の処理
//=============================================================================
procedure TForm1.FormCreate(Sender: TObject);
begin
  plRichEdit1 := TplRichEdit.Create(Self);
  plRichEdit1.Parent := Self;
  plRichEdit1.Align  := alClient;

  plRichEdit1.WordWrap       := False;
  plRichEdit1.ScrollBars     := ssBoth;
  plRichEdit1.HideScrollBars := False;

  plRichEdit1.Lines.LoadFromFile('RichText.RTF');
end;

{ TplRichEdit }

//=============================================================================
//  WM_CONTEXTMENUメッセージ処理
//  スクロールバーのコンテキストメニューを表示しないようにする
//=============================================================================
procedure TplRichEdit.WMContextMenu(var Message: TWMContextMenu);
var
  LPos : TPoint;
begin
  LPos := ScreenToClient(Point(Message.XPos, Message.YPos));
  if PtInRect(ClientRect, LPos) then begin
    inherited;
  end else begin
    Message.Result := 0;
  end;
end;

end.