Autor Beitrag
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 18.02.18 04:29 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Symbroson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: So 18.02.18 22:44 
Erstmal gibt es eine spezielle Methode namens canvas.TextWidth(const text: String): integer; mit der du die Textbreite ermitteln kannst.

Um nun die richtige Position für deinen Zeilenumbruch zu finden würde ich eine Art binäre Suche anwenden.
Du musst dir zunächst ein paar Zeichen(ketten) heraussuchen, an denen du Zeilenumbrüche erlaubst (typischerweise ein Space/Leerzeichen, und diese Positionen im Text in einem extra Feld speichern. Dann gehst du da mit deiner binären Suche durch und suchst die Position heraus, an der der Text maximal lang, aber immernoch zur Canvas/Boxbreite passt - je nachdem, in welches Rechteck dein Text geschrieben werden soll.
Danach machst du einfach mit dem verbleibenden Text weiter, bis irgendwann die Breite des verbleibenden Textes kleiner als das deiner Box ist.

Die einzelnen Zeilen musst du noch immer einzeln per DrawText Zeichnen. Für die y-Position nimmst du einfach y0 - Zeile * Font.Height. Minus, weil Font.Height meist negativ ist.

Hoffe, das hilft dir weiter :)

LG

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 18.02.18 23:49 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Symbroson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Mo 19.02.18 00:14 
Schade - Naja, falls du es doch nicht rausbekommen solltest, gäbe es wenigstens noch ne Idee, wie du es selbst implementieren könntest. Ich mag sowas eher ^^

Es sieht für mich nicht so aus, als ob dieses TextRect irgendeinen Einfluss auf den Text Hat (bis auf die Position)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1Click(Sender: TObject);
var sText: string;
  TextRect: TRect;
begin
  sText := 'hello world! I need some more characters.';
  TextRect := Rect(20,20,70,70);
  Canvas.Rectangle(TextRect);
  DrawText(Canvas.Handle, @sText[1], Length(sText), TextRect, DT_CALCRECT);
  DrawText(Canvas.Handle, @sText[1], Length(sText), TextRect, DT_WORDBREAK);
end;

Ich kann dir da leider nicht weiterhelfen

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Symbroson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Mo 19.02.18 00:17 
DTWordBreak scheint lediglich \r\n sequenzen im String Selbst zu behandeln, wenn zB sText := 'hello world! I need'#13#10'some more characters.';wird der Zeilenumbruch auch gezeichnet.

[entschuldigung - hätte ich in den vorherigen Post schreiben können]

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 19.02.18 00:36 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Symbroson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Mo 19.02.18 00:46 
ach ja klar, das MeasureText hat mein TextRect verändert. Dann geht es auch.
textBox
Und wo genau ist jetzt das Problem? Das MeasureText lässt du einfach weg und ersetzt es durch das Rect in den dein Text geschrieben werden soll. Vmtl relativ zum Komponentenursprung (Left, Right).
Einloggen, um Attachments anzusehen!
_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 19.02.18 00:54 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Symbroson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 382
Erhaltene Danke: 67

Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
BeitragVerfasst: Mo 19.02.18 00:55 
Ok, Schön wenn ich dir irgendwie helfen konnte :zwinker: :lol:

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 19.02.18 10:43 
- Nachträglich durch die Entwickler-Ecke gelöscht -