AGB  ·  Datenschutz  ·  Impressum  







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

Texthöhe ermitteln

Ein Thema von Amateurprofi · begonnen am 1. Sep 2012 · letzter Beitrag vom 2. Sep 2012
Antwort Antwort
Seite 1 von 2  1 2      
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.041 Beiträge
 
Delphi XE2 Professional
 
#1

Texthöhe ermitteln

  Alt 1. Sep 2012, 12:15
Um die Höhe eines Textes zu ermitteln, benutze ich folgende Funktion

Delphi-Quellcode:
FUNCTION GetFontHeight(FontHandle:HFont):integer;
var DC:HDC; OldFont:HFONT; Metrics:TTextMetric;
begin
   DC:=GetDC(0);
   try
      OldFont:=SelectObject(DC,FontHandle);
      GetTextMetrics(DC, Metrics);
      SelectObject(DC,OldFont);
   finally
      ReleaseDC(0,DC);
   end;
   Result:=Metrics.tmHeight;
end;

Nun möchte ich die Höhe des Textes bei gegebenem Font, aber mit einem anderen Font.Size und/oder Font.Style ermitteln OHNE den Font.Size/Style des betreffenden Controls zu verändern.

Wie kann ich das am einfachsten realisieren?
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: Texthöhe ermitteln

  Alt 1. Sep 2012, 12:19
Ich würde eine unsichtbare andere Canvas dafür benutzen.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Texthöhe ermitteln

  Alt 1. Sep 2012, 12:19
Wie wär's mit einem Label?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#4

AW: Texthöhe ermitteln

  Alt 1. Sep 2012, 12:56
PS: Schonmal in die CodeLib geguckt?

Text HöheText Höhe

Jenachdem wie wann/ob, die Komponente den Font setzt (für die Anzeige), kann man entweder direkt das Canvas dieses Controls nutzen, Font+Size+Style setzen und die Texthöhe auslesen (also wenn das Control dem Canvas für die Anzeige, beim Anzeigen den Font neu zuweist), oder man nutzt eben ein anderes Canvas.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 1. Sep 2012 um 13:01 Uhr)
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.041 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Texthöhe ermitteln

  Alt 1. Sep 2012, 14:23
Wie wär's mit einem Label?
Ich würde eine unsichtbare andere Canvas dafür benutzen.
oder man nutzt eben ein anderes Canvas.
Danke, aber genau das will ich alles nicht.
Ich möchte keine anderen Komponenten, ob sichtbar oder unsichtbar benutzen, sondern nur für den aktuellen Font eines Controls, aber mit ggfs. anderem Size/Style die Texthöhe bestimmen.
Also eine Funktion analog GetFontHeight aus #1 mit zusätzlichen Parametern Size und Style, die die Schrifthöhe ermittelt, OHNE den Font.Size/Style des Controls zu ändern und ohne irgend ein anderes Control zu benutzen.


PS: Schonmal in die CodeLib geguckt?.
Ja, hab ich. War aber nicht so ergiebig.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#6

AW: Texthöhe ermitteln

  Alt 1. Sep 2012, 15:05
Die Funktionen, zum Messen der Text-Höhe/Breite brauchen nunmal einen Canvas (der einen DeviceContext kapselt) oder einen DeviceContext.

Also entweder nutzt du den Canvas/DC des Controls und änderst dort den Font
oder du mußt eben einen anderen Canvas/DC benutzen (wofür sich in der CL passende Codes finden lassen).

Wenn du wissen willst, wie schwer ein Auto ist, dann mußt du dieses zu einer Wage bringen
oder du nimmst dir ein vergleichbares Auto und schaffst das zur Waage.
(oder du kennst jemanden der weiß wie schwer es ist)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: Texthöhe ermitteln

  Alt 1. Sep 2012, 22:38
Man könnte auch sagen "wasch mich aber mach mich nicht nass".
Ist ja nicht soganz unüblich solche Forderungen zu stellen.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.041 Beiträge
 
Delphi XE2 Professional
 
#8

AW: Texthöhe ermitteln

  Alt 2. Sep 2012, 01:34
Ich hab es jetzt so gelöst:
(Ist nicht ganz das was ich ursprünglich wollte, aber es funktioniert.)
Delphi-Quellcode:
FUNCTION GetFontHeight(AFont:TFont; ASize:integer; AStyles:TFontStyles):integer;
var f:TFont; DC:HDC; OldFont:HFONT; Metrics:TTextMetric;
begin
   f:=TFont.Create;
   DC:=GetDC(0);
   try
      try
         f.Assign(AFont);
         f.Size:=ASize;
         f.Style:=AStyles;
         OldFont:=SelectObject(DC,f.Handle);
         GetTextMetrics(DC, Metrics);
         SelectObject(DC,OldFont);
         Result:=Metrics.tmHeight;
      except
         On Exception do result:=0;
      end;
   finally
      ReleaseDC(0,DC);
      f.Free;
   end;
end;
Man könnte auch sagen "wasch mich aber mach mich nicht nass".
Ist ja nicht soganz unüblich solche Forderungen zu stellen.
Ich stellte keine Forderungen, sondern nur eine Frage.
Wenn du wissen willst, wie schwer ein Auto ist, dann mußt du dieses zu einer Wage bringen
oder du nimmst dir ein vergleichbares Auto und schaffst das zur Waage.
(oder du kennst jemanden der weiß wie schwer es ist)
Wenn ich aber keine Waage habe, oder aus irgendwelchen Gründen keine Waage benutzen möchte, dann ermittle ich für alle Materialien aus denen das Auto besteht, das Volumen und errechne über das jeweilige spezifische Gewicht die Masse.

Falls doch noch jemand einen Weg kennt, wie das besser zu lösen ist, bin ich für jeden Hinweis dankbar.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#9

AW: Texthöhe ermitteln

  Alt 2. Sep 2012, 01:37
Guck dir evtl. Font.Height an. Es sagt nicht aus wie viel Canvas Pixel Höhe die Schrift hat, inc. Leerräume, sondern die Schrift selber. Vielleicht bringt es dir was.

Ist aber schon lange her, dass ich mal etwas damit gemacht habe. Kann auch sein, dass ich Blödsinn erzähle.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Texthöhe ermitteln

  Alt 2. Sep 2012, 08:30
Das ist jetzt aber völlig unlogisch. Wenn du schon die Graphics einbinden mußt (wegen TFont), kannst du’s auch gleich so (wie der Rest der Welt auch) machen:
Delphi-Quellcode:
function GetTextHeight(const FontName: string; const FontSize: integer;
  const FontStyle: TFontStyles = []): integer;
var
  Bitmap: TBitmap;
begin
  // TCanvas.TextHeight gibt die Höhe der Schriftart, die Oberlänge plus der
  // Unterlänge, nicht die eigentliche Höhe des angegebenen Strings zurück
  Bitmap:= TBitmap.Create;
  try
    Bitmap.Canvas.Font.Name:= FontName;
    Bitmap.Canvas.Font.Size:= FontSize;
    Bitmap.Canvas.Font.Style:= FontStyle;
    Result:= Bitmap.Canvas.TextHeight('Test');
  finally
    Bitmap.Free;
  end;
end;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:55 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