ホーム >プログラム >Delphi 6 ローテクTips

Unicode対応のRichEditクラス

Unicode対応のリッチエディットコントロールをクラスにしてみました。

が、実はVCLのTRichEditはそのままでもUnicode対応であることが後で分かりました。

ソースコード

このソースでUnicode対応のリッチエディット(ではあるけれど機能的にはTEditやTMemo)コントロールが作成できます。
実際の運用にはポップアップメニューを作ったりVCLコンポーネントとの連携をとるために小手先の技を使わないといけないので標準のコンポーネントよりかなり使いづらいです。

シングルラインのエディットで(TMyEdit)右寄せにしたり数値のみの入力にしたりパスワード入力用にしたりというのはやっていません。
そのへん私があまりシングルラインのエディットを必要としていないせいで手抜きです。
マルチラインのエディット(TMyMemo)で「右端で折り返す」のを実現させるため一度ウィンドウを破棄して再作成していたりするのでややこしい感じもあります。

編集機能

編集機能については特別な実装は何も行っていないのでWindowsのRichEditコントロールが持っている編集機能がもれなくそのまま使えます。
単語削除や単語移動などは結構便利に使えると思います。

ショートカットキー
Ctrl+Z 戻す。
Ctrl+Y
Ctrl+Shift+Z
やり直し。
Ctrl+X 切り取り。
Ctrl+C
Ctrl+Insert
コピー。
Ctrl+V
Shift+Insert
貼り付け。
Shift+Delete 選択範囲がある場合のみ選択範囲を削除。
選択範囲がなければなにもしない。
Ctrl+A
Ctrl+(テンキーの)5
すべて選択。
Ctrl+キーボード上部にある数字キーの5は無効。
Ctrl+Backspace 現在のカーソル位置から単語の先頭までを削除。
(行頭へ向かっての単語削除)
Ctrl+Delete 現在のカーソル位置から単語の末尾までを削除。
(行末へ向かっての単語削除)
Ctrl+Left 行頭へ向かっての単語移動。
Ctrl+Right 行末へ向かっての単語移動。
Ctrl+Up 1行上の行頭へ移動。
Ctrl+Down 1行下の行頭へ移動。
Home 行頭へ移動。
End 行末へ移動。
Ctrl+Home 文書の先頭へ移動。
Ctrl+End 文書の末尾へ移動。
Ctrl+Page Up 表示中のページの先頭に移動。
Ctrl+Page Down 表示中のページの末尾に移動。
Ctrl+Shift+A 選択範囲を大文字に変換。
Alt+Shift+X カーソル位置の文字を16進のUnicodeのコード番号に変換。
Alt+X
Alt+Shift+Ctrl+F12
選択した16進数字をUnicodeのコード番号であるとみなして対応する文字に変換。
Alt+(テンキーの)0nnn.. Altキー押したままテンキーの0に続いて10進のUnicodeのコード番号をテンキーから入力してAltキーを離すと対応する文字がカーソル位置に挿入される。
キーボード上部にある数字キーでは入力できない。

使い方

type
  TForm1 = class(TForm)

   ...

  private
    { Private 宣言 }
    F_Memo: TMyMemo;  //本文用
    F_Edit: TMyEdit;  //検索用

    function F_GetEdit: TMyCustomEdit; //フォーカスがあるリッチエディットコントロールを返す
  end;

   ...


procedure TForm1.FormCreate(Sender: TObject);
begin
  F_Edit := TMyEdit.Create(DrawGrid2);
  F_Memo := TMyMemo.Create(DrawGrid1);
  F_Memo.SetFocus;

    ...

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  //終了処理
  F_Edit.Free;
  F_Memo.Free;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  //Richeditのサイズをフォームのクライアントに合わせる
  F_Memo.SetBounds(0, 0, ClientWidth, ClientHeight);
end;

フォームのサイズが変わったときにRichEditのサイズも変更しなければならないときはOnFormResizeイベントに記述します。

ポップアップメニュー

作成するUnicode対応のリッチエディットクラスが一つだけなら簡単ですが、複数ある場合それぞれにポップアップメニューを作る必要があります。
あるいは一つのポップアップメニューで済ませるならそれぞれのメニュー項目で処理をふりわける必要があります。

以下の例ではF_GetFocusEditで現在フォーカスのあるリッチエディットを返すようにしています。
そしてそれを利用して各編集コマンドを分けて処理できるようにしています。

//現在フォーカスのあるリッチエディットを返す
function TForm1.F_GetFocusEdit: TMyCustomEdit;
begin
  if (F_Edit.Focused) then begin
    Result := F_Edit;
  end else if (F_Memo.Focused) then begin
    Result := F_Memo;
  end else begin
    Result := nil;
  end;
end;

//元に戻す
procedure TForm1.Edit_UndoClick(Sender: TObject);
begin
  if (F_GetFocusEdit <> nil) then F_GetFocusEdit.Undo;
end;

//やり直し
procedure TForm1.Edit_RedoClick(Sender: TObject);
begin
  if (F_GetEdit <> nil) then F_GetEdit.Redo;
end;

//切り取り
procedure TForm1.Edit_CutClick(Sender: TObject);
begin
  if (F_GetFocusEdit <> nil) then F_GetFocusEdit.Cut;
end;

//コピー
procedure TForm1.Edit_CopyClick(Sender: TObject);
begin
  if (F_GetFocusEdit <> nil) then F_GetFocusEdit.Copy;
end;

//貼り付け
procedure TForm1.Edit_PasteClick(Sender: TObject);
begin
  if (F_GetFocusEdit <> nil) then F_GetFocusEdit.Paste;
end;

//削除
procedure TForm1.Edit_DeleteClick(Sender: TObject);
begin
  if (F_GetFocusEdit <> nil) then F_GetFocusEdit.Delete;
end;

//全て選択
procedure TForm1.Edit_SelectAllClick(Sender: TObject);
begin
  if (F_GetFocusEdit <> nil) then F_GetFocusEdit.SelectAll;
end;

//Tabの入力
procedure TForm1.Edit_TabClick(Sender: TObject);
//タブキーをVCLに奪われてしまうために対策
begin
  if (F_GetFocusEdit <> nil) then F_GetFocusEdit.Insert(#9);
end;

サンプルプログラム

簡易なエディターです。
検索ボックスと本文にUnicode対応のリッチエディットのクラスをTDrawGridを親ウィンドウにして作成しています。

Unicodeなファイルの読み書きができます。
ファイルへの書き込みはUnicodeな文字があればBOM付のUTF-8で、なければShift-JISで行います。
読み込みはShift-JIS、EUC、JIS、UTF-8、UTF-16、UTF-7を自動判定して読み込みます。
エクスプローラからのファイルのドラッグアンドドロップにも対応しています。
レジストリには何も書き込みません。
iniファイルも作りません。