Autor |
Beitrag |
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 18.02.18 04:29
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: 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
|
Verfasst: So 18.02.18 23:49
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: 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)
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
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: 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
|
Verfasst: Mo 19.02.18 00:36
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Mo 19.02.18 00:46
ach ja klar, das MeasureText hat mein TextRect verändert. Dann geht es auch.
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
|
Verfasst: Mo 19.02.18 00:54
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Mo 19.02.18 00:55
Ok, Schön wenn ich dir irgendwie helfen konnte
_________________ 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
|
Verfasst: Mo 19.02.18 10:43
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
|