目標がRitchEdit上で\beginと入力したら、
\begin
{
{
と表示されて、カーソルが{}の真ん中の行に持っていくという
プログラムなんですけど、
procedure TForm1.RichEdit1KeyPress(Sender: TObject; var Key: Char);
var
LineNo,CP : Integer;
buf : String;
FCheckLineNo : Integer;
begin
// カーソルのある行番号とその行の先頭文字位置を取得
LineNo := SendMessage(RichEdit1.Handle,EM_LINEFROMCHAR,-1,0);
CP := SendMessage(RichEdit1.Handle,EM_LINEINDEX,LineNo,0);
// OnChangeでのスペルチェック行を設定
FCheckLineNo := LineNo;
// カーソル行先頭からカーソル位置までの文字+今入力された文字を取得
buf := Copy(RichEdit1.Text,CP + 1,RichEdit1.SelStart - CP) + Key;
// 後ろが'\begin'であれば...
if AnsiEndsStr('\begin',buf) then
begin
// 今入力された文字と'{ }'行を挿入
RichEdit1.SelText := Key;
RichEdit1.SelText := #13#10 + '{' + #13#10 + #13#10 + '}' + #13#10;
// カーソル位置を '{}'の間に移動
RichEdit1.SelStart := CP + Length(buf) + 3;
Key := #0;
end;
と教えていただいたんですが、
実行してみると、RitchEditの先頭行では予想通り実行されるんですが、
行数を変えると実行されないのですが違う行数でも予想通り実行
されるにはどのようにすればよろしいのでしょうか?
> RichEdit1.SelStart := CP + Length(buf) + 3;
↑この行、タイプミスしてますよ。
正しくは...
RichEdit1.SelStart := CP + Length(buf) + 5;
です。
私なら、
\begin
{
まで挿入したらSelStartを記憶して、
}
を挿入後、SelStartを戻します。
ツイート | ![]() |