Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Textzeilen umbrechen (https://www.delphipraxis.net/50305-textzeilen-umbrechen.html)

Flocke 29. Jul 2005 19:06

Re: Textzeilen umbrechen
 
Der wichtige Unterschied ist das hier:
Zitat:

... and fills an array with the text extent for each of those characters.
Du bekommst also ein Array mit partiellen Stringbreiten bis zum jeweiligen Zeichen zurück, also quasi N Aufrufe von GetTextExtentPoint32 für einen String der Länge N.

Olli 29. Jul 2005 20:24

Re: Textzeilen umbrechen
 
Zitat:

Zitat von Flocke
Der wichtige Unterschied ist das hier: [...]

Ist bekannt. Aber wozu dienen denn nun die Zeilenlängen? Doch auch nur zum Zeichnen, oder? Denn ein echtes EDIT interessiert die Zeilenlänge ja auch nicht.
Aber vermutlich spart man sowieso keine Aufrufe, weil ja auch noch die Formatierung innerhalb einer Zeile verschieden sein kann.

Flocke 29. Jul 2005 20:56

Re: Textzeilen umbrechen
 
Hmmmm ... also gegeben hast du
a) einen String und
b) die restliche Ausgabebreite in der aktuellen Zeile,
und du willst wissen wo du in die nächste Zeile umbrechen musst.

-> mit GetTextExtentPoint32 erfährst du nur, ob du ihn umbrechen musst.
-> mit GetTextExtentExPoint erfährst du, ob und wenn ja wo du ihn umbrechen musst.

In diesem Sinne schlägt GetTextExtentExPoint also zwei Fliegen mit einer Klappe, xaromz braucht ja beide Informationen.

Olli 29. Jul 2005 21:02

Re: Textzeilen umbrechen
 
Zitat:

Zitat von Flocke
In diesem Sinne schlägt GetTextExtentExPoint also zwei Fliegen mit einer Klappe, xaromz braucht ja beide Informationen.

Ich gebe mich geschlagen :-D

Luckie 4. Jun 2006 00:22

Re: Textzeilen umbrechen
 
Kan mir mal jemand helfen, das anzuwenden?

Delphi-Quellcode:
var
  i                : Integer;
  s                : string;
  size             : TSize;
  cntChars         : PInteger;
  alpDx            : PInteger;
begin

  GetTextExtentExPoint(dc, PChar(TEXT), length(TEXT), -(PageW * 10) - 100, cntChars, alpDx, size);
  for i := 0 to length(alpDx) - 1 do
  begin
    s := copy(TEXT, alpDx[i], cntChars^);
    TextOut(dc, 100, -10 * (i + 16), PChar(s), length(s));
    end;
Ich dachte so geht es, aber in der for-Zeile meint er, inkompatible Typen. :gruebel:

Daniel G 4. Jun 2006 00:45

Re: Textzeilen umbrechen
 
Zitat:

Zitat von Luckie
Ich dachte so geht es, aber in der for-Zeile meint er, inkompatible Typen.

Na ja, ich tippe einfach mal, das liegt daran, dass du "Length" auf einen PInteger anwenden willst, oder?

//Edit:
Hilft dir das hier? Hab' ich bei Experts Exchange gefunden, müsstest natürlich noch etwas anpassen.

Delphi-Quellcode:
procedure TForm1.but_CustomTextClick(Sender: TObject);
var
TextStr: String;
Bmp1: TBitmap;
numChar, oNum, lines: Integer;
aSize: tagSize;
begin
TextStr := 'Thisisatextstringlongenoughtowrap a couple of times. And'+
           'Moretextherefollowedbevenmore text followed by eveen more text'+
           ' followed-by-even-more-text followed by even moore text';
Bmp1 := TBitmap.Create;
try
  Bmp1.Width := 188;// try to have a 3 pixel border, use 182 below
  Bmp1.Height := 230;
  Bmp1.Canvas.Font.Name := 'Arial';
  Bmp1.Canvas.Font.Size := 11;

  if Length(TextStr) < 1 then Exit;
  lines := 0;
  repeat
  GetTextExtentExPoint(Bmp1.Canvas.Handle, PChar(TextStr),Length(TextStr),182,
                     @numChar, nil, aSize);
  oNum := numChar;
  while (numChar > 1) and not
      (TextStr[numChar] in [' ','.',',','-','_','?','!','$','(',')']) do
       Dec(numChar);
  if numChar = 1 then
    numChar := oNum;
  TextOut(Bmp1.canvas.handle,3,(lines*(aSize.cy+8))+3,PChar(TextStr), numChar);
  Delete(TextStr,1,numChar);
  Inc(Lines);
  until Length(TextStr) < 1;

  Canvas.Draw(530,290, Bmp1);
  finally
  FreeAndNil(Bmp1);
  end;
end;
Quelle

Luckie 4. Jun 2006 00:55

Re: Textzeilen umbrechen
 
Habs rausgefunden:
Delphi-Quellcode:
    i := 0;
    s := TEXT;
    w := (PageW * 10) - 200;
    repeat
      GetTextExtentExPoint(dc, PChar(s), length(s), w, @cntChars, nil, size);
      TextOut(dc, 100, -100 + -i * (Size.cy + 8), PChar(s), cntChars);
      Delete(s, 1, cntChars);
      Inc(i);
    until length(s) < 1;
Hehe. Genau das gleiche habe ich auch gerade gefunden. ;)

Jetzt müsste man das nur noch so hinbekommen, dass er nicht mitten im Wort umbricht. :?

Und Zeilenumbruche im Text (#13#10) berücksichtig werden.

Leerzeichen hat sich erledigt:

Delphi-Quellcode:
    repeat
      GetTextExtentExPoint(dc, PChar(s), length(s), (PageW * 10) - BORDERLEFT - BORDERRIGHT, @cntChars, nil, size);
      while (s[cntChars] <> ' ') do
        Dec(cntChars);
      TextOut(dc, BORDERLEFT, -BORDERTOP + -i * (Size.cy + 8), PChar(s), cntChars);
      Delete(s, 1, cntChars);
      Inc(i);
    until cntChars < 1;
Nur wie mache ich das mit dem Zeilenumbruch?

Luckie 4. Jun 2006 05:24

Re: Textzeilen umbrechen
 
Zeilenumbrüche sind auch gelöst. Ich jage den String vorher durch ExplodeExplode. ;)

marabu 4. Jun 2006 07:16

Re: Textzeilen umbrechen
 
Guten Morgen Michael,

vielleicht doch besser so:

Delphi-Quellcode:
var
  n                : Integer;
  i                : Integer;
  s                : string;
  size             : PSize;
  cntChars         : Integer;
  alpDx            : PInteger;
begin
  // ...
  n := Min(Length(TEXT), cntChars);
  GetMem(alpDX, n * SizeOf(Integer));
  GetMem(size, n * SizeOf(TSIZE));

  GetTextExtentExPoint(dc, PChar(TEXT), length(TEXT), -(PageW * 10) - 100, @cntChars, alpDx, size);
  // ...
Grüße vom marabu

Luckie 4. Jun 2006 13:58

Re: Textzeilen umbrechen
 
Was wäre daran besser?


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:03 Uhr.
Seite 2 von 3     12 3      

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