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.