二つのRichEditの文字サイズや行間を統一するには?

解決


かめ  2005-12-22 06:02:03  No: 19363

度々失礼します。D2005・Win32・WindowsXPでエディタを作成しています。
タイトルのとおりですが、フォームに二つのRichEditをつくり、ひとつは左側において、もうひとつは全体表示(Align:alClient)にしました。
全体表示=RichEdit1、左側=RichEdit2としています。
RichEdit2はRichEdit1が改行されて行が増えるたびに「行頭番号」を生成するようにしています。
そのプログラム自体はまったく問題なく動くのですが、二つのRichEditの文字の縦の行間(ごめんなさい、うまい言い方が出来ないのですが…)が違っていてRichEdit2の行頭番号がRichEdit1の行からずれていってしまうのです。

検索で文字サイズ・フォントサイズ・行間などなど(もちろんDelphiといれて)探しては見たのですが、どうもうまく出来なくてかなり見栄えが悪くなってしまっています。

こんな感じです↓
RichEdit2  :RichEdit
1行        :あ
           :い
2行        :う      
(命令どおりちゃんとRichEdit1の行が増えるたび、RichEdit2の行頭番号は増えます)
よろしくお願いします。


Mr.XRAY  URL  2005-12-22 08:12:50  No: 19364

>RichEdit1の行からずれていってしまうのです。

行がずれるのを単に行が増加する状態と解釈します.つまり,行間が変化す
るのではないという意味です.

>RichEdit1が改行されて行が増えるたびに「行頭番号」を生成

RichEdit1に文字列をキーボードから入力していく場合は,改行文字を判定し
ていけばこのような現象は,まずないと考えられます.

一方,コードでRichEdit1にテキストを代入後,改行を判断する時は,
RichEditのWordWrapプロパティとテキストの読込み方式,そしてその設定時
期(設計時か実行時か)に関係してきます.

これによって,元の文章の本来の改行位置以外に,RichEdit1の折返し部
(右端)に改行文字が挿入されてしまうことも考えられます.とりあえず,
RichEdit1のWordWrapをFalseにして様子をみたらどうでしょう.


かめ  2005-12-23 01:43:13  No: 19365

Mr.XRAYさんありがとうございます。
わかりにくい説明だったようで申し訳ありません。
RichEdit1で改行文字を判定…という形ではないです。
以下が一部分なんですが…
----
procedure TForm1.RichEdit1Change(Sender: TObject);
var
  i,j,k : Integer;
begin
  i := RichEdit1.Perform(Em_LineFromChar,$FFFF, 0);   //iにRichEdit1の最終行を代入
  j := RichEdit2.Perform(Em_LineFromChar,$FFFF, 0);   //jにRichEdit2の最終行を代入

  if ((i>=j)=true) then
    begin
      for  k:=j to i do                             //kにjを代入し、iになるまで
      begin
        RichEdit2.Lines.Add(IntToStr(k+1)+'行:');      //RichEdit2に行数を加えていく
      end;
    end
  else
    begin                                         //もし、iは(j-1)未満で
      if ((i<j-1)=true) then
        begin
          if((i<j-2)=true) then                   //かつ、(j-2)未満なら
            begin
              RichEdit2.Lines.Clear;
              for k:=0 to i do
                begin
                  RichEdit2.Lines.Add(IntToStr(k+1)+'行:');         //RichEdit2に行数を加えていく
                end;
              end
          else                                    //iが(j-1)未満で(j-2)以上のとき
            begin
              RichEdit2.Lines.Delete(j-1);            //RichEdit2の最終行を削除
              SendMessage(RichEdit2.Handle, WM_VSCROLL,SB_LINEDOWN, 0);
            end
         end
      end
end;
------
こんな形にしています。

>RichEdit1のWordWrapをFalseにして様子をみたらどうでしょう
ということでやってみたのですが、やはり変わらないようです。

すでに
RichEdit1とRichEdit2は文字を表示する最初の開始位置自体がすこしずれているような感じです。
行が増加するという形ではなく、Fontのプロパティで言えばHeightですね。
二つとも同じ-11で設定していますが、文字と文字の縦の余白が一致しないという感じです。


かめ  2005-12-23 02:34:01  No: 19366

すいません、何とか擬似的ではありますが自己解決できました。
根本的な解決ではないのですが、とりあえずはこれでよしということで終わらせます。
すいませんでした。


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

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






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