| Autor |
Beitrag |
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Di 11.05.10 10:52
Hi,
ich lasse den Freereport einen Report generieren. Neben ein paar "Edits" (einzeilige Memos) ist da ein RichEdit ganz unten. Dieses kann beliebig groß sein und auch über mehrere Seiten gehen. Ok, da schlagen noch andre Bug zu, manche hab ich schon im Freereport-Code gefixt (sonst gibts nur Access Violations).
Das eigentlich Problem ist aber: Der Report sieht ok aus. Ich drucke ihn (nach PDF). Im PDF ist das Layout der Schrift aber anders...etwas größer, deutlich breiter. Die Schrift selbst könnte die selbe sein, nur das Layout ist anders. Was zur Folge hat, dass es zusätzliche Zeilenumbrüche gibt und zudem der "Rahmen" des gedruckten nicht an die veränderte Schrift angepasst wird => Es wird unten was abgeschnitten.
Jetzt die Frage:
Wie bekomme ich denn überhaupt raus, wie die Einstellungen im PDF sind? Und warum sind sie nicht so wie im Report? Wenn ich die Schriftgröße allgemein kleiner mache, dann ist sie überall kleiner...aber im PDF ist sie breiter. Da muss irgendwo ein Faktor rumhängen...
PS: Das eigentliche Problem ist, dass er es auch beim Drucken auf Papier so macht, weßhalb dann halt was fehlt => ich kann nix mehr aus meiner Datenbank drucken => Katastrophe  Interessanter Weise lief das ganze schon ne Weile (3 Jahre?)...scheint fast so als hat sich da was beim Speichern der frf Datei geändert.
In dem Code hier ist vermutlich das Verbrechen:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66:
| procedure TfrRichView.ShowRich(Render: Boolean); var Range: TFormatRange; MaxLen, LogX, LogY: Integer; StopRender: Boolean; EMF: TMetafile; EMFCanvas: TMetafileCanvas; re: TRichEdit; begin if Render then re := RichEdit else re := SRichEdit; FillChar(Range, SizeOf(TFormatRange), 0); with Range do begin if Render then hdc := Canvas.Handle else hdc := GetDC(0); if Render then if IsPrinting then begin LogX := GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX); LogY := GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY); rc := Rect(DRect.Left * 1440 div LogX, DRect.Top * 1440 div LogY, DRect.Right * 1440 div LogX, DRect.Bottom * 1440 div LogY); end else begin LogX := Screen.PixelsPerInch; LogY := LogX; rc := Rect(0, 0, Round(SaveDX * 1440 / LogX), Round(SaveDY * 1440 / LogY)); EMF := TMetafile.Create; EMF.Width := SaveDX; EMF.Height := SaveDY; EMFCanvas := TMetafileCanvas.Create(EMF, 0); EMFCanvas.Brush.Style := bsClear; hdc := EMFCanvas.Handle; end else begin LogX := Screen.PixelsPerInch; LogY := LogX; rc := Rect(0, 0, Round(DX * 1440 / LogX), Round(DY * 1440 / LogY)); end; hdcTarget := hdc; rcPage := rc; LastChar := CharFrom; MaxLen := re.GetTextLen; chrg.cpMax := -1; repeat chrg.cpMin := LastChar; LastChar := re.Perform(EM_FORMATRANGE, Integer(Render), Integer(@Range)); StopRender := ((LastChar < MaxLen) and (LastChar <> -1)) or (LastChar >= MaxLen) or (LastChar = -1) or (LastChar = 0); until StopRender; end; re.Perform(EM_FORMATRANGE, 0, 0); if not Render then ReleaseDC(0, Range.hdc) else if not IsPrinting then begin EMFCanvas.Free; Canvas.StretchDraw(DRect, EMF); EMF.Free; end; end; |
Die 1440 kommen mir sehr suspekt vor.
Googlen sagt mir:
| www.aboutvb.de/vba/a...kel/vbascreenres.htm hat folgendes geschrieben: |
Aus der Bildschirmauflösung in dpi können Sie zusätzlich noch den vertikalen und den horizontalen Umrechnungsfaktor für die Maßeinheit TWIPS ermitteln. Diese ist ein bei vielen externen Steuerelementen (wie etwa den Microsoft Common Controls) verwendeter Standard für bildschirmbezogene Abmessungen. Diese Maßeinheit errechnet sich als 1440tel der horizontalen bzw. vertikalen Bildschirmauflösung, wie sie von GetDeviceCaps geliefert wird. |
Hä? *googelt*
| de.wikipedia.org/wiki/Twip hat folgendes geschrieben: |
ist eine angloamerikanische Längeneinheit und bezeichnet die Teilung „TWentieth of an Inch Point“
1 twip = 17,6389241667372 μm |
Etwas probieren sagt mir, da berechnet er nur die Seitengröße...ich kann durch verringern der x-Werte die Breite der Seite beeinflussen...aber nicht die Schriftbreite...
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Zuletzt bearbeitet von Xion am Do 13.05.10 13:47, insgesamt 1-mal bearbeitet
|
|
Xion 
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Do 13.05.10 13:41
Nach 20 Stunden  ,  ,  ,  ,  ,  ,  ,  und  in denen ich versucht hab die Ursachen zu finden kam ich auf das Ergebnis:
"Preview of some RTF files do not look as their print
This issue is a known rich edit control problem."
Dann hab ich einfach mit der Holzhammermethode die Symptome entfernt:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74:
| procedure TfrRichView.ShowRich(Render: Boolean); var Range: TFormatRange; MaxLen, LogX, LogY: Integer; StopRender: Boolean; EMF: TMetafile; EMFCanvas: TMetafileCanvas; re: TRichEdit; begin if Render then re := RichEdit else re := SRichEdit; FillChar(Range, SizeOf(TFormatRange), 0); with Range do begin if Render then hdc := Canvas.Handle else hdc := GetDC(0);
if Render then begin LogX := Screen.PixelsPerInch; LogY := LogX; rc := Rect(0, 0, Round(SaveDX * 1440 / LogX), Round( SaveDY* 1440 / LogY)); EMF := TMetafile.Create; EMF.Width := SaveDX; EMF.Height := SaveDY; EMFCanvas := TMetafileCanvas.Create(EMF, 0); EMFCanvas.Brush.Style := bsClear; hdc := EMFCanvas.Handle; end else begin LogX := Screen.PixelsPerInch; LogY := LogX; rc := Rect(0, 0, Round(DX * 1440 / LogX), Round(DY * 1440 / LogY)); end; hdcTarget := hdc; rcPage := rc; LastChar := CharFrom; MaxLen := re.GetTextLen; chrg.cpMax := -1; repeat chrg.cpMin := LastChar; LastChar := re.Perform(EM_FORMATRANGE, Integer(Render), Integer(@Range)); StopRender := ((LastChar < MaxLen) and (LastChar <> -1)) or (LastChar >= MaxLen) or (LastChar = -1) or (LastChar = 0); until StopRender; end; re.Perform(EM_FORMATRANGE, 0, 0); if not Render then ReleaseDC(0, Range.hdc) else if not IsPrinting then begin EMFCanvas.Free; Canvas.StretchDraw(DRect, EMF); EMF.Free; end else if IsPrinting then begin EMFCanvas.Free; Printer.Canvas.StretchDraw(DRect, EMF); EMF.Free; end end; |
Ich habe einfach die Berechnung für den Drucker blockiert und rendere dafür das Preview auf den Drucker. Wenn der Drucker Querformat wäre dann gäbs sicher Probleme, allerdings gibt es ja so auch die Probleme, weil der Text angeblich nicht reinpasst (dann fehlt einfach ne Zeile, weil er das RichEdit schon beim Preview auf die Seiten eingepasst hat) oder es ist noch ne Menge weiß. Vor allem verändert er auch das Schriftbild (Zeichen werden breiter/schmaler).
Der Versuch einfach ein Memo zu nehmen (ohne RTF dann) hat auch nicht funktioniert, weil das Memo beim Seitenumbruch böse Bugs in Freereport hat. Das RTF ausdrucken hat auch nicht geklappt, da hat er noch unendlich leere Seiten hintenran gehängt. Der RichEdit ist genauso verbuggt wie Freereport und Delphi 2005 
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
|