Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Quickreport nach Neustart wieder an gleicher Position öffnen (https://www.delphipraxis.net/203283-quickreport-nach-neustart-wieder-gleicher-position-oeffnen.html)

norwegen60 31. Jan 2020 14:16

Quickreport nach Neustart wieder an gleicher Position öffnen
 
Hallo zusammen,

wer weiß, wie ich beim Schließen eines QuickReports die aktuelle Position/Größe ermittle? Mich Interessiert die Größe des äusseren Rahmens, nicht die der Seite innerhalb.
  • Bei normalen TForms mache ich das in OnClose mit TForm.Left, ...Top, ...
  • Beim Schließen von QuickReport wird OnClose und OnCloseQuery gar nicht aufgerufen.
  • Auch kein OnResize beim Verschieben
  • OnAfterPreview wird beim Schließen aufgerufen. Wenn ich dort aber TForm.Left oder TForm.PreviewLeft abfrage, zeigt das ganz andere Koordinaten an. (Report ist bei 1920 * 1080 weit rechts der Mitte, beide zeigen aber 240 an. Das ist die Position beim Öffnen)
Hat einer eine Idee?

Vielleicht noch das. Zuweisung einer Position in OnCreate funktioniert über self.QuickReport1.PreviewLeft, PreviewTop

Danke
Gerd

Luckie 31. Jan 2020 23:15

AW: Quickreport nach Neustart wieder an gleicher Position öffnen
 
In welches Ereignis schreibt man denn Code, der vor oder beim Schließen ausgeführt werden soll? Das muss es doch auch geben. Oder du implementierst selbst ein OnClose.

norwegen60 1. Feb 2020 07:28

AW: Quickreport nach Neustart wieder an gleicher Position öffnen
 
Wie schon gesagt:
Delphi-Quellcode:
OnAfterPreview
wird beim Schließen aufgerufen und da habe ich es versucht. Nur liefern weder
Delphi-Quellcode:
Form.Left
noch
Delphi-Quellcode:
Form.QuickReport1.PreviewLeft
das korrekte Ergenis wo das Form / der Report gerade liegt.
Das Ereignis hätte ich also aber nicht die passende Eigenschaft.
Ich könnte mir vorstellen, dass es was damit zu tun hat, dass man beim Erstellen TQuickreport zwar in ein Form bettet, bei der Anzeige dann aber ein ganz anderes, QR-eigenes Form, angezeigt wird. Wie aber komme ich beim Schließen an dessen Positionsdaten?

Uwe Raabe 1. Feb 2020 10:16

AW: Quickreport nach Neustart wieder an gleicher Position öffnen
 
Du könntest mal den
Delphi-Quellcode:
OnStandPrevEvent
verdrahten und dort auf
Delphi-Quellcode:
eventType = spClose
prüfen.
Delphi-Quellcode:
Sender
ist dann das aktuelle Preview-Form dessen Top,Left, Width und Height du speichern solltest.

Diese Werte müssen dann entweder beim nächsten Aufruf in QuickReport.PreviewTop/Left/Width/Height übergeben werden oder im selbigen Event bei
Delphi-Quellcode:
eventType = spOpen
wieder gesetzt werden.

norwegen60 1. Feb 2020 15:04

AW: Quickreport nach Neustart wieder an gleicher Position öffnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Funktioniert. Allerdings immer noch nicht ganz nachvollziehbar, was genau passiert
Mein Code
Delphi-Quellcode:
procedure TrptStdCalibration.qrStdCalStandPrevEvent(Sender: TObject; eventType: TStandPrevEventType; contName: string;
  var Handled: Boolean);
var
  s :String;

begin
  if eventType = spClose then
  begin
    Self.Left := Self.Left;                       // = 175
    Self.Left := qrStdCal.Left;                   // = 16
    Self.Left := qrStdCal.PreviewLeft;            // = 25
    Self.Left := TForm(Sender).Left;              // = 1526
    Self.Left := TQuickRep(Sender).Left;          // = 1526
    Self.Left := TQuickRep(Sender).PreviewLeft;   // = 2555888800
    s := Sender.ClassName;                        // = 'TQRStandardPreview'

    // d.h. Korrekt ist
    Self.Left := TQRStandardPreview(Sender).Left; // = 1526
   

  u_Registry.SaveFormPos(Self);
  end;
TrptStdCalibration = TForm
qrStdCal = TQuickReport

d.h. die Komponenten selber liefern falsche Werte. Greife ich aber über Sender zu passt es.

Nach etwas probieren habe ich herausbekommen, dass Sender vom Typ TQRStandardPreview ist und der wird in QRPrev definiert
Korrekt ist also
Delphi-Quellcode:
Left := TQRStandardPreview(Sender).Left;
Die Left-Zuweisungen haben nur dazu gedient, um nach Haltepunkt alle Werte anzuzeigen

Im Anhang ein Screenshot mit der Lage des Reports

Uwe Raabe 1. Feb 2020 16:26

AW: Quickreport nach Neustart wieder an gleicher Position öffnen
 
Zitat:

Zitat von norwegen60 (Beitrag 1456500)
Greife ich aber über Sender zu passt es.

Das war die Idee.

Zitat:

Zitat von norwegen60 (Beitrag 1456500)
Nach etwas probieren habe ich herausbekommen, dass Sender vom Typ TQRStandardPreview ist und der wird in QRPrev definiert
Korrekt ist also
Delphi-Quellcode:
Left := TQRStandardPreview(Sender).Left;

Da
Delphi-Quellcode:
TQRStandardPreview
von
Delphi-Quellcode:
TForm
abgeleitet ist, wäre auch
Delphi-Quellcode:
TForm(Sender).Left
korrekt. Das erspart eventuell den einen Eintrag in der Uses-Anweisung.

Ich persönlich würde auch das Setzen der Position im selben Event vorziehen. Dann hat man beide Teile des Codes an einer Stelle.

norwegen60 1. Feb 2020 18:41

AW: Quickreport nach Neustart wieder an gleicher Position öffnen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1456505)
Da TQRStandardPreview von TForm abgeleitet ist, wäre auch TForm(Sender).Left korrekt. Das erspart eventuell den einen Eintrag in der Uses-Anweisung.

