AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

WordBreak innerhalb eines Wortes

Ein Thema von SittingDuck · begonnen am 14. Nov 2012 · letzter Beitrag vom 17. Nov 2012
Antwort Antwort
Popov
(Gast)

n/a Beiträge
 
#1

AW: WordBreak innerhalb eines Wortes

  Alt 14. Nov 2012, 16:43
Das Ergebnis landete bei mir direkt in einer Bitmap, deshalb die Lösung. Technisch gesehen kann man es auch mit Canvas machen. Width kann man aus ClipRect.Right - ClipRect.Left ermitteln.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

AW: WordBreak innerhalb eines Wortes

  Alt 14. Nov 2012, 17:20
Das Ergebnis landete bei mir direkt in einer Bitmap, deshalb die Lösung. Technisch gesehen kann man es auch mit Canvas machen. Width kann man aus ClipRect.Right - ClipRect.Left ermitteln.
Nicht immer soll der mehrzeilige Text so breit sein wie das Ziel (Bitmap bzw. Canvas) und das Ziel muss nicht unbedingt ein Bitmap sein (könnte auch der Canvas von TPrinter sein).
Vielleicht möchte man links und rechts einen Rand freihalten oder gar 2-spaltig ausgeben.

Mit meinem Vorschlag hält man sich alle Möglichkeiten offen...
Andreas
  Mit Zitat antworten Zitat
SittingDuck

Registriert seit: 11. Jan 2006
Ort: Leverkusen
159 Beiträge
 
Delphi 2010 Professional
 
#3

AW: WordBreak innerhalb eines Wortes

  Alt 17. Nov 2012, 03:00
Danke schon mal für Euren Input. Ich habe es nun folgendermaßen gelöst:
Delphi-Quellcode:
var n, t: String; r: TRect; ts: TSize;
    a, h: Integer; TempList: TStringList;

n := 'Normaler Text und DerSuperlangeTextDerUmgebrochenWerdenMuss';
r := Rect(0, 0, 180, 0); // über 180 Pixel wird umgebrochen
h := DrawText(Image32.Bitmap.Handle, PChar(n), Length(n), r, DT_WORDBREAK or DT_NOPREFIX or DT_CALCRECT);

if r.Right > 180 then begin // ein einzelnes Wort ging über 180 Pixel hinaus
  TempList.Text := WrapText(n, 10); // alles was länger ist als 10 Zeichen bekommt eine eigene TStringGrid-Zeile
  for a := 0 to Pred(TempList.Count) do begin
    t := TempList[a]; // Text zeilenweise untersuchen
    DrawText(Image32.Bitmap.Handle, PChar(t), Length(t), r, DT_WORDBREAK or DT_NOPREFIX or DT_CALCRECT);
    if r.Right > 180 then begin n := ''; // ein überlanges Wort wurde gefunden
      while Length(t) > 0 do begin
        GetTextExtentExPoint(Image32.Bitmap.Handle, PChar(t), Length(t), 180, @h, nil, ts);
        n := n + Copy(t, 1, h) + ' '; Delete(t, 1, h);
      end;
      TempList[a] := n;
    end;
    r := Rect(0, 0, 180, 0);
  end;
  n := StringReplace(Trim(TempList.Text), #13#10, '', [rfReplaceAll]); // nicht ausführen falls CRs gewünscht
  h := DrawText(Image32.Bitmap.Handle, PChar(n), Length(n), r, DT_WORDBREAK or DT_NOPREFIX or DT_CALCRECT);
end;
Image32.Textout(r, DT_WORDBREAK or DT_NOPREFIX, n);
Vielleicht hilft es ja dem ein oder anderen. Das Image32 aus der GR32 kann natürlich auch ein normales Bitmap sein.
Ciao ... SittingDuck
iPhone Backup und mehr: iTwin v3.9 Beta ... Alternative Startleiste: Launcher v3.8 !
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:46 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