[Erledigt] Lazreport: Seitenformat aussuchen (TlrCodeReport)

Rund um die LCL und andere Komponenten
Antworten
charlytango
Beiträge: 1084
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

[Erledigt] Lazreport: Seitenformat aussuchen (TlrCodeReport)

Beitrag von charlytango »

Hi,

Folgende Aufgabenstellung: Erstelle eine Auswahlmöglichkeit von Papierformaten zum Speichern in eine DB-Tabelle. Benutze die Einträge eines Datenbankrecords danach mit Lazreport (genauer: TlrCodeReport) um ein Seitenformat mit SetPaper() anzugeben.

Aus Neugierde hab ich das mal dem Codepilot vorgelegt. Ich bekam nix was ich nicht schon vorher wusste und der Code war auch falsch - egal, anderer Thread.

Q1: LR_Prntr.TfrPrinter stellt eine Funktion FillPapers zur Verfügung.
Das passt an sich, aber es werden nur die Namen der vom Drucker unterstützten Papierformate gesucht. Nachdem man bei SetPaper() die Typnummer des Seitenformats braucht, muss man die Namen in Typnummern auflösen.

Code: Alles auswählen

TlrCodeReport.SetPaper(ASize: integer; AOr: TPrinterOrientation = poPortrait;
      AWidth: integer = 0; AHeight: integer = 0); 
--> an das Array PaperInfo (Unit LR_Prntr), das diese Info hätte, komme ich aber nicht heran ??? Oder doch irgendwie ? (Klar kann ich in den fremden Code ein Property reinschreiben, aber elegant ist das nicht, abgesehen davon dass man das dann immer machen müsste)


Q2: Um die Größe des ausgewählten Seitenformats anzuzeigen, muss ich ich irgendwie an die Definitionen aus dem Array Paperinfo heran ??? Oder bekommt man die aus dem Objekt heraus, das in der übergebenen Stringliste hängt?

Q3: Da es ja nicht nur die vom Drucker unterstützten Seitenformate gibt, für die man einen Report erstellen kann, müsste man, um eine sinnvolle Auswahl ALLER Seitenformate (118 !!) zu ermöglichen wohl eine andere Strategie als eine Combobox wählen. Auch dazu müsste ich an ALLE Informationen zu den Seitenformaten heran kommen.
Zudem scheint es für Windows und Nicht-Windows andere Namen für die Seitenformate zu geben ????

Im Projektbeispiel habe ich (erstmal) dazu eine Lookuptabelle (in Kombination mit einer DBLookupCombobox) verwendet, die ich aber nicht befüllen kann

Als ungefäre Designhilfe habe ich hinter dem Button "Show Page Format Window" das Einstellfenster aus LazReport eingebaut.
Das kann ich anzeigen, nur funktioniert es nicht richtig. Aber indem ich es bei einem anderen Report (im Designmodus) getestet habe, bekomme ich dort auch nur die vom Drucker unterstützen Seitenformate zur Auswahl angezeigt.

Ich weiß, ich kämpfe hier auch mit syntaktischen und Programmierfragen --Hilfe ist trotzdem erwünscht, wenn nötig nehme ich auch leichte Schläge auf den Hinterkopf, wenns hilft. ;-)

THX
Dateianhänge
project_pageformat.zip
(142.54 KiB) 41-mal heruntergeladen
Zuletzt geändert von charlytango am Mi 21. Aug 2024, 17:02, insgesamt 1-mal geändert.

paweld
Beiträge: 91
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: Lazreport: Seitenformat aussuchen (TlrCodeReport)

Beitrag von paweld »

geändertes Beispiel im Anhang
Dateianhänge
2024-08-15 07_07_05-Form1.png
2024-08-15 07_07_05-Form1.png (20.83 KiB) 968 mal betrachtet
project1.zip
(6.53 KiB) 46-mal heruntergeladen
Grüße / Pozdrawiam
paweld

charlytango
Beiträge: 1084
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Lazreport: Seitenformat aussuchen (TlrCodeReport)

Beitrag von charlytango »

wow -- herzlichen Dank.

Demnach kann man aus dem In der Stringliste mit übergebenen Objekt die nötigen Daten herauskitzeln.

Auf so etwas wäre ich allerdings nie gekommen:

Code: Alles auswählen

Label3.Caption := Format('Width: %d mm', [trunc(prn.Printer.PaperSize.PaperRectOf[cbpapers.Text].PhysicalRect.Width * 25.4 / prn.Printer.XDPI)]); 
@paweld: Erst einmal herzlichen Dank dafür.

