![]() |
AW: Text zur Anzeige kürzen mit Punkten hinten
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat:
Auf jeden Fall wird z. B. das "ü" intern ("Lokale Variablen"-Fenster) als "#195#188" angezeigt. Wird nun um ein Zeichen gekürzt, steht da noch "#195". Es wird also intern das "halbe ü" weggenommen, was im String als "?" dargestellt wird. Guido. Nachtrag: OK, hab jetzt Folgedes herausgefunden:
Delphi-Quellcode:
Kann das jemand testen?
function GetEllipsisText(Handle: HDC; S: String; MaxWidth: Integer; MaxHeight: Integer = 0;
PathEllipsis: Boolean = False; TextFormat: LongWord = 0): String; var R: TRect; begin Result := UTF8ToAnsi(S); // <-- Konvertieren zu Ansi ... UniqueString(Result); if MaxHeight <= 0 then MaxHeight := 1000; R := Classes.Rect(1, 1, MaxWidth, MaxHeight); TextFormat := TextFormat or DT_CALCRECT or DT_MODIFYSTRING; if PathEllipsis then TextFormat := TextFormat or DT_PATH_ELLIPSIS; if TextFormat and (DT_END_ELLIPSIS or DT_PATH_ELLIPSIS) = 0 then TextFormat := TextFormat or DT_END_ELLIPSIS; DrawTextEx(Handle, PChar(Result), Length(Result), R, TextFormat, nil); SetLength(Result, StrLen(PChar(Result))); Result := AnsiToUTF8(Result); // <-- und zurück. end; Guido. |
AW: Text zur Anzeige kürzen mit Punkten hinten
Liste der Anhänge anzeigen (Anzahl: 2)
Hier nun meine Variante. :-D
Delphi-Quellcode:
// Routine zum Kürzen eines Textes und Anhängen von Punkten an den Text.
function SetShortenedTextWithDots(AFont: TFont; AText: String; AMaxWidth: Integer): string; const Dots = ' ...'; var ShortTxt: String; Cnvs: TCanvas; RightSpace: Integer; begin Cnvs := TCanvas.Create; try Cnvs.Font.Assign(AFont); Cnvs.Handle := GetDC(GetDesktopWindow); ShortTxt := AText; RightSpace := (Cnvs.TextWidth(Dots) * 2); // Platz schaffen für die Dots. // Text kürzen, bis er ins Control passt. while (AMaxWidth < (Cnvs.TextWidth(ShortTxt) + RightSpace)) do begin if Length(ShortTxt) < 2 then Break; ShortTxt := UTF8ToAnsi(ShortTxt); // Nur benötigt in Lazarus, wegen Umlauten. ShortTxt := LeftStr(ShortTxt, Length(ShortTxt) - 1); ShortTxt := AnsiToUtf8(ShortTxt); // Nur benötigt in Lazarus, wegen Umlauten. end; // Prüfen, ob der gekürzte oder der komplette Text angezeigt werden soll. if Length(ShortTxt) < Length(AText) then Result := ShortTxt + Dots else Result := AText; finally ReleaseDC(0, Cnvs.Handle); Cnvs.Free; end; end; Aufruf-Beispiel im FormResize:
Delphi-Quellcode:
Das sollte in Delphi und in Lazarus funktionieren. Ich würde mich freuen, wenn ihr das testen würdet und über Anregungen. :-D Falls Fehler drin sind, dürft ihr mir das auch sagen. :mrgreen:
// 1 TLabel, 1 TPanel und 1 TEdit auf die Form,
// bei Label1 AutoSize auf false setzen, // bei Panel1 Alignment = taLeftJustify setzen, // bei allen die Anchors = [akLeft, akRight, akTop] setzen, // und alle seitlich vergrößern bis fast an den Form-Rand. procedure TForm1.FormResize(Sender: TObject); var Txt: String; begin Txt := 'Beispiel-Text für FormResize'; Label1.Caption := SetShortenedTextWithDots(Label1.Font, Txt, Label1.Width); Panel1.Caption := SetShortenedTextWithDots(Panel1.Font, Txt, Panel1.Width); Edit1.Text := SetShortenedTextWithDots(Edit1.Font, Txt, Edit1.Width); end; Guido. Edit: Source-Codes zum Testen hinzugefügt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz