このプログラムをどのように改良すれば・・・


すなくじら  2005-11-09 01:25:11  No: 18524

目標が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の先頭行では予想通り実行されるんですが、
行数を変えると実行されないのですが違う行数でも予想通り実行
されるにはどのようにすればよろしいのでしょうか?


masayan  2005-11-09 01:47:02  No: 18525

> RichEdit1.SelStart := CP + Length(buf) + 3;

↑この行、タイプミスしてますよ。
正しくは...

  RichEdit1.SelStart := CP + Length(buf) + 5;

です。


にしの  2005-11-09 02:02:51  No: 18526

私なら、
\begin
{
まで挿入したらSelStartを記憶して、
}
を挿入後、SelStartを戻します。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加