AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
Delphi2010 リッチエディット(RichEdit) 2010/10/04
 
前回は[Win32]内の「ImageList」(イメージリスト)について見ましたので、今回は同じく[Win32]内の「RichEdit」(リッチエディット)について見てみます。リッチエディットは Delphi6 にもあります。最初に、「テスト13」(フォルダ「013」)として新規作成しておきます。

 
取り合えず配置してみます。1つ目ですので Nameプロパティは「RichEdit1」となります。

 
リッチエディットは、外観や機能的には、メモ(Memo)と似ていますが、メモは元々、編集可能な文章データ容量が64KB(32KB?)という制限がありましたが、リッチエディットはそれよりも多くの容量を持つ事が出来る、というメリットが1つあることと、リッチテキストを扱う事が出来る事=リッチテキストファイル(RTF)を読み書きする事が出来る、というメリットもあります。
リッチテキスト(書式付テキスト)とは、文字装飾(文字の大きさや色など)や段落書式などを含む事が出来るテキスト形式のことで、このリッチエディットは、リッチテキストを扱う事が出来るため、簡易なワープロソフトのような事が比較的簡単に出来るようになります。Microsoft Word で作成した文書をRTF形式で保存したものを、開く事も出来るようになります(※読めないデータもあります)
 
まぁ、ワープロみたいな機能とまでは必要がなくても、長めのテキストファイルも扱えるようになるというメリットだけでも結構使えます。
 
文章の内容は、メモ同様、TStrings型の Linesプロパティとなっており、デザイン時にも編集出来ますが、プログラムコードで、String型のLines[0](1行目)、Lines[1](2行目)、Lines[2](3行目)・・・として別々にアクセスすることが出来ます(※存在しないものにはアクセスできません)。全ての行を合わせて1つの文字列として扱う場合は Textプロパティとして扱えます。リッチエディットに1行の文字列を加える場合は、RichEdit1.Lines.Add('〜〜')、途中に1行の文字列を挿入する場合は、RichEdit1.Lines.Insert(〜)、ある特定の1行を消す場合は、RichEdit1.Lines.Delete(〜)、リッチエディットの行数を知りたい場合は、RichEdit1.Lines.Count で分かります。
 
リッチエディットで、リッチテキスト(書式付テキスト)を扱う場合は、PlainText プロパティを「False」にします(デフォルト)。リッチテキストではなく通常のテキストを扱う場合には、PlainText プロパティを「True」にします。

 
<オブジェクトインスペクタ>でプロパティを見てみます。メモと共通のプロパティも多く、その使い方も同じである場合も多いです。
 
外観として一番気になるのは、スクロールバーの有無、つまり、ScrollBarsプロパティでしょうか。
ssBoth下端(水平)と右端(垂直)両方にスクロールバーを付ける
ssHorizontal下端に水平スクロールバーを付ける
ssNoneスクロールバーなし(デフォルト)
ssVertical右端に垂直スクロールバーを付ける
ですが、特に、水平スクロールバーですが、水平スクロールバーを付けない場合は、文字入力が画面の右側まで一杯になると自動的に改行される事になります。つまり、文字列1行1行の長さは、リッチエディットの横サイズで制限される事になります。水平スクロールバーを付けると、改行キーを押さない限りは改行されません(但し、WordWrapプロパティに注意)。つまり、リッチエディットの横サイズに制限される事は無くなる訳です。
実際にアプリケーションプログラムを作ってみると、プログラムのスタイルによってこの違いが重要になる場合もあります。
 
HideScrollBarsプロパティは、「True」(デフォルト)にすると、スクロールバーが不要な場合(入力文字列が右端/下端まで達していない場合)にはスクロールバーは表示されません。「False」にするとスクロールバーは常に表示されます(入力文字列が右端/下端まで達していない場合は、スクロールバーはグレー状態で操作できません)。
 
WordWrapプロパティは、「True」(デフォルト)にすると、文字バランスや句読点などを自動認識して自動的に改行状態に見せるようになります(実際に改行コードが入っている訳ではありません)。「False」にするとそのような自動処理は行われません。見た目的には、水平スクロールバーを付けない場合には、これを「True」にしておいた方が良い場合もあります。
しかし、水平スクロールバーを付ける場合=改行は明確に行いたい、という場合には、このWordWrapプロパティが「True」になっていると不明瞭な動作をしてしまう場合が多いです、というのは Delphi1〜7でよく経験した事ですが、水平スクロールバーを付ける場合は必ず、WordWrapプロパティを「False」にしておきます。
ヘルプでは「WordWrap が true の場合,水平スクロールバーは使用できません。」と書かれていますが<オブジェクトインスペクタ>では指定出来てしまいます。
 
 
WantReturnsプロパティは、「True」(デフォルト)にすると、リッチエディット内で[Enter]キー入力(=文章の改行指定)を使えるようになります。フォーム内では、例えば[OK]ボタンがあるとして、それを Default ボタンとして登録すると、[Enter] キーを押すとその[OK]ボタンを押した、というようになります。WantReturnsプロパティが「False」になっていると、文章入力の際に、改行しようとして [Enter]キーを押せば、文章の改行ではなく、上記のデフォルトボタンを押した、という処理が行われてしまいます。この場合でも、[Ctrl]キーを押しながら[Enter]キーを押す事によって文章の改行は出来るのですが、[Ctrl]キーを押すという操作がまずいという場合には、WantReturnsプロパティを「True」にしておく事です。
 
