長いパス名や長い文字列を一部[...]と表示する方法
46 LongTextPathMinimize 動作確認 Delphi2007 更新日 2008/01/29(火)

表示したい文字列が長すぎて
Gridのセルや、ラベル、MenuItemの幅が足りなくて
表示できなかったり、表示したくなくて、
一部を[...]と変換したい場合があります。

ファイルパスの場合と普通のテキストの場合とでやり方が違います。


ファイルパスが長い場合に C:\..\abc\def と表示するには
MinimizeName 関数を使用します。
uses FileCtrlが必要です

ヘルプによると
> MinimizeName は,ファイル名のパス部分のディレクトリをドットで置換し
> 名前の長さを指定されたピクセル数に合わせます。
とのことで、定義は次のようになります。

    function MinimizeName(const Filename: TFileName;
     Canvas: TCanvas; MaxLen: Integer): TFileName;

TFileNameは文字列を指定して、MaxLenはピクセル数を指定します。
引数にCanvasを指定しているから文字列描画のPixcel幅を求められます。


また、
ファイルパスではない文字列を ABCDEF... と表示するために
文字列の最後を[...]に変換する関数を作りました。
────────────────────
//長い文字列を指定サイズで[...]を付加する処理
function MinimizeString(S: String; Canvas: TCanvas; MaxLen: Integer): String;
begin
  Result := S;
  if Canvas.TextWidth(S) <= MaxLen then Exit;

  while (MaxLen < Canvas.TextWidth(S+'...')) do
  begin
    SetLength(S, Length(S)-1);
  end;
  Result := S + '...';
end;
────────────────────

MinimizeNameとMinimizeStringの動作確認をしてみます。
Label1が上、Label2が下にして align := alTopにしてFormに配置して
次のコードを書きました。
────────────────────
const RADStudioPath = 'C:\Program Files\CodeGear\RAD Studio\5.0\bin\bds.exe';
procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := MinimizeName(RADStudioPath,
    Label1.Canvas, Self.ClientWidth);
    
  Label2.Caption := MinimizeString(RADStudioPath,
    Label2.Canvas, Self.ClientWidth);
end;
────────────────────
動作画面は次のようになります。

十分に描画できるサイズ


少し幅を狭くしました


更に幅を狭くしてみました。


ものすごく幅を狭めました。



参考────────────────────
Delphi広場11928

Delphi Acid Floor 長いファイル名の途中を省略する
http://www.wwlnk.com/boheme/delphi/tips/tec1220.htm

備考────────────────────
PathCompactPath という関数もあるようです。