AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Textlänge abschneiden

Ein Thema von EWeiss · begonnen am 14. Jun 2016 · letzter Beitrag vom 19. Jun 2016
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: Textlänge abschneiden

  Alt 14. Jun 2016, 07:36
Ich sagte ja schon es wird in OpenGL (TextSuite) gerendert da nutzt mir ein Canvas nichts.
Ups, sorry.
War wohl noch zu früh für meine Augen.
Na ja macht ja nichts

Es gäbe eine Möglichkeit..
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.

Geändert von EWeiss (11. Jul 2019 um 15:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Textlänge abschneiden

  Alt 14. Jun 2016, 07:41
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Textlänge abschneiden

  Alt 14. Jun 2016, 08:14
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Textlänge abschneiden

  Alt 14. Jun 2016, 08:15
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.
Ich habe es mal damit getestet
http://www.delphipraxis.net/1333234-post4.html


Delphi-Quellcode:
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;
Funktionieren tut es nicht denn es kracht schon hier.

MaxWidth := MaxWidth - Lab.Canvas.TextWidth('...'); //crash
Deaktiviere ich die zeile dann kracht es hier.

CurrWidth := Lab.Canvas.TextWidth(LabCap);
AV Read of Adress 000000


gruss
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Textlänge abschneiden

  Alt 14. Jun 2016, 08:17
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Textlänge abschneiden

  Alt 14. Jun 2016, 08:33
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.
Nö der ist nicht Nil

Delphi-Quellcode:
Lab := TLabel.Create(nil);
Lab.Font.Name := 'Arial';
Lab.Font.Size := 16;
Lab.Caption := string(SongName);
Lab.AutoSize := True;
Ja Vielleicht wenn es nicht wie gesagt krachen würde bei dieser Procedure.

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

Geändert von EWeiss (14. Jun 2016 um 08:45 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

AW: Textlänge abschneiden

  Alt 14. Jun 2016, 11:18
In einem Programm, in dem ich zur Laufzeit Buttons in eine Scrollbox lege, habe ich das so gelöst:
Delphi-Quellcode:
      lb := TLabel.Create(Nil);
      lb.Font := sbFavoriten.Font; // Scrollbox
      lb.Autosize := True;
      lb.Caption := fdSendername.AsString; // DB-Feld mit Sendername
      btn.Hint := lb.Caption + #13 + fdKategorie.AsString; // DB-Feld mit Senderkategorie
      if lb.Width > sbFavoriten.Width - 32 then begin
        lb.Caption := lb.Caption + '...';
        while lb.Width > sbFavoriten.Width - 32 do begin
          lb.Caption := Copy(lb.Caption,1,Length(lb.Caption) - 4) + '...';
        end;
      end;
      // Button den gekürzten Text und die erforderliche Höhe zuweisen.
      btn.Caption := lb.Caption;
      btn.Height := lb.Height + 4;
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Textlänge abschneiden

  Alt 14. Jun 2016, 12:12
Nein es geht definitiv nicht.
Weil ich Controls dieser Art nicht addieren kann.
Ein Parent für den Label kann ich auch nicht setzen.

Habe es jetzt so geändert.
Aber auch das stimmt nicht weil es sich mit OpenGL nicht vereinbaren lässt.

Delphi-Quellcode:
function GetText(AText, AFontName: string; AFontSize: integer; MaxWidth: Integer): string;
var
  bmp: TBitmap;
  CurrWidth, n: Integer;

begin

  bmp := TBitmap.Create;
  try
    bmp.Canvas.Font.Name := AFontName;
    bmp.Canvas.Font.Size := AFontSize;

    MaxWidth := MaxWidth - bmp.Canvas.TextWidth('...');
    CurrWidth := bmp.Canvas.TextWidth(AText);

    n := Length(AText);
    repeat
      CurrWidth := CurrWidth - bmp.Canvas.TextWidth(AText[n]);
        dec(n);
    until (CurrWidth <= MaxWidth) or (n <= 0);

    if CurrWidth < MaxWidth then
      result := copy(AText, 1, (n + 1))
    else
    result := copy(AText, 1, (n + 1)) + '...';

  finally
    bmp.Free;
  end;
end;
zudem kommt noch das
CurrWidth < MaxWidth niemals mehr als MaxWidth ist.
Das hat zur folge das immer '...' angehängt wird.
Außerdem ist im vorherigen Code noch ein Fehler n muss mit 1 addiert werden ansonsten fehlt ein Buchstabe.

Wenn ich nun IIIIIIII anstelle von XXXXXX nehme geht I über meine Zeitanzeige hinaus
Ist also das gleiche in grün.

SongName := PAnsiChar(AnsiString(GetText(string(AnsiString(BassSoInfo.SongTitle)), 'Arial', 16, 570)));

geht mit X aber nicht mit I
Die breite der Zeichen ist nun mal nicht gleich wie die der Labels.
Auch wenn ich den gleichen Font, Font.size verwende.

Zitat:
aber das Verhältnis sollte ja auf jeden Fall gleich sein.
Also nein keinerlei Einklang in Verbindung mit OGL


gruss

Geändert von EWeiss (14. Jun 2016 um 13:41 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:49 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