Wie arbeitet man mit dem VCL Preview Control?

Ich probiere gerade die Trial-Version aus (bin also noch Laie in L&L) und scheitere offenbar an der korrekten Verwendung des Preview Controls.

Ich habe ein TListLabel mit Master- und Detail-DataSource. Die Master-Felder werden als Variablen im Report angeboten. Die Master-Source hat nur einen Datensatz.

Den Preview erzeuge ich mit

  PreviewControl.Attach(Report, 1);
  try
    Report.Print;
  finally
    PreviewControl.Detach;
  end;

Das funktioniert beim ersten Mal auch relativ geschmeidig.

Nun ändere ich ein Feld in dem Master-Datensatz (Edit/Post) und rufe die obige Sequenz erneut auf. Leider wird dabei immer noch der alte Feldinhalt angezeigt.

Was mache ich falsch bzw. wie geht es richtig?

Grüß dich Uwe, willkommen im LL Forum, viel Spaß hier.

Könntest du mal ein wenig mehr code und Details spendieren, das Attach bräuchtest du meines Wissens gar nicht wenn du die TListLabel28 Komponente verwendest, ich geh mal davon aus das du eben DataBinding verwendest.

Gruß

Danke!

Das ist der Code mit dem die Eigenschaften der TListLabel28 Komponente gesetzt werden:

procedure TReportsListCommonModule.InitReport(AReport: TListLabel);
begin
  AReport.AutoDesignerPreview := False;
  AReport.AutoDestination := pmPreview;
  AReport.AutoFileAlsoNew := False;
  AReport.AutoProjectFile := <Pfad zur Lst-Datei>;
  AReport.AutoShowSelectFile := False;
  AReport.AutoShowPrintOptions := False;
  AReport.Debug := [];
  AReport.DataController.DataSource := dsMaster;
  var item := AReport.DataController.DetailSources.Add;
  item.Name := 'MasterSource';
  item.DataSource := dsMaster;
  item.PrimaryKeyField := 'ID';

  var subitem := item.Add;
  subitem.Name := 'DetailSource';
  subitem.DataSource := dsDetail;
  subitem.PrimaryKeyField := 'ID';
  subitem.DetailKeyField := 'MasterID';
  subitem.MasterKeyField := 'ID';

  AReport.DataController.DataMember := item.Name;
  AReport.DataController.AutoMasterMode := mmAsVariables;
end;

Wenn ich das Attach nicht brauche, wie bekomme ich dann den Report in dem PreviewControl angezeigt und nicht in einem eigenen Fenster?

Das muß ich mir am Montag mal ansehen. Vielleicht spielt hier auch ein Caching der Datenzugriffsobjekte mit hinein, so dass die Änderung am Datensatz erst gar nicht ankommt? Oder die Vorschau kann nicht (neu) geschrieben werden. Wobei das eigentlich Fehlermeldungen auslösen sollte.

Du könntest einmal versuchen, nicht nur die Sequenz aus dem ersten Post sondern auch die ganze Datenzuweisung jedes Mal neu zu machen. Klappt das? Ansonsten müsstest du erstmal mit dem separaten Fenster leben (wenn es damit geht - dann würde die Datenquelle auch als Verdächtiger ausfallen), das Problem bekommen wir bestimmt in den Griff.

Ich habe mal ein Beispielprojekt erstellt (Delphi 11), kann es aber hier nicht hochladen. Daher hier ein Dropbox-Link (die Leerzeichen bitte erst entfernen - Links darf ich auch nicht):
https:// www.dropbox .com/s/2lufmchxeh9cxlu/LLPreviewControl.zip?dl=0

Klickt man das erste mal auf Set Title wird die Vorschau korrekt angezeigt. Ändert man den Titel und klickt nochmal bleibt die Vorschau unverändert.

Das klappt nicht, ist aber auch nicht verwunderlich. Die Properties werden nur in Feldern abgelegt und erst beim Print ausgewertet.

