Entwickler-Ecke

Dateizugriff - Daten aus Array in QuickReport darstellen


th_ellebracht - Mo 30.08.04 21:44
Titel: Daten aus Array in QuickReport darstellen
Moin zusammen!

Ich will Daten die in einem Array[31][5] stehen in QR im Detail-Band darstellen, als wenn die Daten aus einer DB-Tabelle kommen. Ich hab da schon rumexperimentiert bis zum Abwinken, so mit DataSet, TTabel, ...

Hab wenig Erfahrung.


Tino - Di 31.08.04 10:22

Hallo!

Die QuickReport Komponente benötigt nicht zwingend eine Datenbank um Berichte zu erzeugen. Wenn du also keine DB im Hintergrund hast bietet die QR Komponente dir die Möglichkeit über ein Ereignis die benötigten Daten zu liefern. Das heißt, wenn die QR Komponente Daten benötigt um den Bericht zu erzeugen ruft diese das Ereignis auf und du kannst dann in diesem Ereignis die Daten übergeben. Leider weiß ich im Moment nicht wie das Ereignis heißt (OnGetData oder so). Schau einfach mal in den Ereignissen nach. Und lass dir auch mal die Hilfeseiten zu den Events anzeigen.

Gruß
Tino


grayfox - Di 31.08.04 12:54

hallo th_ellebracht!

zunächst mal willkommen im forum! :)

ohne dataset verwendest du am einfachsten 'OnNeedData' und 'BeforePrint'

ich poste dir ein beispiel, wie ich ein stringgrid mit hilfe von QuickReport zuu papier bringe...

der aufruf aus dem programm:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  oldWindowState: TWindowState;
begin
  oldWindowState:= WindowState;
  WindowState:= wsMinimized;
  try
    PrintFrm:= TPrintFrm.Create(self);
    PrintFrm.Init(Grid1);
    PrintFrm.QuickRep1.Preview;
  finally
    if PrintFrm <> nil then
      PrintFrm.Free;
    WindowState:= oldWindowState;
  end;
end;


und der zugehörige report:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
unit PrintDlgFrm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, QuickRpt, Qrctrls, Grids;

type
  TPrintFrm = class(TForm)
    QuickRep1: TQuickRep;
    PageHeaderBand1: TQRBand;
    PageFooterBand1: TQRBand;
    ColumnHeaderBand1: TQRBand;
    DetailBand1: TQRBand;
    QRLabel1: TQRLabel;
    QRLabel2: TQRLabel;
    QRLabel3: TQRLabel;
    QRLabel4: TQRLabel;
    QRLabel5: TQRLabel;
    QRLabel6: TQRLabel;
    QRLabel7: TQRLabel;
    QRLabel8: TQRLabel;
    QRLabel9: TQRLabel;
    QRLabel10: TQRLabel;
    QRSysData1: TQRSysData;
    procedure QuickRep1BeforePrint(Sender: TCustomQuickRep;
      var PrintReport: Boolean);
    procedure QuickRep1NeedData(Sender: TObject; var MoreData: Boolean);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private-Deklarationen }
     ZeileNr: integer;
     maxZeilen: integer;
     maxSeiten: integer;
     aGrid: TStringGrid;
  public
    { Public-Deklarationen }
    procedure Init(DGrid: TStringGrid);
  end;

var
  PrintFrm: TPrintFrm;

implementation

{$R *.DFM}

procedure TPrintFrm.Init(DGrid: TStringGrid);
begin
  aGrid:= TStringGrid.Create(self);
  aGrid:= dGrid;
  maxZeilen:= aGrid.RowCount;
  QuickRep1.Prepare;
  maxSeiten:= QuickRep1.PageNumber;
  qrLabel10.Caption:= ' von ' + IntToStr(maxSeiten) + ' Seiten'
end;

procedure TPrintFrm.QuickRep1BeforePrint(Sender: TCustomQuickRep;
  var PrintReport: Boolean);
