Entwickler-Ecke

Sonstiges (Delphi) - typisierte Datei drucken.


sunday_2 - Mo 02.12.02 16:34
Titel: typisierte Datei drucken.
Hi,

habe folgendes Prob:
Ich möchte eine typisierte Datei ausdrucken. Nutze hierfür QuickReport und diverse QRLabels, die ich ein einem QRSubDetail eingebunden habe. Mit QRDBText-Feldern und einer Paradox7 DB hat es funktioniert. Mit einer typisierten Datei klappt es so nicht. Weiß jemand rat??
Ich poste mal den Code, vieleicht seht ihr ja direkt den Fehler.

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:
procedure TSpieldefinition.b_spielerdaten_druckenClick(Sender: TObject);
var p: integer;
    Buffer: array[0..BufferSize -1] of TSpielerdaten;
    Spielerdaten_drucken: TSpielerdaten_drucken;
begin
        application.CreateForm(TSpielerdaten_drucken,Spielerdaten_drucken);
        Seek(FSpDaten,0);
        p:=0;
        while not eof(FSpDaten) do
        begin

           Read(FSpDaten,Buffer[p]);
           Spielerdaten_drucken.QRDBText1. := Buffer[p].Name;
 {         Spielerdaten_drucken.QRLabel11.Caption:= Buffer[p].Vorname;
           Spielerdaten_drucken.QRLabel12.Caption:= Buffer[p].Mannschaft;
           Spielerdaten_drucken.QRLabel13.Caption:= Buffer[p].Strasse;
           Spielerdaten_drucken.QRLabel14.Caption:= Buffer[p].plz;
           Spielerdaten_drucken.QRLabel15.Caption:= Buffer[p].ort;
           Spielerdaten_drucken.QRLabel16.Caption:= Buffer[p].land;
           Spielerdaten_drucken.QRLabel17.Caption:= Buffer[p].telefon;
           Spielerdaten_drucken.QRLabel18.Caption:= Buffer[p].alter;
  }
           inc(p);
        end;

           Spielerdaten_drucken.QuickRep1.preview;
           Spielerdaten_drucken.Release;
end;


Udontknow - Mo 02.12.02 17:07

Hi!

Nun, je nach Delphi-Version besteht die Möglichkeit, ein Clientdataset zu erzeugen, den einzelnen Feldern des Records entsprechend Felder hinzuzufügen und die Daten dann in das CDS zu kopieren, um dieses dann anschliessend im Quickreport auszugeben.

Cu, :)
Udontknow


sunday_2 - Di 03.12.02 09:55

Ich habe Delphi 6 Professional.

Könntest Du den Rest bitte näher erläutern. :shock:


Udontknow - Di 03.12.02 10:40

Nimm dir einfach ein Clientdataset (Reiter "Datenzugriff"), und doppelclicke es. Der Feldereditor geht auf. Dort fügst du für jedes Recordelement ein neues Feld hinzu, am besten nimmst du die gleichen Namen.
Ausserdem musst du vom CDS noch die Eigenschaft Filename setzen, damit du auch ohne Datenbank-Verbindung das CDS benutzen kannst. Trage am besten einfach "C:\temp.cds" ein.

Zur Laufzeit musst du nun für jeden vorhandenen Record ein Insert ins CDS machen und die Felder bestücken (so, als ob du in eine Datenbank schreiben würdest).


Quelltext
1:
2:
3:
4:
5:
6:
7:
for i:=1 to MyRecordCount do
begin
  CDS.Insert;
  CDS.FieldByName('RecordElement1').Value:=MyRecords[i].RecordElement1;
  CDS.FieldByName('RecordElement2').Value:=MyRecords[i].RecordElement2;
  CDS.Post;
end;


Anschliessend weist du dem Quickreport bzw. dem Detailband die Eigenschaft Dataset zu (und natürlich auch den einzelnen DBLabels etc). Das sollte es dann gewesen sein.

Cu, :)
Udontknow

PS: Ich meine, erst kürzlich irgendetwas von lizenzrechtlichen Problemen bezüglich D6 Pro und CDS gehört zu haben, angeblich darf man mit einer Pro-Lizenz keine Anwendung, die CDS benutzt, vertreiben. :?


sunday_2 - Di 03.12.02 13:10

Hi Udontnow,

