Schriftgröße bei TextRect auf Printer.Canvas

Rund um die LCL und andere Komponenten
Antworten
AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Schriftgröße bei TextRect auf Printer.Canvas

Beitrag von AlterMann »

Hallo

Schon wieder so eine leidige Druckerfrage :oops:

Code: Alles auswählen

 
     r.Left:=x1;
      r.right:=x8;
      r.top:=y13;
      r.bottom:=y14;
      Printer.Canvas.Font.Name := 'Arial';
      Printer.Canvas.Font.Size:=140;
      druckstyle.Alignment:=taCenter;
      druckstyle.Layout:=tlCenter;
      druckstyle.Wordbreak:=true;
      druckstyle.Singleline:=false;
      Printer.Canvas.TextRect(r,1,1,s,druckstyle);
 
Der Text in s wird zwar korrekt Zentriert aber die Schrift ist winzig klein, egals was in Printer.Canvas.Font.Size drin steht.
Ich werd' noch wahnsinnig ...

Hat wer eine Idee?

Schönen Sonntag
Christian
Früher war alles besser. Und aus Holz!

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Schriftgröße bei TextRect auf Printer.Canvas

Beitrag von theo »

Kann ich nicht nachvollziehen.

Dieser Code:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var r:TRect;
  druckstyle:TTextStyle;
begin
  if PrintDialog1.Execute then
  begin
    Printer.BeginDoc;
    Printer.Canvas.Font.Name := 'Arial';
    Printer.Canvas.Font.Size:=18;
    druckstyle.Alignment:=taCenter;
    druckstyle.Layout:=tlCenter;
    druckstyle.Wordbreak:=true;
    druckstyle.Singleline:=false;
    r.Left:=Printer.PaperSize.PaperRect.WorkRect.Left+10;
    r.Top:=Printer.PaperSize.PaperRect.WorkRect.Top+40;
    r.Right:=Printer.PaperSize.PaperRect.WorkRect.Right-20;
    r.Bottom:=r.Top+Printer.Canvas.TextHeight('AZ');
    Printer.Canvas.Rectangle(r);
    Printer.Canvas.TextRect(r,r.Left,r.Top,'hallo test hallo test',druckstyle);
    Printer.EndDoc;
  end;
end; 
Druckt bei mir das angehängte Dokument.
Lazarus 1.3 r44647M FPC 2.7.1 x86_64-linux-gtk 2
Dateianhänge
theo.pdf
(9.86 KiB) 83-mal heruntergeladen

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Schriftgröße bei TextRect auf Printer.Canvas

Beitrag von m.fuchs »

Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Schriftgröße bei TextRect auf Printer.Canvas

Beitrag von AlterMann »

Danke euch beiden für die Antworten

@Michael:
Den Beitrag mit den falschen dpi-Werten hatte ich auch schon gefunden, das ist bei mir nicht der Fall.
Drucker hat 600dpi, das wird auch angezeigt.

