![]() |
Fastreport 2025.1 Chart wird nur verkleinert dargestellt
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen
ich bin aktuell dabei einige QuickReports auf FastReport umzustellen. Das Ganze unter Delphi XE Dabei übertrage ich ein TChart mit
Delphi-Quellcode:
an den Report.
lPictureView := TFrxPictureView(frpStandalone.FindObject('rpim03Chart'));
if (lPictureView <> nil) and (FChart <> nil) then lPictureView.Picture.Assign(FChart.TeeCreateMetafile(False, Rect(0, 0, Round(lPictureView.Width), Round(lPictureView.Height)))); In meiner Entwicklungsumgebung mit Bidlschirmauflösung 1920 x 1200 wird der Chart im Report korrekt dargestellt Drucke ich denselben Report auf einem Laptop mit 3840 x 2400, Skalierung 225% aus, ist der Chart stark verkleinert (s.Anhang) Egal wie ich die Properties AutoSize, KeepAspectRatio und Stretched auch setze, das Problem bleibt Hat jemand einen Lösungsansatz? Grüße und Danke Gerd |
AW: Fastreport 2025.1 Chart wird nur verkleinert dargestellt
Das Problem kommt mir bekannt vor. Wir verwenden eine auf TMetaFile-Instanzen basierende Druckvorschau und hatten diesbezüglich ebenfalls Probleme, dass eine mittels TChart.TeeCreateMetafile erzeugte TMetaFile-Instanz beim Einfügen falsch skaliert wurde, wenn die Bildschirmskalierung nicht auf 100% stand.
Ich habe als Lösung eine Routine erstellt, welche mir in Abhängigkeit der Bildschirmskalierung zwei Faktoren ermittelt, welche ich dann benutze, um das an TeeCreateMetafile übergebene Rechteck anzupassen. Die Routine selber verwendet dazu einen Thread, welcher mittels SetThreadDpiAwarenessContext zunächst seine DPI Awareness auf per-Monitor V2 (DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2) stellt, um unabhängig von der DPI Awareness des Hauptprogramms zu sein. Anschließend wird mittels GetDpiForMonitor die DPI des Monitors ermittelt. Das ganze ins Verhältnis zu 96 DPI gesetzt ergibt dann die oben genannten Faktoren. Des weiteren setzen wir den ersten Parameter von TeeCreateMetafile auf True, um eine erweiterte ("enhanced") TMetaFile-Instanz zu erhalten. Ich weiß allerdings nicht, ob dies für das Problem relevant ist. |
AW: Fastreport 2025.1 Chart wird nur verkleinert dargestellt
Hallo Hotsr02,
leider hat mir die Antwort nicht weitergeholfen. Wie gesagt arbeite ich mit Delphi XE und da habe ich die Befehle SetThreadDpiAwarenessContext und GetDpiForMonitor nicht gefunden. Parallel habe ich versucht das Rechteck mal fix zu skalieren, aber auch das hat nicht geklappt. Ich habe dazu einfach Width und Heigth * 2 genommen.
Delphi-Quellcode:
Das dargestellte Chart war aber gleich klein wie zuvor.
lPictureView.Picture.Assign(FChart.TeeCreateMetafile(False, Rect(0, 0, Round(lPictureView.Width * 2), Round(lPictureView.Height * 2))));
|
AW: Fastreport 2025.1 Chart wird nur verkleinert dargestellt
Geschafft, wenn auch anders als gedacht.
Nachdem ich im Hauptformular die Unit XPMan eingebunden habe, war nichts weiter mehr nötig. Das Chart wird jetzt auch mit Skalierungsfaktor 225 korrekt (in voller Größe) angezeigt Danke Gerd |
AW: Fastreport 2025.1 Chart wird nur verkleinert dargestellt
Du wirst über die Einbindung der Unit XPMan die DPI Awareness deiner Anwendung beeinflussen. Je nachdem wie die Eigenschaft Scaled deiner Formulare gesetzt ist, hat dies Einfluss auf die Skalierung deiner Fenster.
Der von mir vorgeschlagene Ansatz ist halt unabhängig von einem eingebundenen Manifest / der DPI Awareness der Anwendung. |
AW: Fastreport 2025.1 Chart wird nur verkleinert dargestellt
Zitat:
Das Problem ist, dass ohne Einbindung des Manifests die von mir gewählten Lösungen immer 100% angezeigt haben und die von dir erwähnten Befehle in XE nicht vorhanden sind. Deshalb kams erst zur Einbindung von XPMan. Die hat dann aber auch schon ausgereicht um das Problem zu lösen siehe auch ![]() |
AW: Fastreport 2025.1 Chart wird nur verkleinert dargestellt
Wenn etwas in den mitgelieferten API-Aufrufen fehlt,
dann entweder etwas suchen, wo es enthalten ist. * JCL * WinMD * oder so oder es selbst implementieren * in diesem Fall beim Hersteller nachsehn (auf der Webseite oder im Platform-SDK) * im SDK suchen und das C++ nach Delphi übersetzen, oder die Definition im MSDN suchen und sich den Delphi-Aufruf entsprechend zusammenbauen ![]() ![]() ![]() Delphi XE, aus dem Jahr 2010, kann natürlich noch keine API kennen, welche erst im Jahre 2015 mit Windows 10 aufgetaucht ist. |
AW: Fastreport 2025.1 Chart wird nur verkleinert dargestellt
Liste der Anhänge anzeigen (Anzahl: 1)
Tja, irgendwie war das falsche Scaling plötzlich wieder da und trotz SVN-reverts bekam ich es nicht mehr hin, den Chart korrekt zu skalieren.
Jetzt habe ich es aber hoffentlich endgültig und ohne Anwendung von Manifests gelöst. Ich habe zum Skalieren diese Funktion implementiert. Sie hat sich nach verschiedenen Builds und auf unterschiedlichen Rechnern bewährt:
Delphi-Quellcode:
Und der Aufruf erfolgt so:
procedure TForm1.AssignAndScaleChart(aPictureView: TFrxPictureView; aChart: TChart);
// ***************************************************************************************************************************************** // Chart in FR report auch bei Screen scaling > 100% korrekt skalieren var rHeight, rWidth: Extended; rFactorHeight, rFactorWidth: Double; begin // Erlaubte Größenparameter speichern rWidth := aPictureView.Width; rHeight := aPictureView.Height; // Autosize uns Autostretch zulassen und Chart laden aPictureView.Stretched := true; aPictureView.AutoSize := true; aPictureView.Picture.Assign(aChart.TeeCreateMetafile(true, Rect(0, 0, Round(aPictureView.Width), Round(aPictureView.Height)))); FMsg := FMsg + Format('; PicViewStretch: %1.1f x %1.1f', [aPictureView.Width, aPictureView.Height]); // Factor ermitteln damit Chart in definierte Größenparameter passt rFactorWidth := rWidth / aPictureView.Width; rFactorHeight := rHeight / aPictureView.Height; FMsg := FMsg + Format('; Factor: %1.3f x %1.3f', [rFactorWidth, rFactorHeight]); // Autosize und AutoStretch abschalten aPictureView.AutoSize := false; aPictureView.Stretched := false; // PictureView an definierte Größe anpassen aPictureView.Width := aPictureView.Width * rFactorWidth; aPictureView.Height := aPictureView.Height * rFactorHeight; FMsg := FMsg + Format('; PicViewNew: %1.1f x %1.1f', [aPictureView.Width, aPictureView.Height]); end;
Delphi-Quellcode:
Das FMsg war nur zum Debuggen um die verschiedenen Width/Height zu sehen
procedure TForm1.btPrintClick(Sender: TObject);
// ***************************************************************************************************************************************** var lPictureView: TFrxPictureView; begin // Assing the chart to the picture lPictureView := TFrxPictureView(frxReport1.FindObject('rpimChart')); FMsg := Format('PicViewOrg: %1.1f x %1.1f', [lPictureView.Width, lPictureView.Height]); AssignAndScaleChart(lPictureView, chChart); TFrxMemoView(frxReport1.FindObject('Memo2')).Text := FMsg; frxReport1.ShowReport; end; Ergebnis siehe Anhang. Zur Darstellung der Größen habe ich den Rahmen des TfrxGroupHeader und des inneliegenden TFrxPictureView unterschiedlich gefärbt |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:46 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