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
『あるフォントで文字列が描画されるサイズを求める』のテクニック
|