begin
  ZeileNr:= 0;
end;

procedure TPrintFrm.QuickRep1NeedData(Sender: TObject;
  var MoreData: Boolean);
begin
  MoreData:= (ZeileNr < maxZeilen);
  if MoreData then begin
    QRLabel2.Caption:= aGrid.Cells[0,ZeileNr+1];
    QRLabel3.Caption:= aGrid.Cells[1,ZeileNr+1];
    QRLabel4.Caption:= aGrid.Cells[2,ZeileNr+1];
    QRLabel5.Caption:= aGrid.Cells[3,ZeileNr+1]
  end;
  inc(ZeileNr)
end;

procedure TPrintFrm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if aGrid <> nil then
    aGrid.Free;
end;

end.


viel spass damit!

mfg, stefan


th_ellebracht - Di 31.08.04 15:34
Titel: Danke, aber es soll ein Brief sein...
:D Hallo Stefan,

Danke für den Tipp,
aber da es ein Brief werden soll, in dem auch andere Daten enthalten sind,
und ich auch noch ein Seitenansicht realisieren will, war ich mit den Funktionen von OR schoon sehr glücklich. Schade war nur, dass aus meinem Lexmark-Drucker nichts raus kommt, hatte zum Glück noch nen alten HP, der geht.

Also, ich müsste die Daten schon so wie aus einer DB-Tabelle, oder so in ein DataSet, TTable, oder wie auch immer haben... glaube ich :(

:D Hallo Timo,
weiß noch nicht so ganz wie QR mit dem Array so klar kommt, denn ich muss die Label(eigentlich Spalten des Table) ja irgentwie aufs Blatt bringen. Ich werden testen und berichten.

Das Event, was Du meinst ist vermutlich das onNeedData-Event.

mfg,
Thomas


grayfox - Di 31.08.04 17:20

hallo thomas!

Zitat:
Ich will Daten die in einem Array[31][5] stehen in QR im Detail-Band darstellen, als wenn die Daten aus einer DB-Tabelle kommen


Zitat:
Also, ich müsste die Daten schon so wie aus einer DB-Tabelle, oder so in ein DataSet, TTable, oder wie auch immer haben... glaube ich


Zitat:
aber da es ein Brief werden soll, in dem auch andere Daten enthalten sind,


überleg zuerst mal in ruhe, was du haben willst und in welcher form die daten vorhanden sind, sonst wird das nur ein herumraten und schlussendlich bekommst du ganz etwas anderes, als du dir anfangs vorgestellt hattest.

mfg, stefan


th_ellebracht - Di 31.08.04 17:25
Titel: Dank danke danke :-)))))
Hallo Stefan,

erst habe ich gar nicht gecheckt, was du von mir willt, aber nach einigem probieren hat super geklappt.
:) :D :lol:

hast du ne ahnung warum mein lexmark-drucken nicht will. hab das was gelesen in nem tutorial über QR, hab aber keine ahnung wie man dieses problem beseitigt.

auf jeden fall herzlichen dank,
thomas


grayfox - Di 31.08.04 19:32

hallo tom!

Zitat:
erst habe ich gar nicht gecheckt, was du von mir willt
:?:
ich dachte, du wolltest etwas wissen? ;)

auszug aus den frequently asked questions auf der QReport-seite:

Zitat:

Q. We have an application, that prints a form developed in QR 2.0i. During development we used a LEXMARK printer an everything worked fine. But our customer have another printer a Kyocera, on that printer the print doesn't work.

A. One thing to look at is how complicated your form is and how much memory is in each printer. QuickReport renders each page to the printer canvas supplied by the printer driver. If the printer resolution is set too high and it doesn't have enough ram to render the entire page, you will get garbled or missing output, depending on the printer and/or driver. One way to verify that this is the problem would be to lower the printer's resolution through it's driver and then try to print the report.


vielleicht liegt das problem bei dir auch an auslösung/speicher?

mfg, stefan