4

Vcl.FileCtrl ユニットの MinimizeName 関数を使用して TLabel に非常に長いファイル名を付けようとしていますが、関数で使用される MaxLen パラメータを取得する方法がわかりません。値をハードコーディングすると、有効な結果が表示されます。しかし、フォームはサイズ変更できるので、動的にしたい=サイズ変更イベントで変更します。

lblLicenseFile.Width // 文字列が長すぎる lblLicenseFile.Width - 10 //文字列が長すぎる Trunc(lblLicenseFile.Width / lblLicenseFile.Font.Size) //文字列が非常に短い

このピクセル数を計算する何らかの方法が必要です

MinimizeName(const Filename: TFileName; Canvas: TCanvas; MaxLen: Integer): TFileName; MaxLen は、キャンバスにファイル名を描画するために使用できる長さ (ピクセル単位) です。

4

2 に答える 2

3

フォームのサイズ変更の依存関係を取り除くために、スプリッターなどを使用している場合にもサイズ変更が発生する可能性があります。CanResize イベントをオーバーライドして、キャプションを適応させることができます。

例として:

unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TLabel = Class(StdCtrls.TLabel)
  private
    FFullCaption: String;
    procedure SetFullname(const Value: String);
  published
    function CanResize(var NewWidth, NewHeight: Integer): Boolean; override;
    property FullCaption: String read FFullCaption Write SetFullname;
  End;

  TForm3 = class(TForm)
    FileNameLabel: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;

implementation

uses FileCtrl;
{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
begin
  FileNameLabel.FullCaption := 'C:\ADirectory\ASubDirectory\ASubSubDirectory\AFileN.ame'
end;

{ TLabel }

function TLabel.CanResize(var NewWidth, NewHeight: Integer): Boolean;
begin
  inherited;
  if Assigned(Parent) then
    Caption := MinimizeName(FFullCaption, Canvas, NewWidth)
end;

procedure TLabel.SetFullname(const Value: String);
begin
  FFullCaption := Value;
  Caption := MinimizeName(FFullCaption, Canvas, Width)
end;

end.
于 2013-05-06T11:13:58.213 に答える
3

ラベル コントロールがパスを自動的に短縮できるようにするには、AutoSizeプロパティを False に設定し、最近のバージョンの Delphi を使用している場合はEllipsisPositionプロパティを に設定します。epPathEllipsis

于 2013-05-06T11:16:28.740 に答える