Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   Text zur Anzeige kürzen mit Punkten hinten (https://www.delphipraxis.net/164086-text-zur-anzeige-kuerzen-mit-punkten-hinten.html)

Guido Eisenbeis 2. Nov 2011 15:03

AW: Text zur Anzeige kürzen mit Punkten hinten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von jaenicke (Beitrag 1133994)
Das Problem mit dem Umlauten liegt jedenfalls an Lazarus, mit Delphi geht es problemlos.

Klar, hab ich ja auch geschrieben: "... die Funktion von himitsu in Lazarus ..." . :wink: . Dennoch danke für die Bestätigung. :-D


Zitat:

Zitat von himitsu (Beitrag 1134025)
... Eine UTF-8-Variante wird es von DrawTextEx wohl nicht geben? (Von Windows nicht, es sei denn man stellt UTF-8 als DefaultCodepage ein oder Lazarus konvertiert es nach Unicode) ...

Ich hab jetzt einige Variationen mit WideString, Unicodestring, UTF8..., usw. probiert, hat sich aber nichts getan. Ich vermute auch viel eher, dass da in der IDE selbst eine Schalter ist, um das einzustellen. Ich hab schon einiges durchsucht (und probiert), aber das ist die sprichwörtliche "Naddel" im Heuhaufen. Wenn da ein Lazarus-Fachmann mitliest, wird er das wahrscheinlich als Kleinigkeit ansehen!?

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:
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;
Kann das jemand testen?

Guido.

Guido Eisenbeis 4. Nov 2011 10:13

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:
// 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;
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:

Guido.


Edit: Source-Codes zum Testen hinzugefügt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:00 Uhr.
Seite 4 von 4   « Erste     234   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz