Memoを使って横スクロールバーの付いたEditを作る
36 NoCRLFMemo 動作確認 Delphi2007 更新日 2008/01/19(土)

一行Editに横スクロールバーをつけたい時には
TMemoを使って、改行されるのを防止しましょう。

Memoにイベントを設定して
改行コードが入力されるのを防止できます。
────────────────────
//入力時
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
  if (Key = Chr(VK_RETURN)) then
  begin
    Key := #0;
  end else
  //↓Ctrl+Enterを押した時#10が押された事になるので防止する
  if Key = #10 then
  begin
    Key := #0;
  end;
end;

function InStr(const SubStr, S: string): Boolean; overload;
begin
  Result := (1 <= (AnsiPos(SubStr, S)));
end;

//クリップボードからの貼り付け時
procedure TForm1.Memo1Change(Sender: TObject);

    //貼り付け時に改行コードが含まれている時に削除する対策
    procedure DeleteStringMemo(Memo: TMemo; S: String);
    var
      BufferSelStart, BufferTextLength: Integer;
    begin
      if InStr(S, Memo.Text) then
      begin
        BufferSelStart := Memo.SelStart;
        BufferTextLength := Length(Memo.Text);
        Memo.Text := StringReplace(Memo.Text, S, '', [rfReplaceAll]);

        Memo.SelStart := BufferSelStart -
          (BufferTextLength - Length(Memo.Text));
        {↑SelStart位置が改行文字削除されていても正しく調整している}
      end;
    end;

begin
  if not (Sender is TMemo) then Exit;

  DeleteStringMemo(TMemo(Sender), #13);
  DeleteStringMemo(TMemo(Sender), #10);
end;
────────────────────

そして1行Editと同じ高さになるようにします。
────────────────────
function GetTextHeight(Font: TFont;  s: String): Integer;
begin
  with TBitmap.Create do try
  Canvas.Font.Assign(Font);
  Result := Canvas.TextHeight(s);
  finally Free; end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.ScrollBars := ssHorizontal;
  Memo1.WordWrap := False;

  Memo1.Height :=
    2 +
    GettextHeight(Memo1.Font, 'H') + //1行の文字の高さ
    2 +
    GetSystemMetrics(SM_CXHSCROLL); //スクロールバーの高さ
  Memo1Change(Memo1);
end;
────────────────────

実行結果は次の通り


参考────────────────────
Delphi Technic - DelFusa Floor
『あるフォントで文字列が描画されるサイズを求める』のテクニック