AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Quickreport nach Neustart wieder an gleicher Position öffnen
Thema durchsuchen
Ansicht
Themen-Optionen

Quickreport nach Neustart wieder an gleicher Position öffnen

Ein Thema von norwegen60 · begonnen am 31. Jan 2020 · letzter Beitrag vom 1. Feb 2020
Antwort Antwort
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
505 Beiträge
 
Delphi 12 Athens
 
#1

Quickreport nach Neustart wieder an gleicher Position öffnen

  Alt 31. Jan 2020, 15:16
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

Geändert von norwegen60 (31. Jan 2020 um 15:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Quickreport nach Neustart wieder an gleicher Position öffnen

  Alt 1. Feb 2020, 00:15
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
505 Beiträge
 
Delphi 12 Athens
 
#3

AW: Quickreport nach Neustart wieder an gleicher Position öffnen

  Alt 1. Feb 2020, 08:28
Wie schon gesagt: OnAfterPreview wird beim Schließen aufgerufen und da habe ich es versucht. Nur liefern weder Form.Left noch 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?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#4

AW: Quickreport nach Neustart wieder an gleicher Position öffnen

  Alt 1. Feb 2020, 11:16
Du könntest mal den OnStandPrevEvent verdrahten und dort auf eventType = spClose prüfen. 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 eventType = spOpen wieder gesetzt werden.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
505 Beiträge
 
Delphi 12 Athens
 
#5

AW: Quickreport nach Neustart wieder an gleicher Position öffnen

  Alt 1. Feb 2020, 16:04
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
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
Miniaturansicht angehängter Grafiken
quickreport.jpg  

Geändert von norwegen60 ( 1. Feb 2020 um 16:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#6

AW: Quickreport nach Neustart wieder an gleicher Position öffnen

  Alt 1. Feb 2020, 17:26
Greife ich aber über Sender zu passt es.
Das war die Idee.

Nach etwas probieren habe ich herausbekommen, dass Sender vom Typ TQRStandardPreview ist und der wird in QRPrev definiert
Korrekt ist also
Left := TQRStandardPreview(Sender).Left;
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
505 Beiträge
 
Delphi 12 Athens
 
#7

AW: Quickreport nach Neustart wieder an gleicher Position öffnen

  Alt 1. Feb 2020, 19:41
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;

Geändert von norwegen60 ( 1. Feb 2020 um 20:17 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:56 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