Wenn ich das Attach und Detach für das PreviewControl weglasse und den Preview als eigenes Fenster anzeige, funktioniert alles wie erwartet. Ich vermute daher das Problem im PreviewControl bzw. in meiner falschen Verwendung.

Leider ist die Anzeige in dem Control in diesem Fall unverzichtbar, da der Preview bei Änderungen quasi in Echtzeit aktualisiert werden soll.

1 Like

Das ist super, vielen Dank - schaue ich mir gleich zu Beginn der Woche an. Ich melde mich dann hier zurück.

Die Woche hat früh begonnen :smiley: - das wollte ich doch gerne verstehen. Das Problem ist wie alternativ von mir vermutet, dass die Vorschaudatei nicht geschrieben werden kann, da sie im Moment des Drucks durch das PreviewControl gelockt ist. Man sieht das schön in der Logdatei:

Debwin4::CSV::V1;TypeCode;Timestamp;Level;Logger;Thread;Properties;Message
▪;1000;28.01.2023 06:08:41.776;2;LL.API;41C8;100:2=CMLL28♦101:1=2; LS: >LlStgsysGetLLFilename('C:\temp\PreviewCtrl\Listenkonfiguration.lst','C:\Users\jochen\AppData\Local\Temp\',017A7F54,260)
▪;1000;28.01.2023 06:08:41.776;2;LL.API;41C8;100:2=CMLL28♦101:1=2; LS: <LlStgsysGetLLFilename() -> 0 (00000000) ['C:\Users\jochen\AppData\Local\Temp\Listenkonfiguration.LL']
▪;1000;28.01.2023 06:08:41.776;2;LL.Notification;41C8;100:2=CMLL28♦101:1=2; >@NOTIF.(code=103, param=0019E074, user=01CE97B0)
▪;1000;28.01.2023 06:08:41.776;2;LL.Notification;41C8;100:2=CMLL28♦101:1=2; <@NOTIF.(code=103) -> 00000000
▪;1000;28.01.2023 06:08:41.776;2;LL.API;41C8;100:2=CMLL28♦101:1=2; LS: >LsInternalGetViewerControlFromParent13(00190CB2='LlStgsysViewerControl28W'(LlStgsysViewerControl28W))
▪;1000;28.01.2023 06:08:41.776;2;LL.API;41C8;100:2=CMLL28♦101:1=2; LS: <LsInternalGetViewerControlFromParent13() -> 00190CB2
▪;1000;28.01.2023 06:08:41.779;4;LL.Generic;41C8;100:2=CMLL28♦101:1=8; ERR: StgCreateStorageEx(C:\Users\jochen\AppData\Local\Temp\Listenkonfiguration.LL) failed. Reason: Freigabeverletzung aufgetreten (80030020)
▪;1000;28.01.2023 06:08:41.779;1;LL.Internal;41C8;100:2=CMLL28♦101:1=8; error while initializing PrvFileSys

Du kannst das einfach lösen, indem Du die Datei direkt vor dem Druck freigibst. In Deinem Sample wäre das hier in der Procedure die erste Zeile:

procedure TTestMainForm.PreviewReport(PreviewControl: TLlPreviewControl);
begin
  PreviewControl.InputFilename := '';
  PreviewControl.Attach(Report, 1);
  try
    Report.Print;
  finally
    PreviewControl.Detach;
  end;
end;

Das sollte die Komponente natürlich eigentlich automatisch machen, ich denke, wir werden das ins Attach mit aufnehmen, damit nicht noch jemand auf dieses Problem stößt. Wäre für dich dann problemlos, dann würde der leere Filename eben zweimal gesetzt.

Danke für die tolle Vorbereitung, das hat sehr geholfen.

Das nenne ich mal Support! Funktioniert nun einwandfrei. Danke!

1 Like

Hi Uwe, ich hatte übersehen das es in Control gedruckt werden soll, ich dachte die eigentliche Vorschau funktioniert nicht, aber Jochen hat dir ja schon weitergeholfen, super ! Schönes WE