![]() |
Schrift Größe
Hey alle zusammen,
Ich hab da ein Problem. nach dem das mit dem Drucken jetzt funktioniert (alles außer Leerzeilen) hab ich ein problem mit Schriftgröße (zb Standard Word 11/12) und der Schriftgröße bei Lazarus. kann mir da jemand helfen wenn möglich einen umrechnuingsfaktor der auch die dpi des Druckers mit ein bezieht :D vielen dank schon mal. liebe Grüße Finki |
AW: Schrift Größe
Wenn Du Schrifthöhe in Punkt [pt] in Drucker-Pixel [px] meinst:
Delphi-Quellcode:
mit
SchriftSize:double; // Schrifthöhe in Punkt Printer.Canvas.Font.Height := -round(SchriftSize*Printer.Canvas.Font.PixelsPerInch/72); // [pt] -> [px] |
AW: Schrift Größe
Zitat:
|
AW: Schrift Größe
weil das das aus dem Verhältnis cm/inch ergibt. Punkt ist nunmal metrisch, dpi wie das i darin schon sagt. per inch.
|
AW: Schrift Größe
Beim Drucker kannst Du auch beides für die Schriftgröße verwenden, Punkt oder Pixel. Das würde ich abhängig machen von der verwendeten Schrift, ob es eine auf Punkt skalierbare Schrift ist oder eine nicht skalierbare Pixelschrift. (Beim Bildschirm dagegen würde ich immer Pixel vorgeben.)
Zitat:
Zitat:
Zitat:
Anmerkung zu meinem ersten Quellcode: Ich verwende einen Gleitkommawert für die Schriftgröße in Punkt, damit auch Zwischengrößen möglich sind. Bei Vorgaben in Pixeln sind logo Ganzzahlen (vorzeichenbehaftet) sinnvoll. |
AW: Schrift Größe
Zitat:
Die 72 kommt daher, dass Schriftgrößen in der Einheit „Punkt“ angegeben werden, und ein „Punkt“ definiert ist als 1/72 inch. Also bekommst du, wenn du die in Punkt angegebene Schriftgröße durch 72 dividierst, die Schriftgröße in inch. Wenn du diese Zahl dann mit PixelsPerInch multiplizierst, erhältst du folglich die Größe in Pixeln. |
AW: Schrift Größe
1 Pica Point = 0,35147 mm = 1/72,27 Inches <commentend>
|
AW: Schrift Größe
und wenn ich meine Memo componente so breit machen will wie eine Din A 4 seite dann muss sie also 1 durch 0,35147 = 2,84519 und des dann mal meine breite von 210 ist dann die breite der memo componente stimmt das
|
AW: Schrift Größe
Zitat:
Wenn Du einen Text auf eine bestimmte Breite drucken willst, also nicht die Höhe oder Zeichen per Einheit vorgibt, sondern die Breite des Ausdrucks und zwar nur exakt für diesen einen Text, dann kannst Du doch einfach per Einpassen die Schrift setzen. Alternativ eben auch für alle Textzeilen testen, welche die Längste ist, und mit den Einpaßwerten diese längsten Zeile (längste im Ausdruck in Breite in einer Längenmaßeinheit, nicht in Anzahl der Buchstaben) die anderen Zeilen auch drucken. |
AW: Schrift Größe
Hä (sry das ich nochmal darauf zurück komme, aber ich hatte grad viel um die Ohren)
also ich hab meinen Text in der Memo (Schriftgröße 12) und den möchte ich ausdrucken, Wie kann ich bei veränderbarer Schriftgröße die richtige Schrifthöhe an meinen drucker senden, Wie bekomme ich die Zeilenumbrüche an den Drucker gesendet, Wie setze bzw bekomme ich die "breite" einer Textzeile??? ich entschuldige mich falls ich meine fragen wiederhole aber iwie finde ich des voll komisch warum kann ich dem drucker nicht einfach sagen drucke das aus wenn die zeile länger is als das blatt füge eine zeile drunter ein???:?: vielen dank für eure Gedult mit mir :D |
AW: Schrift Größe
Die Unit printers "weiß", daß für gewöhnlich der Drucker eine andere Auflösung als der Bildschirm hat und rechnet die Schrifthöhe für dich um. Es reicht also, wenn du (nach Printer.BeginDoc) zum Beispiel Printer.Canvas.Font.Size := 12 schreibst.
|
AW: Schrift Größe
Man Leute:
Die Schriftgröße wird in Punkt (oder von mir aus auch in Millimetern) angegeben, das ist eine absolute Größe. Das Ausgabegerät auf Pixelbasis hat eine bestimmte Anzahl von Pixeln pro Millimeter. Hier ist die Einheit allerdings DPI, also 'Dots per Inch'. Gut gut. Ich habe also einen 12pt. Font. Auf einem Drucker mit 600dpi sind das dann...600*12/72=100 pixel (Höhe). Auf einem Bildschirm mit 96dpi wären das eben nur 96*12/72=16 pixel. Bei Bildschirmen wird man sich nicht immer die Mühe machen, die korrekten DPI anzugeben, weswegen es eben vorkommt, das auf dem einen Bildschirm die Schrift größer erscheint (weil ein Pixel größer ist) als auf dem anderen. Das Ganze hat nichts mit astraler Intelligenz einer Unit zu tun. Die weiß nämlich nichts, sondern ist dumm wie Brot und rechnet eben nur (Absolute Größen in Geräteeinheiten, ergo: pt/inch/cm in Pixel). Um deine Zeilenumbrüche auf dem Papier genauso hinzubekommen, wie auf dem Bildschirm, musst Du deine Papierbreite (21cm abzüglich Rand) auf dem Bildschirm simulieren. Lassen wir 2cm Rand, dann hätten wir 21-2*2=17cm. Das sind 17/2.54 inches und bei z.B. 96dpi wäre das Papier dann 642 pixel breit. Nebenbei: Zitat:
|
AW: Schrift Größe
Zitat:
Es nützt allerdings herzlich wenig, wenn der TE nichtmal sagen kann, was er eigentlich als Ergebnis haben will und wie er den Drucker anspricht. |
AW: Schrift Größe
Mann hier geister Know How durch die Beiträge, da könnte man Bibliotheken mit füllen.
@Finki was willst Du eigentlich? a) Text, der in einem Memo angezeigt wird ausdrucken, egal wie die Bildschirmanzeige ist, das bedruckte Blatt soll "füllend" mit max.Zeilenlänge/breite gefüllt sein. Die Schriftgröße ist vorgegeben, aber unabhängig von der Bildschirmdarstellung. b) Du möchtest WYSIWYG(ähnliches). Wird die Zeile auf demBildschirm umgebrochen, soll auch die Zeile im Ausdruck umgebrochen werden. (Was ist wenn Papierformat und Bildschirmformat nicht zueinander passen?) c) nichts davon, Du ist mit der eierlegenden Wollmilchsau zufrieden. Gruß K-H |
AW: Schrift Größe
Zitat:
nein ernsthaft ich möchte ein Programm (Text Editor) der Text wird in eine Memo geschrieben und dann kann man ihn ausdrucken... so weit so gut die Probleme sind: 1. Leerzeilen werden komischer weiße nicht gedruckt 2. Ich will die Option haben das man die Schriftgröße sowohl auf dem Bildschirm (also in der Memo) als auch auf dem gedruckten Papier zu ändern (logischer weise in Abhängigkeit, also ich ändere sie in meiner Memo und dann wird es auch in der richtigen Größe ausgedruckt) 3. Wenn eine Zeile zulang ist soll sie beim Ausdrucken automatisch umbrechen ja ich glaub das wäre es dann :D uff es würde mir, vorerst, aber auch ein (sehr gut) kommentierter Druckbefehl (an dem an erkennen kann was wo wie geändert wird) reichen VIELEN VIELEN DANK:? |
AW: Schrift Größe
Zitat:
Zitat:
a) nutzt Du Wordwrap in Deinem Memo? Dann hast Du unter Umständen ungewollte Zeilenumbrüche, bzw. Umbrüche die garnicht existieren. b) wie auch immer Du die Fontgröße änderst, die Bildschirmdarstellung und die Darstellung auf dem Drucker sind maximal ähnlich, aber nie gleich. In der Praxis bedeutet das, daß Zeilenumbrüche nie gleich aussehen. c) "leere Zeilen" und "Leerzeilen" sind nicht das gleiche! Leere zeilen können z.b. durch ein Blank am Satzende verursacht werden, das durch den Umbruch in die nächste Zeile gerutscht ist. Wenn Du zu lange Zeilen im Ausdruck umbrechen willst, solltest Du mal nach Textrec und Textwidth,Cliprect schauen. Gruß K-H |
AW: Schrift Größe
Code lade ich heute abend hoch.
Was zur Hölle ist Wordwarp????? Leerzeilen == zb das hier text text text text |
AW: Schrift Größe
Für einen Texteditor bei dem Druckbild und Bildschirmanzeige übereinstimmen sollen halte ich ein Memo für denkbar ungeeignet. Man sollte eher daher gehen, und den Text komplett selber auf einen Canvas zeichnen. Damit hätte man die Freiheit dies sowohl auf einen Bitmap-Canvas als auch den Drucker-Canvas genau gleich zu malen, und schafft sich zugleich die Freiheit beliebig zoomen zu können, sowie eine Basis für andere Elemente als nur Text. (Spinnt man das zu ende würde man grob bei Word heraus kommen.)
|
AW: Schrift Größe
Zitat:
|
AW: Schrift Größe
dann würd' ich vielleicht einfach was von TStringlist ableiteten, so daß man nachher einfach schreiben kann:
Delphi-Quellcode:
var
StringListPrintExt: TStringListPrintExt; begin StringListPrintExt := TStringListPrintExt.Create; try StringListPrintExt.Assign(Memo1.Lines); StringListPrintExt.Font.Assign(Memo1.Font); StringListPrintExt.Print; finally StringListPrintExt.Free; end; end; |
AW: Schrift Größe
Zitat:
Delphi-Quellcode:
wäre richtig.
.WordWrap
Zitat:
Delphi-Quellcode:
) oder in einem Tstrings.Text gibt es eine solche Zeichenfolge ...#13#10#13#10...
if length(mystring)=0 then
Zitat:
@Bjoerk Was ist
Delphi-Quellcode:
?
TStringListPrintExt;
Gruß K-H |
AW: Schrift Größe
@K-H
Was gibt's bei was von TStringlist ableiten nicht zu verstehen? Oder gefällt die der Name der Klasse nicht? Ext steht für Erweiterung und für was steht wohl Print? :) So ungewöhnlich? Hast du sowas ähnliches nicht zu Hause rumfliegen?
Delphi-Quellcode:
TStringListPrintExt = class(TStringList)
private FWantPageNumbers: boolean; FFontColor: TColor; FFontStyle: TFontStyles; FFontSize: integer; FLineSpacing: integer; FMarginLeft: integer; FMarginTop: integer; FOrientation: TPrinterOrientation; FFontName: string; FTitle: string; FFormFeed: char; FUsePageBreak: boolean; FUseLineBreak: boolean; FOnPrintingStrings: TOnPrintingStrings; function GetLineHeight: integer; function GetCanvasHeight: integer; function CheckForNewPage(const Y: integer; const S: string): integer; function GetLineWidth(const S: string): integer; function GetMaxLineWidth: integer; function TrimRightBlankOnly(const S: string): string; procedure DoLineBreak(Result: TStringList); procedure SetDefaults; public procedure Print; property WantPageNumbers: boolean read FWantPageNumbers write FWantPageNumbers; property FontColor: TColor read FFontColor write FFontColor; property FontStyle: TFontStyles read FFontStyle write FFontStyle; property FontSize: integer read FFontSize write FFontSize; property LineSpacing: integer read FLineSpacing write FLineSpacing; property MarginLeft: integer read FMarginLeft write FMarginLeft; property MarginTop: integer read FMarginTop write FMarginTop; property Orientation: TPrinterOrientation read FOrientation write FOrientation; property FontName: string read FFontName write FFontName; property FormFeed: char read FFormFeed write FFormFeed; property UsePageBreak: boolean read FUsePageBreak write FUsePageBreak; property UseLineBreak: boolean read FUseLineBreak write FUseLineBreak; property Title: string read FTitle write FTitle; property OnPrintingStrings: TOnPrintingStrings read FOnPrintingStrings write FOnPrintingStrings; constructor Create; end; |
AW: Schrift Größe
Zitat:
Wenn Du so ein geniales Teil hast, hier findest Du ein dankbares Publikum. Gruß K-H |
AW: Schrift Größe
@Bjoerk
So macht man das aber nicht. Man baut sich eine abstrakte Klasse, die eine TStrings-Instanz ausgeben kann. Eine konkrete Ableitung davon erledigt die Ausgabe auf einen Drucker. |
AW: Schrift Größe
Das geht mit einem TMemo nicht, denn die Zeilenumbrüche bei WordWrap=True werden im Text nicht gespeichert.
Wieso versuchst Du dich nicht an TRichEdit? Ich meine, das es dafür sogar eine Demo gibt. |
AW: Schrift Größe
Rufo, ich hab die Klasse seinerzeit halt von TStringlist abgleitet, fand ich irgendwie einfacher. Wie auch immer. K-H, ich hab auch nicht den Anspruch geniale Klassen zu erstellen. Mein Code ist an der Stelle eh völlig uninteressant. War nur ein Vorschlag. Hab den Code auch absichtlich nicht vollständig gepostet, fänd ich dem TE gegenüber unfair. Schließlich sucht TE hier Unterstützung für seine Variante (die TE demnächst posten wollte) und ich möchte TE nicht meine aufschwatzen.
|
AW: Schrift Größe
Wäre aber flexibler, eine Klasse zu schreiben, die eine TStringlist ausgeben kann. Die kann man dann auch mit der Eigenschaft 'Memo.Lines' füttern. Eine abstrakte Klasse wird dazu zunächst einmal nicht benötigt. Eine reicht, imho.
|
AW: Schrift Größe
Die umbrochenen Zeilen des Memos sind doch in TMemo.Lines : TStrings; enthalten. Wenn also das Memo proportional auf dem Drucker ausgegeben werden soll (wobei sich der TE mit proportional oder nicht nie so richtig mit sich selbst einig war) reicht es doch:
a) einen Skalierungsfaktor zwischen TMemo-Breite und Drucker-Nutzen-Breite zu ermitteln (Drucker-Nutzen-Breite = druckbarerer Bereich in x, abzüglich Heftrandbereich (wird heute aber eh meist weggelassen), abzüglich einer Reserve, falls die Druckausgabe etwas länger läuft), b) mit diesem Skalierungsfaktor die Schriftgröße (gleiche Schrift) und den Zeilenabstand für den Drucker setzen, eben proportional zum Memo, c) für den Druck den y-Startwert und die max. Zeilen/Seite festlegen (Seiten-Startwerte), weil wohl die wenigsten heutigen Drucker einen automatischen Seitenvorschub machen, und wenn, dann mit verstümmelten Seiten-End- und -Anfangszeilen, d) und dann die TMemo.Lines von Anfang [0] bis Ende [length-1] abklappern, bei jeder Zeile auch einen Zeilenvorschub machen (y erhöhen), egal ob was drin ist in der Zeile oder nicht (Thema "Leerzeilen"), dabei den y-Wert mitzählen und rechtzeitig vor Erreichen des max-y-Wertes die Seite abschließen (Printer.NewPage; ) und eine neue beginnen (Seiten-Startwerte resetten) (Falls nicht das Ende der Lines erreicht sind). Dabei fällt nur noch die extrem schwierige Entscheidung an, das Ganze in Pixeln oder mm zu machen (ich perönlich verwende grundsätzlich mm, auch weil ich beim Testdruck so schlecht Pixel messen kann und weil mm, einmal gemäß der Druckerauflösung gesetzt, auch immer mm sind). Evtl. kann man, wie von mir auch ganz am Anfang erwähnt, eine Zeilenlängenmessung der längsten Zeile (nicht die meisten Zeichen sondern die größte Laufweite (ausgegebene Zeilenbreite)) in der Memo.canvas machen und diese längste Zeile dann in der Printer.canvas "nachmessen", um sicher zu gehen, daß die Schriftgröße für den Drucker stimmt. Dabei muß aber auch der Schrift-Stil berücksichtigt werden. Wenn der TE allerdings das Memo nicht proportional, sondern mit festgelegten Schriftgrößen ausgeben will, kann er ja TMemo.Text : string; verwenden und muß dann eben neu umbrechen. Ansonsten gilt außer dem jeweilgen Zeilen-Textinhalt dasselbe wie oben. FF beim Neuumbrechen mit nicht-fixed Schriften. |
AW: Schrift Größe
Zitat:
|
AW: Schrift Größe
Zitat:
|
AW: Schrift Größe
Zitat:
|
AW: Schrift Größe
Zitat:
![]() vorgegeben ist gar nichts wir müssen einfach ein "sinnvolles" programm schreiben welches funktioniert :D |
AW: Schrift Größe
Weil du auf den Canvas zeichnest, eine Leinwand hindert deine Hand ja auch nicht den Pinsel außerhalb des Randes zu führen.
Verwende besser ein Reportingsystem o.ä. |
AW: Schrift Größe
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:40 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