AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Schriftgröße für optimale Platzausnutzung ermitteln

Schriftgröße für optimale Platzausnutzung ermitteln

Ein Thema von fkerber · begonnen am 9. Jan 2010 · letzter Beitrag vom 9. Jan 2010
Antwort Antwort
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#1

Schriftgröße für optimale Platzausnutzung ermitteln

  Alt 9. Jan 2010, 13:45
Matze stellt hier eine Funktion vor, mit der es möglich ist, für gegebenen Text eine Schriftgröße zu ermitteln, sodass die gegebene Breite und Höhe (in Pixel) optimal ausgenutzt werden kann.

Delphi-Quellcode:
//Hilfsfunktion
function GetTextSizeInPixels(Text: string; Font: TFont): TPoint;
var
  PxHeight, PxWidth: Integer;
  TmpBmp: TBitmap;
begin
  TmpBmp := TBitmap.Create;
  try
    TmpBmp.Canvas.Font := Font;
    PxWidth := TmpBmp.Canvas.TextWidth(Text);
    PxHeight := TmpBmp.Canvas.TextHeight(Text);
  finally
    FreeAndNil(TmpBmp);
  end;

  Result.X := PxWidth;
  Result.Y := PxHeight;
end;
Delphi-Quellcode:
function GetFontSizeFromPixels(Text: string; WidthPixels: Integer; HeightPixels: Integer; FontName: string; MinSize: Integer = 1): Integer;
var
  Font: TFont;
  TmpSizePx: TPoint;
  TmpWidthPx, TmpHeightPx: Integer;
begin
  Font := TFont.Create;
  try
    Font.Name := FontName;
    Font.Size := MinSize;
    TmpSizePx := GetTextSizeInPixels(Text, Font);
    TmpWidthPx := TmpSizePx.x;
    TmpHeightPx := TmpSizePx.y;

    // check if MinSize is ok
    if (TmpWidthPx > WidthPixels) or (TmpHeightPx > HeightPixels) then
      Result := -1
    else begin // width at MinSize is smaller than WidthPixels
      repeat
        inc(MinSize);
        Font.Size := MinSize;
        TmpSizePx := GetTextSizeInPixels(Text, Font);
        TmpWidthPx := TmpSizePx.x;
        TmpHeightPx := TmpSizePx.y;
      until (TmpWidthPx > WidthPixels) or (TmpHeightPx > HeightPixels);

      Result := MinSize - 1;
    end;
  finally
    FreeAndNil(Font);
  end;
end;
Anbei noch 2 Beispielaufrufe:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  calculatedFontsize: Integer;
begin
  calculatedFontsize := GetFontSizeFromPixels('Dies ist ein Test-Text', 150, 150, 'Verdana',11);
  if calculatedFontsize<>-1 then
    showmessage('Schriftgröße sollte '+inttostr(calculatedFontsize) + ' sein!')
  else
    showmessage('Gewählter Text passt nicht in den zur Verfügung stehenden Bereich (bei gewählter Mindestgröße).')
end;



procedure TForm1.Button2Click(Sender: TObject);
var
  calculatedFontsize: Integer;
begin
  calculatedFontsize := GetFontSizeFromPixels('Dies ist ein Test-Text', 150, 150, 'Verdana');
  if calculatedFontsize<>-1 then
    showmessage('Schriftgröße sollte '+inttostr(calculatedFontsize) + ' sein!')
  else
    showmessage('Gewählter Text passt nicht in den zur Verfügung stehenden Bereich.')
end;
Frederic Kerber
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

Re: Schriftgröße für optimale Platzausnutzung ermitteln

  Alt 9. Jan 2010, 14:03
Entsteht in der Hilfsfunktion durch die Zuweisung des Fonts nicht ein Speicherleak?
Delphi-Quellcode:
//Hilfsfunktion
function GetTextSizeInPixels(Text: string; Font: TFont): TPoint;
var
  PxHeight, PxWidth: Integer;
  TmpBmp: TBitmap;
begin
  TmpBmp := TBitmap.Create;
  try
    TmpBmp.Canvas.Font := Font; // <--- diese Zeile meine ich
    PxWidth := TmpBmp.Canvas.TextWidth(Text);
    PxHeight := TmpBmp.Canvas.TextHeight(Text);
  finally
    FreeAndNil(TmpBmp);
  end;

  Result.X := PxWidth;
  Result.Y := PxHeight;
end;
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#3

Re: Schriftgröße für optimale Platzausnutzung ermitteln

  Alt 9. Jan 2010, 14:07
Hi!

Inwiefern?
Es wird doch sowohl die TmpBmp wie auch Font selbst freigegeben?

Reicht das nicht? (Ich bin mir nicht sicher, ich mutmaße da nur )



Grüße, Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#4

Re: Schriftgröße für optimale Platzausnutzung ermitteln

  Alt 9. Jan 2010, 14:27
Was passiert aber mit dem Font-Objekt, welches das Bitmap TmpBmp nach dem erzeugen hat? Dieses wird ja nicht freigegeben, da nach der Font-Zuweisung ja keine Referenz mehr auf das Objekt existiert. Assign sollte wohl das Problem lösen.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 01:37 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