Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   FontDialog - Font Size (https://www.delphipraxis.net/187659-fontdialog-font-size.html)

Sidi61 18. Dez 2015 22:24

FontDialog - Font Size
 
Hallo zusammen,

irgendwie bekomme ich die Einstellung der Schriftgröße nicht hin.

Wenn ich die Schriftgröße mittels FontDialog ermittel erhalte ich z.B. Arial 10 - nur was bedeutet diese 10 eigentlich genau, was ist das für eine Einheit und in welchem Bezug steht sie zur eigentlichen Schriftgröße.

Übergebe ich diesen Wert an Printer.canvas.font.size erhalte ich einen Ausdruck in Größe 24 Punkt (verglichen mit Ausdruck aus Word).

Den Ausdruck leite ich wie folgt ein:

Delphi-Quellcode:
Printer.BeginDoc;

  SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC); //0,1mm Einheiten X-Achse nach rechts jedoch Y-Achse nach oben
  GetWindowExtEx(Printer.Canvas.Handle,w); //Drucker Auflösung ermitteln
  GetViewPortExtEx(Printer.Canvas.Handle,v); //Abmessung des Viewports auslesen
  SetMapMode(Printer.Canvas.Handle, MM_ANISOTROPIC);
  SetWindowExtEx(Printer.Canvas.Handle, w.cx, w.cy,nil); //Druckerauflösung bestätigen
  SetViewPortExtEx(Printer.Canvas.Handle, v.cx, -v.cy,nil); //Y-Achse kippen nach unten
Gruß
Sidi61

Bjoerk 18. Dez 2015 23:44

AW: FontDialog - Font Size
 
Size ist eine property, mit der Font.Height gesetzt wird (Eine Variable Size gibt es nicht). Für PixelsPerInch ist default der Bildschirm eingestellt. Die Printers rechnet diese Size automatisch um.

Delphi-Quellcode:
function TFont.GetSize: Integer;
begin
  Result := -MulDiv(Height, 72, FPixelsPerInch);
end;

procedure TFont.SetSize(const Value: Integer);
begin
  Height := -MulDiv(Value, FPixelsPerInch, 72);
end;

procedure TPrinterCanvas.UpdateFont;
var
  FontSize: Integer;
begin
  if GetDeviceCaps(Printer.DC, LOGPIXELSY) <> Font.PixelsPerInch then
  begin
    FontSize := Font.Size;
    Font.PixelsPerInch := GetDeviceCaps(Printer.DC, LOGPIXELSY);
    Font.Size := FontSize;
  end;
end;

Sidi61 19. Dez 2015 10:31

AW: FontDialog - Font Size
 
Hallo Bjoerk,

danke für deine Antwort aber ehrlich gesagt die Zusammenhänge in deinen Beispielen habe ich noch nicht ganz verstanden. Ich habe versucht deine Beispiele einzubauen, allerdings änderte sich die Schriftgröße nicht.

Ich stelle mit Fontdialog nicht die Schriftgröße ein sondern ermittle sie lediglich und speichere die Werte ab, hier z.B. Arial Größe 10

Wird ein Ausdruck gestartet soll die Schrift nach Einleitung des Druckes (s. erster Beitrag) eingestellt werden, dies gelingt jedoch mit
Printer.canvas.font.size := 10; leider nicht. Ich habe auch keinen Bezug zur Schriftgröße 10 d.h. wie viel Millimeter oder Zoll oder was auch immer drückt die Größe 10 eigentlich aus? Letztendlich ist ein Ausdruck mit Arial 10 egal aus welchem Programm und welcher Druckerauflösung immer gleich groß - also muss es hier eine Größendefinition geben.

Ich wäre dir sehr dankbar wenn du in einem kurzen Beispiel aufzeigen könntest wie ich mit den in einer Datenbank gespeicherten Vorgaben 'Arial' und 10 die Schrift einstellen kann :gruebel:

Gruß
Sidi61

Bjoerk 19. Dez 2015 11:34