Ich persönlich würde auch das Setzen der Position im selben Event vorziehen. Dann hat man beide Teile des Codes an einer Stelle.

Danke für den Tip.

Habe zwar noch mal grübeln müssen was du meinst aber das hat das Handling tatsächlich stark vereinfacht.

Aus
Delphi-Quellcode:
procedure TrptStdCalibration.FormCreate(Sender: TObject);
begin
  u_Registry.RestoreFormPos(self);
  qrStdCal.PreviewLeft := self.Left;
  qrStdCal.PreviewTop := self.Top;
  qrStdCal.PreviewWidth := self.Width;
  qrStdCal.PreviewHeight := self.Height;
end;

procedure TrptStdCalibration.qrStdCalStandPrevEvent(Sender: TObject; eventType: TStandPrevEventType; contName: string;
  var Handled: Boolean);
begin
  if eventType = spClose then
  begin
    // Zugriff auf Self.Left, qrStdCal.Left und qrStdCal.PreviewLeft liefert falsche Werte => Zugriff über Sender
    self.Left := TQRStandardPreview(Sender).Left;
    self.Top := TQRStandardPreview(Sender).Top;
    self.Width := TQRStandardPreview(Sender).Width;
    self.Height := TQRStandardPreview(Sender).Height;

    u_Registry.SaveFormPos(self);
  end;
end;
wurde
Delphi-Quellcode:
  case eventType of
    spClose: u_Registry.SaveFormPos(TForm(Sender));
    spOpen: u_Registry.RestoreFormPos(TForm(Sender));
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz