![]() |
Delphi-Version: XE
Quickreport Preview per Code schließen
Hallo zusammen,
ich erstelle per
Delphi-Quellcode:
Jetzt soll bei einem AutoLogout der eventuell noch offene Preview geschlossen werden.
rptMediaList := TrptMediaList.Create(Application);
if rptMediaList.PrepareDatabase then // Filter an Report übergeben und DB öffnen begin rptMediaList.qrMediaList.PrevFormStyle := fsStayOnTop; rptMediaList.qrMediaList.Preview; end; rptMediaList.Free; Ich habe alle diese Befehle in unterschiedlichen Kombinationenn ausprobiert, aber keiner schließt wirklich den Preview. Einziger Effekt ist, dass sich das Programm bei Klick auf den PreView-Close-Button aufhängt, da ich ihm die Grundlagen entzogen habe
Delphi-Quellcode:
Wie kann ich den Preview sauber schließen?
rptMediaList.qrMediaList.Visible := false;
rptMediaList.qrMediaList.PreviewController.Free; rptMediaList.qrMediaList.Cancel; rptMediaList.qrMediaList.FreeOnRelease; rptMediaList.Release; rptMediaList.Close; Danke Gerd |
AW: Quickreport Preview per Code schließen
|
AW: Quickreport Preview per Code schließen
Zitat:
Delphi-Quellcode:
her. Leider funktioniert es aber nicht.
rptMediaList.qrMediaList.Cancel;
Nach Cancel ist der Preview immer noch sichtbar Irgendwo anders fand ich den
Delphi-Quellcode:
aber auch der half nicht
rptMediaList.Release;
|
AW: Quickreport Preview per Code schließen
Nur so eine Idee, aber die Preview hat doch ein Fenster und somit ein Handle. Es müsste genügen, wenn du da ein WM_CLOSE hinschickst.
|
AW: Quickreport Preview per Code schließen
Zitat:
Mit
Delphi-Quellcode:
bekomme ich 0. Auch wenn ich FindWindowEx verwende
FHwnd := FindWindow(nil, 'Report Preview: Media-List Report')
|
AW: Quickreport Preview per Code schließen
Zitat:
Delphi-Quellcode:
, die Preview müsste doch ein Handle haben? :gruebel:
rptMediaList.qrMediaList.Handle
|
AW: Quickreport Preview per Code schließen
Wenn du die Klasse kennst bzw TQRStandardPreview verwendest, dann kannst du das mal versuchen:
Delphi-Quellcode:
Ich hab das nur hingetippt und nicht getestet.for i := 0 to Screen.CustomFormCount - 1 do if (Screen.CustomForms[I] is TQRStandardPreview) then TQRStandardPreview(Screen.CustomForms[I]).Release; // oder close |
AW: Quickreport Preview per Code schließen
Zitat:
|
AW: Quickreport Preview per Code schließen
Zitat:
|
AW: Quickreport Preview per Code schließen
Dann vesuch mal den Parent bzw Parentform der Reportvorschau zu schließen.
|
AW: Quickreport Preview per Code schließen
Das mach ich doch schon mit
Delphi-Quellcode:
rptMediaList.qrMediaList.Visible := false;
rptMediaList.qrMediaList.PreviewController.Free; rptMediaList.qrMediaList.Cancel; rptMediaList.qrMediaList.FreeOnRelease; rptMediaList.Release; rptMediaList.Close; |
AW: Quickreport Preview per Code schließen
Zitat:
Delphi-Quellcode:
nutzt?
GetParent(rptMediaList.qrMediaList.Handle)
Oder
Delphi-Quellcode:
?
GetWindow(rptMediaList.qrMediaList.Handle, GW_OWNER)
|
AW: Quickreport Preview per Code schließen
[QUOTE=KodeZwerg;1508704]
Zitat:
Ich habe auch noch
Delphi-Quellcode:
versucht, also den Parent des eigentlichen Reports. Aber auch das hat das PreView-Fenster nicht geschlossen
for i := Screen.CustomFormCount - 1 downTo 0 do
begin sName := TCustomForm((Screen.CustomForms[i])).ClassName; if (Screen.CustomForms[i] is TQRStandardPreview) then begin FHwnd := GetParent(Screen.CustomForms[i].Handle); TQRStandardPreview(Screen.CustomForms[i]).Close; // oder close SendMessage(FHwnd, WM_CLOSE, 0, 0); end; end; Ich habe mit der Schleife auch mal alle, außer dem Main geschlossen.
Delphi-Quellcode:
Selbst dann blieb der PreView offen.
else if (Screen.CustomForms[i] is TCustomForm) then
begin if (TCustomForm((Screen.CustomForms[i])).Name <> 'frmMain') then TCustomForm(Screen.CustomForms[I]).Close; end; |
AW: Quickreport Preview per Code schließen
Was ein Close verhindern könnte ist OnCloseQuery.
Gibt es in dem Form ein OnCloseQuery, dann setze das mal vor dem close auf nil.
Delphi-Quellcode:
TQRStandardPreview(Screen.CustomForms[i]).OnCloseQuery := nil;
TQRStandardPreview(Screen.CustomForms[i]).Close; |
AW: Quickreport Preview per Code schließen
Und was ist damit?
Delphi-Quellcode:
rptMediaList.qrMediaList.PrevFormStyle := fsStayOnTop;
Mal vor dem Schließen auf was anderes ändern? Z. B. fsNormal? |
AW: Quickreport Preview per Code schließen
egal oder eher kontraproduktiv
Delphi/VCL kann den Style nicht zur Laufzeit ändern ... intern wird dabei die Form (HWND) freigegeben und komplett neu erstellt. * schauen welche Form/Klasse angezeigt wird (Debugger/WinSpy/...) * rausfinden, wo dessen Instanz gespeichert wird (Variablen/Felder/Property) * und dann darauf ein Close/WM_CLOSE ausführen * gibt es eine MessageLoop im QuickReport (z.B. wie ShowModal), dann da nachsehen, was die Abbruchbedingungen sind und wie/wo man darauf Zugriff bekommt zu Screen.CustomForms/Screen.Forms in #13: nicht GetParent, sondern ![]() OnCloseQuery kann man auch mit Free statt Close um umgehen, da dort nicht mehr nachgefragt wird. |
AW: Quickreport Preview per Code schließen
Nur so ins Blaue:
Delphi-Quellcode:
rptMediaList.qrMediaList.QRPrinter.ClosePreview(nil); |
AW: Quickreport Preview per Code schließen
Delphi-Quellcode:
hat genau denselben Effekt wie die Suche und das Schließen von TQRStandardPreview. Der Report wird geschlossen, das Preview-Fenster bleibt offen.
rptMediaList.qrMediaList.QRPrinter.ClosePreview(nil);
Den PrevFormStype hatte ich schon testweise auf fsNormal gesetzt. Auch das ändert nichts daran, dass der PreView offen bleibt. Verwendung von Free hat auch nichts gebracht, zumal im OnClose nichts ist Ich hätte nicht gedacht, dass es so schwer ist ein QuickReport wirder los zu werden. |
AW: Quickreport Preview per Code schließen
Zitat:
//edit Ansonsten mal beim Author fragen wie es gedacht ist? ![]() |
AW: Quickreport Preview per Code schließen
So, ich habe mir jetzt auch WinSpy angeschaut und (für mich) überraschendes festgestellt
Der eigentliche Report entstammt der Klasse TQRPreview Das Preview-Fenster, in dem der Report eingebunden ist, entstammt der Klasse TQRStandardPreview und hat den Titel "Report Preview : Media-List Report" Dadurch weiß ich jetzt, dass hintern "Report Preview" noch ein Leerstelle ist und mit der findet
Delphi-Quellcode:
jetzt auch den Handle.
FHwnd := FindWindow(nil, 'Report Preview : Media-List Report');
SendMessage(FHwnd, WM_CLOSE, 0, 0); Das wars aber auch schon an weiterkommen, denn der anschließende WM_CLOSE schließt wieder nur den Report Gelöst habe ich es jetzt trotzdem. Vielleicht kann man noch abspecken, aber so geht es
Delphi-Quellcode:
try
rptMediaList.Enabled := False; rptMediaList.Hide; for i := Screen.FormCount - 1 downto 0 do begin with Screen.Forms[i] do begin if ClassName = 'TQRStandardPreview' then with TQRStandardPreview(TComponent(Screen.Forms[i])) do Destroy; end; end; rptMediaList.qrMediaList.Free; rptMediaList.Release; finally rptMediaList.Free; rptMediaList:= nil; end; |
AW: Quickreport Preview per Code schließen
Zitat:
|
AW: Quickreport Preview per Code schließen
Die Schleife kann etwas schlanker ausfallen:
Delphi-Quellcode:
for i := Screen.FormCount - 1 downto 0 do
if Screen.Forms[i] is TQRStandardPreview then Screen.Forms[i].Free; |
AW: Quickreport Preview per Code schließen
Bei der Schleife ist mir alter Code rein gerutscht.
Ich hatte es ja schon mal so
Delphi-Quellcode:
for i := Screen.CustomFormCount - 1 downto 0 do
if (Screen.CustomForms[I] is TQRStandardPreview) then TQRStandardPreview(Screen.CustomForms[I]).Close; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:22 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