AW: FontDialog - Font Size
 
Du kannst z.B. Canvas.Font.Height = - 20 eingeben. Dann ist die Schifthöhe 20 Pixel. In dem Fall greift PixelsPerInch nicht. :wink:

Sir Rufo 19. Dez 2015 11:46

AW: FontDialog - Font Size
 
Der Source von Bjoerk zeigt doch sehr schön, was Size bedeutet:

Die Höhe des Fonts bei einer Auflösung von 72dpi.

Size 72 => 1" hoch => 2,54cm hoch
Size 10 => 0,139" hoch => 0,35cm hoch

Der Printer.Canvas sollte das auch so umrechnen und auch in der Größe darstellen (unabhängig von der vorhandenen physikalischen Auflösung).

Der der rechnet das wieder um:

Size 72 bei 72dpi => 72px
Size 72 bei 96dpi => 96px
Size 72 bei 600dpi => 600px

Size 10 bei 72dpi => 10px
Size 10 bei 96dpi => 13px
Size 10 bei 600dpi => 83px

Sidi61 19. Dez 2015 14:55

AW: FontDialog - Font Size
 
Hallo Sir Rufo,

hab´s verstanden, der Zusammenhang zwischen FontSize aus Fontdialog und der echten Größe unter Berücksichtigung der Druckerauflösung ist mir nun klar.

Ist wirklich super erklärt von dir :thumb:

hab´s entsprechend eingebaut, funktioniert hat es aber erst nach dem ich folgendes rausgeschmissen hatte:
Delphi-Quellcode:
 SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC); //0,1mm Einheiten X-Achse nach rechts jedoch Y-Achse nach oben
 GetWindowExtEx(Printer.Canvas.Handle,w); //Drucker Auflösung ermitteln
 GetViewPortExtEx(Printer.Canvas.Handle,v); //Abmessung des Viewports auslesen
 SetMapMode(Printer.Canvas.Handle, MM_ANISOTROPIC);
 SetWindowExtEx(Printer.Canvas.Handle, w.cx, w.cy,nil); //Druckerauflösung bestätigen
 SetViewPortExtEx(Printer.Canvas.Handle, v.cx, -v.cy,nil); //Y-Achse kippen nach unten
Dazu findet man ja viele Foreneinträge unter dem Stichwort in Millimeter drucken.
Wollte das schon länger mal ausprobieren, scheitere aber immer an der Einstellung des Font, soll wohl nicht sein - oder hast du dazu noch eine Idee?

Gruß
Sidi61

Sailor 19. Dez 2015 17:57

AW: FontDialog - Font Size
 
Die Höhe eines Zeichensatzes wird in (typographischen) Punkten angegeben. Ein Punkt ist etwa 1/72", daher kommt die 72 in den Berechnungen. Die 10 bedeutet also 10 pt.

Sidi61 23. Dez 2015 16:07

AW: FontDialog - Font Size
 
Hallo zusammen,

das Problem mit Font.Size habe ich nun richtig umgesetzt, beim Ausdruck ist mir jedoch noch ein seltsamer Umstand aufgefallen.

Wenn ich die Seitenränder mit PageSetupDialog ermittle so scheint dieser Dialog die Mindestseitenränder des Druckers bereits zu berücksichtigen da er einen Seitenrand mit 0 mm nicht zulässt und automatisch korrigiert - hier 5 mm.

Wenn ich nun einen Seitenrand mit 10 mm festlege und diesen umgerechnet in Pixel mit textout verwende rechnet Textout startet der Ausdruck jedoch 10 mm vom Mindestrand d.h. die 5 mm werden noch dazugerechnet.

Gibt es eine Möglichkeit dass die Ränder absolut gesetzt werden oder muss ich die Mindestränder jedes mal abziehen??

Nachtrag: ok, habe die Berechnungen auf die druckbaren Bereiche reduziert und ziehe die Mindestränder des Druckers beim Setzen der Seitenränder einfach ab. Jetzt passt es perfekt

Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:21 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