WantTabsプロパティも同様に、「True」にすると、リッチエディット内で[Tab]キーを押す事により文章内でタブ文字(半角8文字ずつの文字飛ばし)を入力する事が出来るようになります。「False」(デフォルト)の場合は出来ません。Windowsアプリケーションでの [Tab]キーの役割は、主として、フォーカス移動となっています。[Tab]キーを押せば次のコントロールにフォーカスが移動され、[Shift]キーを押しながら[Tab]キーを押せば直前のコントロールにフォーカスが移動されます。リッチエディットでは同様にこの場合も、[Ctrl]キーを押しながら[Tab]キーを押す事によって、文章内でタブ文字を入力する事は出来ますが、WantTabsプロパティを「True」にする事によって、[Tab]キーを押すだけでタブ文字を入力出来るようになります。
しかし、[Enter]キーの場合とは異なり、[Tab]キーでのフォーカス移動が出来なくなるという事は、キーボード操作が出来なくなる=マウスやペン等で操作をせねばならない、という事になってしまう為、「False」がデフォルト状態となっています。
 
 
ReadOnlyプロパティは、「False」(デフォルト)であればリッチエディット上で文字入力編集が出来る状態、「True」にするとリッチエディット上で文字入力編集が出来なくなる状態となります(※プログラムコードでは文字入力編集は可能です)。参考文書などを表示したい(入力編集させたくない場合)には、このプロパティを「True」にすると良いと思います。
 
そのほか、<オブジェクトインスペクタ>を見た感じでは、特に記述する必要もない感じはします。
 
 
実行時のプロパティやメソッドでは、いろいろな機能があるようです。
 
ヘルプを見ると、まず気になるのは、CaretPosプロパティ。キャレット位置を示すもので、X位置・Y位置(文字単位)で扱う事が出来るようです。Delphi2010での String型は Unicodeですので、X方向(横方向)はバイト単位ではなく、文字単位ですね。例えば、OnKeyUpイベントハンドラで
procedure TForm1.RichEdit1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
 Label1.Caption := IntToStr(RichEdit1.CaretPos.X) + ',' + IntToStr(RichEdit1.CaretPos.Y) ;
end;
のようにすれば、キーを押した後の現在のキャレット位置が表示されて分かるわけですね(マウスクリック時の場合も必要ならそちらで同様に行う事)。関連で、SetCaretPosメソッド、GetCaretPosメソッド、という機能もあるようです。
 
次に、リッチテキスト(書式付テキスト)が扱えるとの事ですので、リッチテキストを扱うにはどのようにするか、についてですが、まず、フォント等の指定については、デフォルト(文章全体)のテキスト属性 DefAttributesプロパティと、選択したテキスト・これから入力するテキストの属性 SelAttributesプロパティです。双方ともTTextAttributes型となっています。このプロパティは更に、文字の色を指定する Colorプロパティ、フォント名を示す Nameプロパティ、文字サイズをポイント数で示す Sizeプロパティ、文字スタイルを示す Styleプロパティ、などを持ちます。ですので、文字を作図する前に例えば
RichEdit1.SelAttributes.size := 24;
のようにすれば、以降に入力する文字のサイズは24ポイントになります。
 
また、リッチエディットは、Paragraphプロパティを持ちます(TParaAttributes型)。このプロパティは更に、テキストの位置合わせを指定する Alignmentプロパティ、1行目の左余白からのインデントサイズを示す FirstIndentプロパティ、左マージンからのインデントサイズを示す LeftIndentプロパティ、右マージンからのインデントサイズを示す RightIndentプロパティ、などを持ちます。例えば
RichEdit1.Paragraph.Alignment := taCenter ;
のようにして以降に文字を入力すると、それらは中央配置の文字となります。リッチエディットの横幅サイズに対しての中央合わせです。水平スクロールバーを表示させての文字列のサイズに対しての中央合わせではありません。
 
これらを組み合わせる事によって色々な文字装飾の可能なテキスト文書を作成する事が出来ると思います。
 
 
そして、保存を行う場合ですが、PlainText プロパティが「True」の場合は、メモ同様、通常のテキストファイルとして扱われて保存されます(ファイルの拡張子は「.txt」等)。「False」の場合は、リッチテキスト(書式付テキスト)として扱われますので、リッチテキストファイル(RTFファイル)として保存されます(ファイルの拡張子は「.rtf」)。
ファイル保存の方法は、メモ同様、シフトJISとして行う場合は
var
 fn : string ;
begin
 if (SaveDialog1.Execute) then begin
  fn := SaveDialog1.FileName ;
  try
   RichEdit1.Lines.SaveToFile(fn);
  except
   ;
  end;
 end;
end;
Unicodeとして行う場合は
var
 fn : string ;
begin
 if (SaveDialog1.Execute) then begin
  fn := SaveDialog1.FileName ;
  try
   RichEdit1.Lines.SaveToFile(fn,TEncoding.Unicode);
  except
   ;
  end;
 end;
end;
のようにすれば良いようです。
リッチテキストファイル(RTFファイル)は、Microsoft Word でも開けますが、Windowsに付属の「ワードパッド」でも開く事が出来ます。

 ↓ RTFファイルを作成しワードパッドで開く

 
クリップボード経由でも、リッチテキストの場合は、同様に書式付のテキストとしてコピー&貼り付けを行う事が出来ます。
 
 
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
>Delphi入門編
>Delphi2010
▲2010/10/03
 2010/10/04
▼2010/10/05
 
シェアウェア
Script!World
データベース
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015. By AFsoft All Rights Reserved.