エディットかメモにて、
長いURLを折り返して表示させたいのですが、やりかたが見つかりません。
どのようにするのでしょうか?
もし出来ないのでしたら、長いURLを折り返して表示させたい場合には
何を使うのがよいのでしょうか。
アドバイスよろしくお願いいたします。
こんにちは。
TMemoであればWordWrapをTrueに設定すれば折り返されて表示されるはずです。
ぼるしちさん、ありがとうございました。
WordWrapをTrueでできました。
ところで・・・・
別の用途で、ファイルのフルパス表示にもこの機能を使いたいのですが、
半角スペース部分で改行されて表示されるのですね。
C:\Program Files\abcd\efgh\abcde fgh.exe
↓
C:\Program
Files\abcd\efgh\abcde fgh.exe
TMemoの幅に合わせた位置で改行されて欲しいのですが、
どうすれば実現できるでしょうか・・・。
TRichEditを使うというのはダメですか?
RichEditはコンポーネントパレットの[Win32]にあります(Delphi7の場合)。
> 半角スペース部分で改行されて表示されるのですね。
おそらくそういう仕様なんだと思います。
> 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などを用いる方が遥かに無難ですね。
ありがとうございます。
>Mr.XRAYさん
TRichEditだと可能ですか....フムフム
>ぼるしちさん
>頭の悪い方法
こういう方法、いざ自分でやろうとしたら全くわからないので勉強になりました。
TMemoというのは、これですね。....フムフム
http://homepage3.nifty.com/~katsuhiko/delphi.html
せっかくなので両方使ってみて、他にできる事なども勉強してみます。
ありがとうございました。
ツイート | ![]() |