掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
長いURLを折り返して表示するには? (ID:30823)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> 半角スペース部分で改行されて表示されるのですね。 おそらくそういう仕様なんだと思います。 > TMemoの幅に合わせた位置で改行されて欲しいのですが、 TEditorのようなカスタムコンポーネントは、上記のような挙動を実現しています。 Memoでやるとなると少々面倒かも知れません。 一応私が考えついた頭の悪い方法を載せておきますので参考程度にどうぞ。 procedure TForm1.SetWrap(S: String); var Buf: WideString; MW: Integer;//Memo幅 CurrentSW,NextCW: Integer;//現在の文字列の幅、次の文字の幅 SC: Integer;//文字数 i,Spos: Integer;//現在のインデックス begin //改行位置を決定する Buf:= S; MW:= Memo1.ClientWidth -10;//Memo幅 i:= 1; Spos:= 1; repeat CurrentSW:= Self.Canvas.TextWidth(Copy(Buf,Spos,i-Spos+1)); NextCW:= Self.Canvas.TextWidth(Copy(Buf,i+1,1)); if CurrentSW + NextCW >= MW then begin Insert(#13#10,Buf,i+1); Inc(i,Length(#13#10)+1); Spos:= i; end else begin Inc(i); end; SC:= Length(WideString(Buf)); until (i = SC); Memo1.Lines.Text:= Buf; end; 上記の手続きを文字列を更新する際またはリサイズの際などに呼んでください。 文字の幅とMemoの幅を計算して端にたどり着いたら改行するというやり方です。 一応プロポーショナルフォントも等幅フォントのどちらでも大丈夫です。 ただし、いろいろ問題があります。 とりあえず表示することしか考えていません。 Memoの内容をユーザーが編集する場合は多分ややこしいことになります。 また、ファイルのフルパス表示に使用したいとのことでしたので、 引数の文字列は1行しか想定していません。 (複数行を指定する場合、少し弄らないとダメです) 更にTMemoがCanvasを持っていないため、親であるFormのCanvasでTextWidthを呼んでいます。 この関係でFormとMemoのフォント名、サイズ等が異なると破綻します。 って、これじゃ使い物にならないか・・・ TEditorなどを用いる方が遥かに無難ですね。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.