長いURLを折り返して表示するには?

解決


Flav  2008-05-29 19:36:57  No: 30819  IP: [192.*.*.*]

エディットかメモにて、
長いURLを折り返して表示させたいのですが、やりかたが見つかりません。
どのようにするのでしょうか?

もし出来ないのでしたら、長いURLを折り返して表示させたい場合には
何を使うのがよいのでしょうか。

アドバイスよろしくお願いいたします。

編集    削除
ぼるしち  2008-05-29 20:00:26  No: 30820  IP: [192.*.*.*]

こんにちは。

TMemoであればWordWrapをTrueに設定すれば折り返されて表示されるはずです。

編集    削除
Flav  2008-05-29 20:08:08  No: 30821  IP: [192.*.*.*]

ぼるしちさん、ありがとうございました。
WordWrapをTrueでできました。

ところで・・・・
別の用途で、ファイルのフルパス表示にもこの機能を使いたいのですが、
半角スペース部分で改行されて表示されるのですね。

    C:\Program Files\abcd\efgh\abcde fgh.exe
        ↓
    C:\Program 
    Files\abcd\efgh\abcde fgh.exe

TMemoの幅に合わせた位置で改行されて欲しいのですが、
どうすれば実現できるでしょうか・・・。

編集    削除
Mr.XRAY  URL  2008-05-30 00:32:01  No: 30822  IP: [192.*.*.*]

TRichEditを使うというのはダメですか?
RichEditはコンポーネントパレットの[Win32]にあります(Delphi7の場合)。

編集    削除
ぼるしち  2008-05-30 00:59:32  No: 30823  IP: [192.*.*.*]

> 半角スペース部分で改行されて表示されるのですね。

おそらくそういう仕様なんだと思います。

> 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などを用いる方が遥かに無難ですね。

編集    削除
Flav  2008-05-30 23:26:57  No: 30824  IP: [192.*.*.*]

ありがとうございます。

>Mr.XRAYさん
TRichEditだと可能ですか....フムフム

>ぼるしちさん
>頭の悪い方法
こういう方法、いざ自分でやろうとしたら全くわからないので勉強になりました。
TMemoというのは、これですね。....フムフム
http://homepage3.nifty.com/~katsuhiko/delphi.html

せっかくなので両方使ってみて、他にできる事なども勉強してみます。
ありがとうございました。

編集    削除