HTMLエディタを作る(5)(1999/04/04)

この連載も5回目になって、そろそろ形になってくれればとは思うのだが、作業は遅々として進んでいない。着色問題は当初の予想を遥かに上回って多岐に渡る処理が必要であった。

単純に入力される時のケースで見ても、

  1. 範囲選択なし、キーボードから直接入力
  2. 範囲選択なし、クリップボードから張り付け
  3. 範囲選択あり、キーボードから直接入力
  4. 範囲選択あり、クリップボードから張り付け
となる。この変化の中に、削除されたり追加されたりする「<」と「>」の対応をもとに再着色されなければならないが、消えゆく文字列は解かっても新たに挿入される文字が解からなかったりして、事は単純には進まないようだ。極端に言えば、変更が発生した後で、全文に対してチェックした方が簡単だとさえ言えるだろう。

ここまでやって、何故SORCERERが構文着色を実装しなかったか、ようやく見えてきたような……まぁしかし俺は諦めないぞ!



とにかく、この技術突破なくして俺専用エディタはないわけだから、なんとか踏ん張って……いやしかし、「<」と「>」が絡むとホント、へろへろっす()

要するに、ですよ。ある特定一点の書式属性が得られれば話はトントンと進むんですがね……。調べたい位置に逐一キャレットを飛ばしてSelAttibuteするのも大概ですんで……ふむ。そりゃ仕方がないか……。

まぁ、望みは一旦、Delphi−ML(のバックログ)なりDelphi広場なりに託したいと思いますが



セーブ時にタグごと保存されてしまう件で、暫定的に以下の様なコードを書いていた。

procedure TfrmAppMain.FileSaveExecute(Sender: TObject);
var
 Buff: TStringList;
begin
 if dlgSaver.Execute then
 begin
  Buff := TStringList.Create;
  Buff.Text := frmEditor.Editor.Text;
  Buff.SaveToFile(dlgSaver.FileName);
  Buff.Free;
 end;
end;

これは単にTextプロパティには自身を保存するメソッドがないことからだったのだが、ひょんな事から別の解決方法を発見。即ち、一時的にPaneTextプロパティをTrueにするのである。

procedure TfrmAppMain.FileSaveExecute(Sender: TObject);
begin
 if dlgSaver.Execute then
 begin
  frmEditor.Editor.PlainText := True;
  frmEditor.Editor.Lines.SaveToFile(dlgSaver.FileName);
  frmEditor.Editor.PlainText := False;
 end;
end;

俺個人としては「こんなプロパティあったっけ〜?」てなもんだけど(汗)

ちなみに、このプロパティを常時Trueにしておいても期待した動作にはならない。読み込み時にTrueであった場合、付加したRTFタグをも単なるテキストとして取り込んでしまうからだ。あくまでも、「エンコードされた書式情報を無視する」ためのプロパティのようで……

常識的には、
  frmEditor.Editor.Tag := ord(frmEditor.Editor.PlainText);
  frmEditor.Editor.PlainText := True;
  frmEditor.Editor.Lines.SaveToFile(dlgSaver.FileName);
  frmEditor.Editor.PlainText := Boolean(frmEditor.Editor.Tag)
みたいな待避と復元が望ましいのだろうけど。



そんなわけで現段階で以下に駄目かと言うサンプルです……サイズ縮小のためにパッケージコンパイルにしようかと思ったんですが、ランタイムが必要ですのでDelphi4を持ってないと辛いでしょうし……それならソースコード単品でも良いはずなんだけど、それじゃあんまりだと言う事で、普通に書庫化してみました(笑)

もちろんソースコードも付属しましたので参考に……するところなんてないな……自分で書いたの何百行あるんだか……。まっいいや。


ダウンロードする(HM000.LZH/262KB)