Mit Lossys Hilfe funktioniert es jetzt wie soll.
Nochmals Danke für seine Hilfe.
Delphi-Quellcode:
// Only change if Title different
if (CurrentTitle <> OldTmpTitle) then
begin
// Adding all the characters that are present in the text
tsFontAddChars(@SongNameTmp[0]);
//Get max length of String
fMaxStrLen := tsTextGetWidthA(SongNameTmp);
if fMaxStrLen >= 635 then
begin
// Since we want to '...' have in any case at the end we need these characters to only.
CharLen := tsFontGetCharParameteri('.', TS_CHAR_ADVANCE) * 3;
// Parse width of Glyph
for I := 0 to High(Char) do
begin
// read and add width of the current character
Char[I] := WideChar(SongNameTmp[I]);
CharLength := tsFontGetCharParameteri(Char[I], TS_CHAR_ADVANCE);
CharLen := CharLen + CharLength;
// If the width is greater than the available space, then loop exit
if CharLen >= 635 then
break;
end;
// Here is through the loop and our new text is from 1 to i-1.
SongName := PAnsiChar(Ansistring(Ansimidstr(string(SongNameTmp), 1, i-1) + '...'));
end
else
SongName := BassSoInfo.SongTitle;
CurrentTitle := OldTmpTitle;
end;
Mit dem ganzen
VCL Kram war das nicht zu bewerkstelligen.
Ist abhängig von der Bibliothek mit der Gezeichnet wird.
Zitat:
Eigentlich müsste Dein Vorgehen zu einem richtigen Ergebnis führen und ebenso auch die anderen Lösungsvorschläge. Irritierend ist halt, dass dem nicht so ist.
Nun ja das was man mir nicht glaubte
VCL ist nicht
OpenGL
Und das Handling mit den Fonts in
VCL ist eine andere Geschichte als in
OpenGL.
Aber gut funktioniert ja jetzt auf diese weise.
Meine Fehler resultierten daraus weil ich zu wenig Kenntnis über die zu Übergebenden Parameter hatte.
Delphi-Quellcode:
// Display Song Name
SongNameTmp := BassSoInfo.SongTitle;
OldTitle := string(BassSoInfo.Songfile);
if assigned(SongNameTmp) then
begin
SetLength(Char, length(SongNameTmp));
// Only change if Title different
if (OldTitle <> CurrentTitle) then
begin
//Get max length of String
fMaxStrLen := tsTextGetWidthA(SongNameTmp);
if fMaxStrLen >= 635 then
begin
// Parse width of Glyph
for I := 0 to High(Char) do
begin
Char[I] := WideChar(SongNameTmp[I]);
CharLength := tsFontGetCharParameteri(Char[I], TS_CHAR_GLYPHRECT_RIGHT);
CharLen := CharLen + CharLength;
end;
// CharLen = length of all combine Glyph
if CharLen >= ((CharLen - fMaxStrLen) + 635) then
begin
SongName := PAnsiChar(Ansistring(Ansimidstr(string(SongNameTmp), 1, 58) + '...'));
end;
end
else
SongName := BassSoInfo.SongTitle;
CurrentTitle := OldTitle;
end;
Ich hatte vergessen die Chars den Aktiven Font zuzuweisen
tsFontAddChars(@SongNameTmp[0]);
die länge des Suffix (...) nicht addiert basierend auf der verwendeten Bibliothek.
CharLen := tsFontGetCharParameteri('.', TS_CHAR_ADVANCE) * 3;
Und hier den falschen Parameter übergeben mit der Annahme das ich die weite über TS_CHAR_GLYPHRECT_RIGHT in Erfahrung bringe. Schien mir am logischsten.
CharLength := tsFontGetCharParameteri(Char[I], TS_CHAR_ADVANCE);
was mich hier gerissen hat weiß ich letztendlich auch nicht.. war wohl mehr oder weniger eine Verzweiflungstat.
if CharLen >= ((CharLen - fMaxStrLen) + 635) then
Ansonsten war die Herangehensweise gar nicht mal so verkehrt.
Vielleicht können andere Leute die mit der TextSuite Arbeiten damit jetzt was anfangen.
Die müssen sich dann nicht mehr damit rumschlagen.
Letztendlich noch ein Satz.
Wäre die exakte Anzahl von Chars bekannt, bei nicht Monotonen Fonts die in den Bereich von 5 > 635 hineinpassen, könnte man sich den ganzen Kram sparen
denn dafür würde eine einzige Zeile reichen.
SongName := PAnsiChar(Ansistring(Ansimidstr(string(SongNameTmp), 1, 'Meine bekannte Anzahl von Chars') + '...'));
gruss