Ich bin gerade dabei einen Programmteil umzubauen und dabei die Programmlogik übersichtlicher zu strukturieren.
Ich habe ein TQRPreview:
Code:
FPreview := TQRPreview.Create(nil);
FPreview.Parent := Self;
FPreview.Align := alClient;
FPreview.ZoomState := qrZoom100;
FPreview.Zoom := 100;
FPreview.TabStop := True;
FPreview.TabOrder := 0;
FPreview.OnMouseWheelUp := SetMouseWheelUp;
FPreview.OnMouseWheelDown := SetMouseWheelDown;
Und einen TReportDesignerDialog:
Code:
qrdQuickrep.bQrdPromptParams := (FReportTyp = rtVorschau);
FDesignerDialog := TReportDesignerDialog.Create(nil);
FDesignerDialog.QRPreview := FPreview;
FDesignerDialog.BeforeOpenDataset := ReportDesignerDialog1BeforeOpenDataset;
FDesignerDialog.BeforeGetQueryParams := ReportDesignerDialog1BeforeGetQueryParams;
FDesignerDialog.BandBeforePrint := ReportDesignerDialog1BandBeforePrint;
FDesignerDialog.DefaultFileFilter := ReportDesignerDialog1.DefaultFileFilter;
FDesignerDialog.EditorSettings := ReportDesignerDialog1.EditorSettings;
FDesignerDialog.PrevFormStyle := ReportDesignerDialog1.PrevFormStyle; { #3.3.0.6 TT 2009-11-16 }
FDesignerDialog.PreviewHeight := ReportDesignerDialog1.PreviewHeight;
FDesignerDialog.PreviewWidth := ReportDesignerDialog1.PreviewWidth;
FDesignerDialog.PreviewInitialState := ReportDesignerDialog1.PreviewInitialState;
FDesignerDialog.PrintIfEmpty := ReportDesignerDialog1.PrintIfEmpty;
FDesignerDialog.PrinterSettings.UseStandardprinter := True;
FDesignerDialog.PrinterSettings.UseCustomPaperCode := False;
FDesignerDialog.UseCurrentDatasets := FALSE; // muss False sein!
FDesignerDialog.UseDatamodules := FALSE; // muss False sein!
FDesignerDialog.UserSettings := ReportDesignerDialog1.UserSettings;
FDesignerDialog.UsePrinterSettings := True;
FDesignerDialog.PrepareAutomatically := False;
FDesignerDialog.UseModalPreview := False;
FDesignerDialog.PrinterSettings.MemoryLimit := 250000;
FDesignerDialog.PrinterSettings.UseCustomBinCode := True;
FDesignerDialog.PrinterSettings.CustomBinCode := getDruckerSchacht;
FDesignerDialog.PrinterSettings.Duplex := getDuplex;
Diese Werte habe ich aus dem vorherigen Wust aus Code übernommen. Dort gab es auch eine Connection (globale Variable in der
Unit):
Code:
aADOConnection := TADOConnection.Create(self);
aADOConnection.Connected := False;
aADOConnection.Name := '
MSSQL';
aADOConnection.LoginPrompt := False;
aADOConnection.ConnectionString := sConnectionString;
aADOConnection.IsolationLevel := ilReadUncommitted;
aADOConnection.ConnectOptions := coAsyncConnect;
aADOConnection.CursorLocation := clUseClient;
aADOConnection.Mode := cmRead;
aADOConnection.KeepConnection := False;
aADOConnection.Connected := True;
Da das Formular der ursprünglichen Connection zukünftig keine Programmlogik oder ähnliches mehr enthalten soll und nur noch mit einem dahinter liegenden Objekt interagiren soll, habe ich eine Connection in einer gesonderten
unit erzeugt und die Alte gelöscht. Ich habe beim Erzeugen exakt die selben Werte gesetzt wie es in der ursprünglichen Connection getan wurde.
Meine Quickreport Komponenten (oben beschrieben) werden jetzt auch während der instanzierung einer neuen Klasse erstellt und sind mit dem ursprünglichen Form nicht verknüpft oder ähnliches. Darin wird auch der eigentliche Druck ausgeführt:
Code:
qrdQuickrep.bQrdPromptParams := true;
if not FDesignerDialog.PrintReport(FReportInfos.reportPfad) then begin
//Fehlermedung
end
solange die Connection auf dem ursprünglichen Form ist, funktioniert das. Wenn ich diese entferne kommt die Fehlermeldung:
Zitat:
Fehlende Connection oder ConnectionString.
Der Aufrufstack ist folgender:
Zitat:
main thread ($e04):
042c7f7e +0de REPORT.DLL Data.DB DatabaseError
043009a5 +0a1 REPORT.DLL Data.Win.ADODB TADOCommand.OpenConnection
043008bc +034 REPORT.DLL Data.Win.ADODB TADOCommand.SetConnectionFlag
04301565 +011 REPORT.DLL Data.Win.ADODB TCustomADODataSet.SetConnectionFlag
04301607 +09b REPORT.DLL Data.Win.ADODB InitializeConnection
04301925 +035 REPORT.DLL Data.Win.ADODB TCustomADODataSet.OpenCursor
042dcae1 +055 REPORT.DLL Data.DB TDataSet.SetActive
042dc65f +033 REPORT.DLL Data.DB TDataSet.Loaded
0430152b +01b REPORT.DLL Data.Win.ADODB TCustomADODataSet.Loaded
04111590 +024 REPORT.DLL System.Classes NotifyGlobalLoading
0473c92d +1a9 REPORT.DLL thsdComponentStorage 243 +52 TComponentLoader.ReadComponent
047414df +08f REPORT.DLL thsdRuntimeLoader 483 +7 TRuntimeComponentLoader.LoadDatamoduleFromStream
0474189c +038 REPORT.DLL thsdRuntimeLoader 611 +15 TRuntimeComponentLoader.LoadCompsAndDatamoduleFrom Stream
0479fc29 +119 REPORT.DLL QRDesign 484 +24 TQRDLoader.LoadCompsAndDatamoduleFromStream
0474192a +05a REPORT.DLL thsdRuntimeLoader 627 +4 TRuntimeComponentLoader.LoadCompsAndDatamoduleFrom File
0477ab85 +041 REPORT.DLL qrddlgs 570 +2 TReportPrinterDialog.LoadReport
0477a7d8 +048 REPORT.DLL qrddlgs 475 +4 TReportPrinterDialog.CreatePrintForm
0477ae32 +032 REPORT.DLL qrddlgs 639 +2 TReportPrinterDialog.PrintReport
04b01664 +0a0 REPORT.DLL UnitEinzelReport 98 +10 TFormEinzelReport.drucken
Ich weiß nicht, wie ich meine neue Connection mit dem Report verbinden soll... Ich habe auch im alten Code keine Stelle gefunden, wo so eine Verküpfung hergestellt werden würde... Ich bin an dem Problem schon knappe 6 Stunden dran.
Hat jemand eine Idee?