4

Firemonkey でボタンまたはラベルのテキストを短縮するための省略記号/楕円化ルーチンはありますか? たとえば、次のようにします。

「C:\a really\really\really long\very long path\さらに長いパス名」「C:\a really\re...」 または 「C:\a really\re...path name」に

VCL の周りにはルーチンがありますが、Firemonkey のテキスト サイズを見つけることはより複雑になるようです。

Delphi XE3 で Firemonkey 2 を使用しています

前もって感謝します

... OK、Mike Sutton のアドバイスから不格好な手順を作成しました。文字列の最初の部分の末尾に省略記号を追加するだけですが、中間または末尾の省略記号の位置については非常に簡単に変更できます。また、現在のオブジェクトのフォント サイズとスタイルも考慮されます。

使用法は次のとおりです。

ShortenText(Button1, 'Start of text blah blah blah blah the END is here');

procedure ShortenText(anFMXObject: TTextControl; newText: string);
var
  aTextObj: TText;
  shortenTo: integer;
  modText: string;
begin
  if Length(newText) > 2 then
  begin
    modText:= newText+'...';
    aTextObj:=TText.Create(anFMXObject.Parent);
    aTextObj.Font.SetSettings(anFMXObject.Font.Family,
                          anFMXObject.Font.Size,
                          anFMXObject.Font.Style);
    aTextObj.WordWrap:= false;
    aTextObj.AutoSize:= true;
    aTextObj.Text:= newText;
    // this next bit generates the change necessary to redraw the new text (bug in XE3 as of Oct 2012)
    aTextObj.HorzTextAlign:= TTextAlign.taCenter;
    aTextObj.HorzTextAlign:= TTextAlign.taLeading;
    // now shorten the text:
    shortenTo:= round((Length(modText)/aTextObj.Width)*anFMXObject.Width)-1;
    modText:= LeftStr(modText, shortenTo-3)+'...';
    anFMXObject.Text:= modText;
    FreeAndNil(aTextObj);
  end;
end;
4

1 に答える 1

1

AutoSize を True に設定し、Wrap を False に設定して TText を使用することをお勧めします。そうすれば、Width プロパティを簡単に読み取ることができます。

XE3 にはバグがあり、実行時に Text プロパティを設定しても内容が更新されないことに注意してください。そのため、Realign を手動で呼び出す必要があります (これは保護されているため、TText をサブクラス化してこれを機能させる必要があります)。 )。

于 2012-10-25T16:35:07.683 に答える