Das löst sehr elegant Q1 und Q2.

Gibt es auch irgend eine Möglichkeit an ALLE Seitenformat-Definitionen zu kommen? (Falls das nicht klappt, wäre ich auch so zufrieden)

paweld
Beiträge: 91
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: Lazreport: Seitenformat aussuchen (TlrCodeReport)

Beitrag von paweld »

Da die Papierformate im Abschnitt „implementation“ definiert werden, ist das Array in anderen Modulen nicht sichtbar. Wenn Sie also eine vollständige Liste wünschen, müssen Sie die Einheit „LR_Prntr“ ändern und eine Funktion hinzufügen, die eine solche Liste zurückgibt
Grüße / Pozdrawiam
paweld

charlytango
Beiträge: 1084
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Lazreport: Seitenformat aussuchen (TlrCodeReport)

Beitrag von charlytango »

Das habe ich befürchtet. Trotzdem danke für die Bestätigung.

Weiss jemand vielleicht, wer der Maintainer von LazReport ist?

paweld
Beiträge: 91
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: Lazreport: Seitenformat aussuchen (TlrCodeReport)

Beitrag von paweld »

Grüße / Pozdrawiam
paweld

charlytango
Beiträge: 1084
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Lazreport: Seitenformat aussuchen (TlrCodeReport)

Beitrag von charlytango »

THX

charlytango
Beiträge: 1084
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Lazreport: Seitenformat aussuchen (TlrCodeReport)

Beitrag von charlytango »

@paweld

Ich habe Jesus Reyes A. über das englische Forum erreicht und nach einer Nachfrage seinerseits hat er mir folgenden Code zukommen lassen:
jesusr hat geschrieben: I hope you know what you are doing. Here is a way to obtain the internal paper info without the need to make changes in LazReport source code:
Paper Width and Height are tenths of millimeter units.

Code: Alles auswählen

    type
      TPgInfo = record
        Size: Integer;
        Name: string;
        PaperWidth, PaperHeight: Integer;
      end;
     
    var
      p: TfrPrinter;
      i, oldPrinterIndex, oldPaperSize: Integer;
      Info: array of TPgInfo;
    begin
     
      // Get the LazReport printer
      p := prn;
     
      // save current configuration
      oldPrinterIndex := p.PrinterIndex;
      oldPaperSize := p.PaperSize;
     
      // Setup an unexisting PgSize. This is the trick to get all internal papers
      p.PaperSize := -1;
     
      // Select the LazReport Virtual Printer
      p.PrinterIndex := p.Printers.Count - 1;
     
      // First get pgSize and paperNames. This is important because the use
      // of SetPrinterInfo() below will modify p.PaperNames
      SetLength(Info, p.PaperNames.Count);
      for i:=0 to p.PaperNames.Count-1 do begin
        Info[i].Size := PtrInt(p.PaperNames.Objects[i]);
        Info[i].Name := p.PaperNames[i];
      end;
     
      // next get paper width and heights
      for i:=0 to Length(Info)-1 do begin
        p.SetPrinterInfo(Info[i].Size, 0, 0, p.Orientation);
        Info[i].PaperWidth := p.PaperWidth;
        Info[i].PaperHeight := p.PaperHeight;
      end;
     
      // dump the gattered info
      for i:=0 to Length(Info)-1 do
        with Info[i] do
          WriteLn(format('%3d'#9'%3d'#9'%dx%d'#9'%s',[i, Size, PaperWidth, PaperHeight, Name]));
     
      // Now restore the old configuration
      p.PaperSize := oldPaperSize;
      p.PrinterIndex := oldPrinterIndex;
     
      // force to select the original paper setup
      p.SetPrinterInfo(oldPaperSize, 0, 0, p.Orientation);
     
    end;
     

paweld
Beiträge: 91
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: [Erledigt] Lazreport: Seitenformat aussuchen (TlrCodeReport)

Beitrag von paweld »

@charlytango: Vielen Dank für Ihr Feedback. Ich habe eine Ausnahme für den virtuellen Drucker im Unit-Code gesehen, aber nachdem ich sie gesetzt hatte, änderte sich nichts an den zurückgegebenen Größen. Es scheint, dass es immer noch notwendig ist, PaperSize auf -1 zu setzen.
Grüße / Pozdrawiam
paweld

Antworten