@theo:
Danke für's ausprobieren.
Dein Code funktioniert in meinem Programm genauso wie bei Dir. :(

Allerdings nur wenn ich die Variable r vor druckstyle deklariere!!! (Im Code der erste - nicht auskommentierte - Teil)

Mach ich es umgekehrt druckt er die falsche Variante. (siehe Anhänge gut.pdf und schlecht.pdf)

Dumm ist nur, daß ich in meiner Originalroutine die Variablen in der "richtigen" Reihenfolge deklariere, es aber trotzdem falsch druckt.

Ich meine irgendwo gelesen zu haben, daß TRect in verschieden Units unterschiedlich definiert sei.
Meint ihr, daß das die Lösung sein könnte?

Eine Linie Diagonal durch r gezeichnet scheint korrekt gezeichnet zu werden, trotzdem ist die Schrift wunzig klein.

Ich glaub ich gehör' bald ins Bett :oops: (oder in die Klapse!) :mrgreen:

Code: Alles auswählen

procedure TForm1.Button18Click(Sender: TObject);//Komm drucken
 
 var r:TRect;
   druckstyle:TTextStyle;
 begin
   if PrintDialog1.Execute then
   begin
     Printer.BeginDoc;
     Printer.Canvas.Font.Name := 'Arial';
     Printer.Canvas.Font.Size:=36;
     druckstyle.Alignment:=taCenter;
     druckstyle.Layout:=tlCenter;
     druckstyle.Wordbreak:=true;
     druckstyle.Singleline:=false;
     r.Left:=Printer.PaperSize.PaperRect.WorkRect.Left+10;
     r.Top:=Printer.PaperSize.PaperRect.WorkRect.Top+40;
     r.Right:=Printer.PaperSize.PaperRect.WorkRect.Right-20;
     r.Bottom:=r.Top+Printer.Canvas.TextHeight('AZ');
     Printer.Canvas.Rectangle(r);
     Printer.Canvas.TextRect(r,r.Left,r.Top,'hallo test hallo test',druckstyle);
     Printer.EndDoc;
   end;
 end;
{var druckstyle : TTextStyle;
    r : TRect;
begin
 if PrintDialog1.Execute then
  begin
 Printer.BeginDoc;
 
Printer.Canvas.Font.Name := 'Arial';
Printer.Canvas.Font.Size:=36;
druckstyle.Alignment:=taCenter;
druckstyle.Layout:=tlCenter;
druckstyle.Wordbreak:=true;
druckstyle.Singleline:=false;
r.Left:=Printer.PaperSize.PaperRect.WorkRect.Left+10;
r.Top:=Printer.PaperSize.PaperRect.WorkRect.Top+40;
r.Right:=Printer.PaperSize.PaperRect.WorkRect.Right-20;
r.Bottom:=r.Top+Printer.Canvas.TextHeight('AZ');
Printer.Canvas.Rectangle(r);
Printer.Canvas.TextRect(r,r.Left,r.Top,'hallo test hallo test',druckstyle);
Printer.Enddoc;
end;
   //if MeinPrintDialog then
 // if CheckBox16.Checked then Kommissiondrucken(true) else Kommissiondrucken(false);
end;  }
 
gut.pdf
(2.76 KiB) 86-mal heruntergeladen
schlecht.pdf
(6.62 KiB) 69-mal heruntergeladen
Früher war alles besser. Und aus Holz!

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Schriftgröße bei TextRect auf Printer.Canvas

Beitrag von AlterMann »

Update:

Hab versucht r als classes.TRect sowie als windows.TRect zu deklarieren.

Beides negativ :(
Früher war alles besser. Und aus Holz!

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Schriftgröße bei TextRect auf Printer.Canvas

Beitrag von AlterMann »

Nur zru Verdeutlichung:

Code: Alles auswählen

 
var r:TRect;
      druckstyle:TTextStyle;
 
funktioniert ...


Code: Alles auswählen

 
var druckstyle:TTextStyle;
      r:TRect;
 
nicht ....
Früher war alles besser. Und aus Holz!

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Schriftgröße bei TextRect auf Printer.Canvas

Beitrag von theo »

Das kann ich nicht nachvollziehen. Es ergibt ja auch wirklich überhaupt keinen Sinn.
Ich glaube dein Problem liegt woanders.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Schriftgröße bei TextRect auf Printer.Canvas

Beitrag von Michl »

Ich kann das Fehlverhalten bestätigen, wobei Laz. 1.2.0 und Laz.1.3-Trunc (Win64bit Laz.32bit) jeweils auch noch unterschiedliche Verhalten zeigen. Heaptrc zeigt nichts an. Ich denke, das Verhalten ist ein Bugtrackereintrag wert!

Wobei der Unterschied jeweils in der Reihgenfolge der Deklaration von druckstyle:TTextStyle und r:TRect liegt. Da ich es auch anfangs nicht glauben konnte habe ich das mehrfach hintereinander probiert, immer mit dem gleichen Ergebnis. Siehe unten.
Dateianhänge
Laz1.3.jpg
Laz1.2-2.jpg
Laz1.2-1.jpg

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Schriftgröße bei TextRect auf Printer.Canvas

Beitrag von theo »

Ich habe es auf
Lazarus 1.3 r44721M FPC 2.7.1 x86_64-linux-gtk 2
CompilerDate=27.02.2014
getestet und konnte kein Problem feststellen.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Schriftgröße bei TextRect auf Printer.Canvas

Beitrag von Michl »

Muss/Kann man sonst noch was einstellen?!?

Code: Alles auswählen

{$DEFINE Test1}
 
procedure TForm1.Button1Click(Sender: TObject);
{$IFDEF Test1}
var
  druckstyle:TTextStyle;
  r:TRect;
{$ELSE}
var
  r:TRect;
  druckstyle:TTextStyle;
{$ENDIF}
begin
  if PrintDialog1.Execute then
  begin
    Printer.BeginDoc;
    Printer.Canvas.Font.Name := 'Arial';
    Printer.Canvas.Font.Size:=18;
    Printer.Canvas.Font.PixelsPerInch := 600;
    druckstyle.Alignment:=taCenter;
    druckstyle.Layout:=tlCenter;
    druckstyle.Wordbreak:=true;
    druckstyle.Singleline:=false;
    r.Left:=Printer.PaperSize.PaperRect.WorkRect.Left+10;
    r.Top:=Printer.PaperSize.PaperRect.WorkRect.Top+40;
    r.Right:=Printer.PaperSize.PaperRect.WorkRect.Right-20;
    r.Bottom:=r.Top+Printer.Canvas.TextHeight('AZ');
    Printer.Canvas.Rectangle(r);
    Printer.Canvas.TextRect(r,r.Left,r.Top,'hallo test hallo test',druckstyle);
    Printer.EndDoc;
  end;
end;     
Unterschied ist in definertem Test1 zu erkennen.

Könnt eine undefinierte Variable sein...

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Schriftgröße bei TextRect auf Printer.Canvas

Beitrag von theo »

Vllt mal so probieren:

Code: Alles auswählen

var
  Rec: TRect;
  Style: TTextStyle;
begin
  FillChar(Style, SizeOf(TTextStyle), 0);
  Style.Opaque := True;
  Style.SystemFont := True;

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Schriftgröße bei TextRect auf Printer.Canvas

Beitrag von Michl »

Mit

Code: Alles auswählen

    druckstyle.Opaque:=True;
    druckstyle.SystemFont:=False;   
ist bei mir dann alles gut und es wird immer das gleiche Ergebnis geliefert, egal ob Laz1.2/1.3 oder mit/ohne Test1. Stelle ich Systemfont auf True, nimmt er keinerlei Größenänderungen an.

Theo, hast wie immer den Finger drauf! :D

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Schriftgröße bei TextRect auf Printer.Canvas

Beitrag von theo »

Dann ist's ja gut. Du hattest also recht mit der "undefnierten Variablen" resp. "nicht initialisierten" Variablen.

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Schriftgröße bei TextRect auf Printer.Canvas

Beitrag von AlterMann »

Ihr seid spitze! :D

Michl hat geschrieben:Mit

Code: Alles auswählen

    druckstyle.Opaque:=True;
    druckstyle.SystemFont:=False;   
ist bei mir dann alles gut und es wird immer das gleiche Ergebnis geliefert, egal ob Laz1.2/1.3 oder mit/ohne Test1. Stelle ich Systemfont auf True, nimmt er keinerlei Größenänderungen an.

Theo, hast wie immer den Finger drauf! :D
Bei mir auch!
Darauf muß man einmal kommen.

Vielen, vielen Dank!
Früher war alles besser. Und aus Holz!

Antworten