irgentwie funktioniert das bei mir nicht so richtig. Ich bekomme immer die Fehlermeldung: CDS: Operation bei geschlossener Datenmenge nicht ausführbar!
Woran liegt das?

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:
procedure TSpieldefinition.b_spielerdaten_druckenClick(Sender: TObject);
var p: integer;
    Buffer: array[0..BufferSize -1] of TSpielerdaten;
    Spielerdaten_drucken: TSpielerdaten_drucken;
begin
        application.CreateForm(TSpielerdaten_drucken,Spielerdaten_drucken);
        Seek(FSpDaten,0);
        p:=0;
        while not eof(FSpDaten) do
        begin
           Read(FSpDaten,Buffer[p]);
           Spielerdaten_drucken.CDS.Insert; // Hier kommt die Fehlermeldung!
           Spielerdaten_drucken.CDS.FieldByName('Name').Value:=Buffer[p].Name;
           Spielerdaten_drucken.CDS.FieldByName('Vorname').Value:=Buffer[p].Vorname;
           Spielerdaten_drucken.CDS.FieldByName('Mannschaft').Value:=Buffer[p].Mannschaft;
           Spielerdaten_drucken.CDS.FieldByName('Strasse').Value:=Buffer[p].Strasse;
           Spielerdaten_drucken.CDS.FieldByName('plz').Value:=Buffer[p].plz;
           Spielerdaten_drucken.CDS.FieldByName('ort').Value:=Buffer[p].ort;
           Spielerdaten_drucken.CDS.FieldByName('land').Value:=Buffer[p].land;
           Spielerdaten_drucken.CDS.FieldByName('telefon').Value:=Buffer[p].telefon;
           Spielerdaten_drucken.CDS.FieldByName('alter').Value:=Buffer[p].alter;
           Spielerdaten_drucken.CDS.Post;
           inc(p);
        end;

           Spielerdaten_drucken.QuickRep1.preview;
           Spielerdaten_drucken.Release;
end;


Udontknow - Di 03.12.02 13:19

Hi!

Einfach vorher CDS.Active:=True setzen.

Cu,
Udontknow


sunday_2 - Di 03.12.02 13:32

Habe ich schon versucht. Geht aber nicht.
Wenn ich CDS-Aktiv auf true setzen will, bekomme ich die Fehlermeldung:
Fehlender Daten-Provider oder fehlendes Datenpaket.


Udontknow - Di 03.12.02 13:46

Hi!

Sorry, habe teilweise Bockmist erzählt... :oops:

Also, brauchst kein Filename, du musst vor dem Aktivieren einfach nur die Methode CDS.CreateDataset aufrufen.

Cu,
Udontknow


sunday_2 - Di 03.12.02 14:47

Jetzt druckt er, :) leider nur die erste Zeile :(

Weißt Du, was jetzt noch fehlt?

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:
procedure TSpieldefinition.b_spielerdaten_druckenClick(Sender: TObject);
var p: integer;
    Buffer: array[0..BufferSize -1] of TSpielerdaten;
    Spielerdaten_drucken: TSpielerdaten_drucken;
begin
        application.CreateForm(TSpielerdaten_drucken,Spielerdaten_drucken);
        Seek(FSpDaten,0);
        p:=0;
        Spielerdaten_drucken.CDS.CreateDataSet;
        Spielerdaten_drucken.CDS.Active:=True;
        while not eof(FSpDaten) do
        begin
           Read(FSpDaten,Buffer[p]);
           Spielerdaten_drucken.CDS.Insert;
           Spielerdaten_drucken.CDS.FieldByName('Name').Value:=Buffer[p].Name;
           Spielerdaten_drucken.CDS.FieldByName('Vorname').Value:=Buffer[p].Vorname;
           Spielerdaten_drucken.CDS.FieldByName('Mannschaft').Value:=Buffer[p].Mannschaft;
           Spielerdaten_drucken.CDS.FieldByName('Strasse').Value:=Buffer[p].Strasse;
           Spielerdaten_drucken.CDS.FieldByName('plz').Value:=Buffer[p].plz;
           Spielerdaten_drucken.CDS.FieldByName('ort').Value:=Buffer[p].ort;
           Spielerdaten_drucken.CDS.FieldByName('land').Value:=Buffer[p].land;
           Spielerdaten_drucken.CDS.FieldByName('telefon').Value:=Buffer[p].telefon;
           Spielerdaten_drucken.CDS.FieldByName('alter').Value:=Buffer[p].alter;
           Spielerdaten_drucken.CDS.Post;
           inc(p);
        end;

           Spielerdaten_drucken.QuickRep1.preview;
           Spielerdaten_drucken.Release;
end;