Richedit の Undoに関して《2000/02/24受信》(2000/03/19)
注意:HTML化のため、改行などを加減しております。
特に断りのない着色は長山の責ですのでご注意ください。
ながやまさん、こんにちは、
おばQ改めOverQこと山本聡です。
ご無沙汰なのですが、
覚えていらっさるでしょうか、
忘れられていても別によいのですが、
以前RichEditに関することで
メールさせていただきました。
ながやまさんのHomePageちょこちょことチェックをいれているのですが、
最近の話題にRichEditのUndo処理に関してのねたがありましたので
メールさせていただきました。
以前、私、ちょっとそのあたりこだわったことがありましたので、
ほとんど無理矢理のメールなのですが、
RichEditで連続UndoRedoするコードを添付させていただきました。
よろしければご自由にご参照くださいませ。
Readmeを作るのが面倒なのでwebには公開していなかったりします。
公開もなんでもご自由に。
使い方は・・・・・・・
たぶんながやまさんなら
ソースのInterfaceを見たら想像がつくものが多いと思います。
ソースの頭の所に
Undo可能なRichEditVxの
Undo処理だけのinterface節を書きましたので
Undo以外の機能が不必要でしたら、
それ以外のメソッドやプロパティは削除していただいて
軽いものにして使えばいいです。
内部のソースの説明は、簡単にしますと
TMemoryStreamを既定個、RichEditVX起動時に作成して
それをリング状に存在すると仮定してUndoメモリにどんどんためていき
Undoが行われるとそれをひとつづつ戻していくというものです。
・・・今ならTlistとかを使ってスタック(?)っぽく
入れたTmemoryStreamを順番に返すようなコーディングができそうなのですが
RichEditVxを作った時点では(って半年ほど前なのですが)
そんなこと、思いもつかなかったので
残念ながら
Undoバッファの数はソース中のconstで埋め込んであります。
それを増やしてコンパイルしますとUndo回数が増えます。
たとえばの内部コードなのですが
このようなメソッドでフォントの名前を変更します。
procedure TRichEditVx.SetSelName(Value: String);
begin
if (SelAttributes.Name=Value)
and (caFace in SelAttributes.ConsistentAttributes) then exit;
//変更する必要の無い場合は変更しない。
SaveUndoMemory(umChange);
SelAttributes.Name := Value;
end;
これをすることで選択した部分のfontの名前を変更したい場合に
前のテキストの状態がUndoバッファに書き込んでから
変更されるという動作になりますので
RichEdit.textのHTMLタグの色を高速に付け替えるまえに
SaveUndoMemory(umChange)
をしておきますと
連続Undoに組み込まれると思います。
HenkanJは半角全角変換ユニットで、Niftyとかインターネットとかで
delphiTech200という本についてくる有名なものです。
undo処理とは関係ないもののRichEditVxの機能に取り込みたかったので
usesしております。
突然のメールで
しかも添付メールで
文章も投げやりで
ほぼスパムメール級の迷惑メールっぽいですが、
よろしければ、コーディングの参考にしていただきますと幸いです。
あ、参考にならないっていうのでしたら、
「ぽいっ」とごみ箱にでも捨ててやってくださいませ。
それでは失礼いたします。
…今回のメールはSubjectを書きましたよ。
OverQ さん、お手紙どーもでした!