TEditor で 疑似 フリー カーソル を
アドベンチャーゲームシステム FreeLANGuex は、中のエディタに Delphi のエディタコンポーネントの TEditor を使用させて頂いています。
最近は例のアレをつくってる関係でよくシステムをさわっているのですが、Dos 時代の人間として Vz (Wz) の疑似フリーカーソルの動きがどうしても欲しくなってきたので、ちょこっと継承して拡張しました。
検索してもうまいこと引っかからなかったので、似たようなこと考えるヒトいるかなあ――と、メモ的に僕が改造した所の要所を記載しておきます。
間違えてたらごめんね。
- 疑似フリーカーソルとは、上下スクロールをさせている場合に限り、カーソル位置が行末を超えても移動せずにそのままの位置をキープ。ただし、文字を入力した場合はエディタ的に行末に文字列が挿入されるような動きです。
うーむ、文章だとなかなか上手く動きが説明できないな。個人的にはすごく好きな動きなんですけどねー。
1
適当なフラグを作成します。
ここでは例として caret のプロパティに「VzFreeRow」を追加作成しました。
(プロパティの記載の仕方がよくわからない場合は、HEditor.pas の NextLine あたりを参考にするとよいかもです)
2
HEditor.pas の 11962 行付近、以下の記載の部分を探します。    end
    else
      // 行終端より右か、空白行の最初の文字
      // waRapped な行では発生しない
      Buf := S + StringOfChar(#$20, Si - Length(S)) + Source;
    FList.CheckCrlf(Re, Buf);
次のように変更します。
Caret.FVzFreeRow がフラグの箇所です。
    else
    begin
      // 行終端より右か、空白行の最初の文字
      // waRapped な行では発生しない
      if (Caret.FVzFreeRow) then
      begin
        // *Y* 疑似フリーカーソル
        Buf := S + Source;
        SelIndex := SelIndex - (Si - Length(S));
      end else
        Buf := S + StringOfChar(#$20, Si - Length(S)) + Source;
    end;
    FList.CheckCrlf(Re, Buf);
3
あとはフォームからこんな感じで呼び出して VzFreeRow を True にしてあげます。
呼び出しの際は下のように、FreeCaret := False , FreeRow := True , KeepCaret := True , NextLine := True にあわせて変えてあげるとそれっぽくなってよい感じです。
begin
    // 疑似フリーカーソル
    Editor1.Caret.VzFreeRow := True;
    Editor1.Caret.FreeCaret := False;
    Editor1.Caret.FreeRow   := True;
    Editor1.Caret.KeepCaret := True;
    Editor1.Caret.NextLine  := True;
end;
まあアレです。スペースで埋めるように記載してある部分を押し返しただけなんですけどね(^^;
参考になったら幸いです。間違ってたら突っ込んでくださいな。



