AGB  ·  Datenschutz  ·  Impressum  







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

Textzeilen umbrechen

Ein Thema von xaromz · begonnen am 23. Jul 2005 · letzter Beitrag vom 6. Jun 2006
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#11

Re: Textzeilen umbrechen

  Alt 29. Jul 2005, 20:06
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.
Volker
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#12

Re: Textzeilen umbrechen

  Alt 29. Jul 2005, 21:24
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.
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#13

Re: Textzeilen umbrechen

  Alt 29. Jul 2005, 21:56
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.
Volker
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#14

Re: Textzeilen umbrechen

  Alt 29. Jul 2005, 22:02
Zitat von Flocke:
In diesem Sinne schlägt GetTextExtentExPoint also zwei Fliegen mit einer Klappe, xaromz braucht ja beide Informationen.
Ich gebe mich geschlagen
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#15

Re: Textzeilen umbrechen

  Alt 4. Jun 2006, 01:22
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Daniel G
(Gast)

n/a Beiträge
 
#16

Re: Textzeilen umbrechen

  Alt 4. Jun 2006, 01:45
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#17

Re: Textzeilen umbrechen

  Alt 4. Jun 2006, 01:55
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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#18

Re: Textzeilen umbrechen

  Alt 4. Jun 2006, 06:24
Zeilenumbrüche sind auch gelöst. Ich jage den String vorher durch ExplodeExplode.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#19

Re: Textzeilen umbrechen

  Alt 4. Jun 2006, 08:16
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#20

Re: Textzeilen umbrechen

  Alt 4. Jun 2006, 14:58
Was wäre daran besser?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 14:53 Uhr.
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