Textlänge abschneiden
Ich ermittle die weite von Text anhand der Textlänge.
Delphi-Quellcode:
fMaxStrLen := Strlen(SongName);
if fMaxStrLen >= 59 then SongName := PAnsiChar(AnsiString(Ansimidstr(string(SongName),1, 54) + '..'));
Delphi-Quellcode:
procedure TBASSSoVis.HoldMatrixFontMode(x, y: GLFloat; Text: PAnsiChar;
FontSet: tsFontID; TextAlign: integer); var iMatrixMode : integer; begin glGetIntegerv(GL_MATRIX_MODE, @iMatrixMode); glMatrixMode(GL_PROJECTION); glPushMatrix; try glPrintXY(x, y, text, FontSet, TextAlign) finally glMatrixMode(GL_PROJECTION); glPopMatrix; glMatrixMode(iMatrixMode); end; end;
Delphi-Quellcode:
HoldMatrixFontMode(5, SON_Current_YPos, PAnsiChar(SongName), fLargeFontID, TS_ALIGN_LEFT);
Sollte eigentlich kein Problem sein. Ist es aber da der Text in OpenGL gerendert wird. Wenn der Text über 59 Zeichen geht, kurz vor der Zeitanzeige soll er abgeschnitten werde. Beispiel: xxxxx.. Warum ein Beispiel wenn man am Code schon sieht was ich machen will. Ganz einfach. Weil beim Rendern die breite einzelner Zeichen halt Unterschiedlich sind. Nehme ich jetzt IIIII.. Theoretisch könnte dann der Text eine länge von 69 Zeichen haben und wäre immer noch nicht im Bereich meiner Zeitanzeige. Würde diese also nicht überzeichen. Wie kann ich das jetzt lösen und woran soll ich mich halten? Verwende Textsuite. crosspost: https://delphigl.com/forum/viewtopic...100406#p100406 gruss |
AW: Textlänge abschneiden
Wie du schon festgestellt hast, nützt die Anzahl der Zeichen nichts, wenn Proportionalschrift eingesetzt wird.
1. Lösung: Keine Proportionalschrift verwenden. Ist wohl die einfachste Lösung, aber sieht oft irgendwie scheiße aus. :lol: 2. Lösung: Die Länge des Textes in Pixeln über den Canvas der Ziel-Komponente bestimmen. In der DP gibt es mehrere Beispiele dazu. Eins kannst du hier finden. |
AW: Textlänge abschneiden
Zitat:
Danke. gruss |
AW: Textlänge abschneiden
Zitat:
War wohl noch zu früh für meine Augen. |
AW: Textlänge abschneiden
Zitat:
Es gäbe eine Möglichkeit..
Delphi-Quellcode:
tsSetParameteri(TS_FONT_CHAR_SPACING, 1);
Damit sollte eigentlich zwischen den einzelnen Chars der Abstand immer gleich sein. In dem Fall sollte es eigentlich funktionieren, will aber auch nicht so richtig. |
AW: Textlänge abschneiden
Du benutzt zwar OpenGL aber ich denke Canvas.TextWidth kann trotzdem ein guter Ansatz sein. Vielleicht sind die Ergebnisse nicht 1:1 auf OpenGL übertragbar aber das Verhältnis sollte ja auf jeden Fall gleich sein.
|
AW: Textlänge abschneiden
Da jeder (TrueType-)Font seine eigenen Parameter für jeden einzelnen Buchstaben mitbringt, sollte TextWidth zumindest ein guter Anhaltspunkt sein. Allerdings nur wenn in beiden Fällen der gleiche Font in der gleichen Größe verwendet wird. Die Werte die man für Times New Roman erhält, für Garamond zu verwenden, um ein Beispiel zu nennen, ist nicht so sinnvoll.
Gruß K-H |
AW: Textlänge abschneiden
Zitat:
http://www.delphipraxis.net/1333234-post4.html
Delphi-Quellcode:
Funktionieren tut es nicht denn es kracht schon hier.
function ChangeLabelWidth3(Lab: TLabel; MaxWidth: Integer): Boolean;
var LabCap: String; CurrWidth, n: Integer; begin if Lab.Width > MaxWidth then begin LabCap:= Lab.Caption; MaxWidth := MaxWidth - Lab.Canvas.TextWidth('...'); //crash CurrWidth := Lab.Canvas.TextWidth(LabCap); n := Length(LabCap); repeat CurrWidth := CurrWidth - Lab.Canvas.TextWidth(LabCap[n]); dec(n); until (CurrWidth <= MaxWidth) or (n <= 0); Lab.Caption := copy(LabCap, 1, n) + '...'; Result:= True; end else Result := false; end;
Delphi-Quellcode:
MaxWidth := MaxWidth - Lab.Canvas.TextWidth('...'); //crash
Deaktiviere ich die zeile dann kracht es hier.
Delphi-Quellcode:
CurrWidth := Lab.Canvas.TextWidth(LabCap);
AV Read of Adress 000000 gruss |
AW: Textlänge abschneiden
Da scheint Lab.Canvas nil zu sein. Mit einem vorhandenen und gültigem Canvas bei dem du vorher Font und FontSize einstellst sollte aber wie p80286 und ich gesagt haben gute Ansätze liefern.
|
AW: Textlänge abschneiden
Zitat:
Delphi-Quellcode:
Ja Vielleicht wenn es nicht wie gesagt krachen würde bei dieser Procedure.
Lab := TLabel.Create(nil);
Lab.Font.Name := 'Arial'; Lab.Font.Size := 16; Lab.Caption := string(SongName); Lab.AutoSize := True; EDIT: Ich denke das ist nicht möglich da ich für den Label kein Parent zuweisen kann. Und ohne Parent denke ich mal kein gültiger Canvas ? gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:34 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