![]() |
AW: Textlänge abschneiden
Zitat:
Wenn man die Breite nicht bestimmen kann, dann kann man das auch nicht zeichnen, weil der Bildschirm hat einfach nur Pixel und die müssen mit Farbe gefüllt werden :stupid: Ausserdem machst du das doch genau hier:
Delphi-Quellcode:
Irgendwann läufst du aus dem Maximalbereich heraus und musst jetzt den Text soweit kürzen, dass aber auch der Suffix noch dargestellt werden kann.
// Parse width of Glyph
for I := 0 to High(Char) do begin Char[I] := WideChar(SongNameTmp[I]); // .......... vvvvvvvvvvvvvvvvvvvvvvv CharLength := tsFontGetCharParameteri(Char[I], TS_CHAR_GLYPHRECT_RIGHT); CharLen := CharLen + CharLength; end; Nehmen wir mal eine feste Breite von 20 (das Verfahren ist genau wie bei der varaiblen Laufweite, nur einfacher darzustellen) und als Suffix
Delphi-Quellcode:
:
... (more)
Beim Kürzen des Textes muss man also wieder ein paar Zeichen zurück gehen ... oder sich diesen speziellen Zustand einfach merken. Du musst also nichts anderes machen als
|
AW: Textlänge abschneiden
Zitat:
Ach so jetzt verstehe ich was du meinst es geht hier nicht im speziellen um GDI sondern ich könnte/sollte diese Parse Funktion zu GL konvertieren bsp. mit meinen Möglichkeiten die breite eines Zeichen zu bestimmen. Anschließend deine Funktionen durchgehen um zu verstehen wie ich den String in der länge entsprechend anpassen kann. Jo das kann ich mal versuchen. Danke für deine Ausführung.. Hoffe das ich richtig liege :) gruss |
AW: Textlänge abschneiden
Ja, darum habe ich die
Delphi-Quellcode:
extra so ausgelegt, dass die Bestimmung der Zeichenbreite per Callback-Funktion übergeben werden kann. Dadurch wird der Code allgemeingültig und ist eben nicht auf GDI beschränkt.
ShortenText
Das Bestimmen der Zeichenbreite ist eine andere Problematik als das Bestimmen des gekürzten Textes. So etwas vermische ich nicht so gerne, sonst muss ich immer so viel Tippen :stupid: |
AW: Textlänge abschneiden
Zitat:
Danke nochmals.. Kam irgendwie nicht so richtig bei mir an. gruss |
AW: Textlänge abschneiden
Ich versuchs mal mit 'ner anderen Beschreibung:
Du hast oben in Post #14 eine Routine, mit der die Textlänge bestimmt werden kann. Die Maximallänge scheint 635 zu sein. Zuerst ermittelst du die Länge von'...' und ziehst diese von 635 ab. Das ist erstmal die neue Maximallänge. Nun ermittelst Du in einer Schleife die Länge des Textes und wenn er länger als die neue Maximallänge ist, entfernst Du das letzte Zeichen und prüfst erneut. Das wird solange wiederholt, bis die ermittelte Länge kleiner oder gleich der neuen Maximallänge ist. An den bis dahin gekürzten String hängst Du nun noch die ... dran, dann müsste es (so hoffe ich) passen. |
AW: Textlänge abschneiden
Zitat:
Ich baue gerade das Projekt von Sir Rufo um für D2010 Danach teste ich mal deine Variante. gruss |
AW: Textlänge abschneiden
@nahpets
Nicht ganz.
@EWeiss Beide Wege machen im Prinzip das Gleiche. Man müsste nur schauen, wer schneller ist. Optimieren (Geschwindigkeit) kann man beide Verfahren noch. Bei meiner Funktion kann man über eine Lookup-Tabelle die Anzahl der echten Abfragen stark reduzieren (wenn jedes Zeichen auch immer gleich breit bleibt). Bei der Text-Funktion kann man die Zeichenanzahl erst mal per Schätzung bestimmen um dann nur noch wenige Zeichen zu entfernen. Die Hauptfrage ist, was ist für OpenGL schneller: Einen ganzen Text mehrmals zu messen oder jeweils ein Zeichen |
AW: Textlänge abschneiden
@Sir Rufo
Habe dein Projekt jetzt mal umgelegt nach D2010 Ging nicht auf Anhieb lSuffixLength musste ein globale Variable sein. Werde jetzt mal nach GL umlegen. Über die PaintBox sieht es schon mal gut aus. gruss |
AW: Textlänge abschneiden
Zitat:
|
AW: Textlänge abschneiden
Zitat:
Der Compiler hat gemeckert das lSuffixLength nicht initialisiert war.. also (33339483884) so ne zahl.
Delphi-Quellcode:
raise EArgumentNilException.Create( 'CharMeasurement' );
Musste ich ausblenden gibt es scheinbar in D2010 nicht.
Delphi-Quellcode:
raise EArgumentOutOfRangeException.Create( 'SuffixLength > MaxLength' );
kommt immer sobald ich einen Char eingebe habe es deaktiviert. opps zurück hab vergessen den anderen Kram noch auszublenden war mein Fehler.
Delphi-Quellcode:
Korrigierte Version hochgeladen D2010
// if not Assigned( CharMeasurement )
// then // raise EArgumentNilException.Create( 'CharMeasurement' ); // if MaxLength < 0 // then // raise EArgumentOutOfRangeException.Create( 'MaxLength' gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:25 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