Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Werkzeuge (https://www.delphipraxis.net/63-sonstige-werkzeuge/)
-   -   Fastreport 2025.1 Chart wird nur verkleinert dargestellt (https://www.delphipraxis.net/216975-fastreport-2025-1-chart-wird-nur-verkleinert-dargestellt.html)

norwegen60 1. Apr 2025 09:20

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:
  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))));
an den Report.
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

hotrs02 2. Apr 2025 10:09

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.

norwegen60 23. Apr 2025 20:58

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:
lPictureView.Picture.Assign(FChart.TeeCreateMetafile(False, Rect(0, 0, Round(lPictureView.Width * 2), Round(lPictureView.Height * 2))));
Das dargestellte Chart war aber gleich klein wie zuvor.

norwegen60 23. Apr 2025 21:48

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

hotrs02 24. Apr 2025 08:44

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.

norwegen60 24. Apr 2025 11:50

AW: Fastreport 2025.1 Chart wird nur verkleinert dargestellt
 
Zitat:

Zitat von hotrs02 (Beitrag 1548215)
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.

Habe mir die Fenster auf dem höher auflösenden Laptop angeschaut und keine Veränderungen festgestellt.
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 https://www.delphipraxis.net/217085-...ml#post1548207

himitsu 24. Apr 2025 12:52

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

MSDN-Library durchsuchenSetThreadDpiAwarenessContext
MSDN-Library durchsuchenGetDpiForMonitor
https://learn.microsoft.com/de-de/wi...arenesscontext

Delphi XE, aus dem Jahr 2010, kann natürlich noch keine API kennen, welche erst im Jahre 2015 mit Windows 10 aufgetaucht ist.

norwegen60 18. Mai 2025 10:15

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:
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;
Und der Aufruf erfolgt so:
Delphi-Quellcode:
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;
Das FMsg war nur zum Debuggen um die verschiedenen Width/Height zu sehen

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