AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Rave druckt wie blöd.. - oder garnicht.
Thema durchsuchen
Ansicht
Themen-Optionen

Rave druckt wie blöd.. - oder garnicht.

Ein Thema von SearchBot · begonnen am 28. Dez 2012 · letzter Beitrag vom 29. Dez 2012
Antwort Antwort
SearchBot

Registriert seit: 27. Jun 2004
Ort: N-W vom Bodensee
313 Beiträge
 
Delphi 12 Athens
 
#1

Rave druckt wie blöd.. - oder garnicht.

  Alt 28. Dez 2012, 03:10
Da sitze ich nun schon 9 Stunden, lese mich durchs Forum durch, google, probiere rum - und habe schon Teilerfolge, aber Rave macht nicht, was ich will.
Irgendwas ist noch falsch.

Ich habe "Delphi XE" und "Rave Reports 9.0 BE". Bleiben wir erst mal bei Rave; wenn das geht, sollte auch mein Code in Delphi laufen.

Also, in Rave:
Ich habe 2 Regionen definiert.
1. Region ist eine Art Briefkopf und hat ein Band mit ein paar Datenfeldern, die ich mit SetParameter fülle.
2. Region besteht aus einem Überschriften-Band, wo "ControllerBand" auf 'DataBand2' gesetzt ist; Bandstyle: "G 1P"
Darunter habe ich das "Databand2", wo "DataView" auf 'DataView1' gesetzt ist; Bandstyle: "Master 1P"

Im DataBand2 habe ich 9 DataText-Felder, die durchnummeriert bei "DataField" Datatext# heißen (# steht für die Nummer) und jeweils "DataView" auf Dataview1 gesetzt sind.

Rechts in der Auflistung unter "Data View Dictionary" und darunter "Dataview" habe ich meine 9 "DataView1DataText#" - letztlich ist irgendwie alles so, wie es auf 50 Seiten im Internet beschrieben wird.

Klicke ich jetzt auf Drucken (im Rave), also Druckvorschau, dann generiert mir das Ding ohne Pause 500 Seiten pro Sekunde. Ich breche es dann ab.

Ich hab hin und herprobiert und es klappt einfach nicht.

Was mache ich falsch?

Ich stelle gerade fest, daß - sobald ich mein Programm beende - Rave nicht mehr endlos Seiten generiert, sondern nur noch eine Zeile von Databand2 bringt, in der in allen Feldern "(invalid)" steht (die Überschriftenzeile fehlt dann aber).
Nun, dann mal noch den Quelltext in Delphi dazu...

Delphi-Quellcode:
procedure TForm2.RvCCGetCols(Connection: TRvCustomConnection);
begin
 with Connection do begin
   WriteField('DataText3',dtString,10,'','');
   WriteField('DataText4',dtString,10,'','');
   WriteField('DataText5',dtString,10,'','');
   WriteField('DataText6',dtString,10,'','');
   WriteField('DataText7',dtString,10,'','');
   WriteField('DataText8',dtString,10,'','');
   WriteField('DataText9',dtString,10,'','');
   WriteField('DataText10',dtString,10,'','');
   WriteField('DataText11',dtString,10,'','');
 end;
end;

procedure TForm2.RvCCGetRow(Connection: TRvCustomConnection);
function Logik:string;
begin
  if FallGrid.Cells[8,RvCC.Tag]='Rthen result:=' Relse
   if FallGrid.Cells[3,RvCC.Tag]='Jthen result:=' Xelse
    result:=' X';
end;
begin

 with Connection do begin
   WriteStrData(FallGrid.Cells[0,RvCC.Tag],''); //O
   WriteStrData(FallGrid.Cells[1,RvCC.Tag],''); //H
   WriteStrData(FallGrid.Cells[2,RvCC.Tag],''); //A
   WriteStrData(FallGrid.Cells[9,RvCC.Tag],''); //R
   WriteStrData(Logik,'?'); //Vorgang ->logik
   WriteStrData(FallGrid.Cells[4,RvCC.Tag],''); //T1
   WriteStrData(FallGrid.Cells[5,RvCC.Tag],''); //T2
   WriteStrData(FallGrid.Cells[6,RvCC.Tag],''); //T3
   WriteStrData(FallGrid.Cells[7,RvCC.Tag],''); //T4
 end;
end;

procedure TForm2.RvCCNext(Connection: TRvCustomConnection);
begin
 with RvCC do Tag:=Tag+1;
end;

procedure TForm2.RvCCOpen(Connection: TRvCustomConnection);
begin
 RvCC.Tag:=1;
 Connection.DataRows:=FallGrid.RowCount;
end;
In meinem Projekt habe ich die Komponenten RvSystem, RvProject und RvCustomConnection (RvCC).
In RvProject habe ich die "Engine" auf RvSystem1 gesetzt.


So, das sollte alles relevante nun zeigen. Ich weiß nicht weiter. Ist mein erstes Projekt mit Rave...
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

AW: Rave druckt wie blöd.. - oder garnicht.

  Alt 28. Dez 2012, 11:29
Hallo,

meiner Meinung nach moppelst du das doppelt .
Entweder du nutzt onopen, ongetcols und ongetrows oder onopen, (onfirst,) onnext und oneof.

Laß mal das onnext weg. Den Tag brauchst du nicht, du kannst im ongetrow Connection.dataindex verwenden, um rauszubekommen, welche Zeile grade an der Reihe ist und damit die Daten aus dem Grid ziehen.

Dir würde das oneof fehlen, wäre mir bei rave nicht sicher, ob es bei Verwendung von onnext auf die gesetzten Connection.DataRows hört.
(Macht ja vielleicht auch wenig Sinn, da man bei der Verwendung von onnext davon ausgehen könnte, das man das Ende vorher nicht unbedingt weiß).
Würde für mich erklären, warum der Report nicht aufhört.

Wenn Du dein Prog beendest, ist das invalid richtig - die Daten können ja nirgends mehr herkommen.

Gruß Frank

Nachtrag:
weiß nicht, ob bei DelphiXE schon Fastreprot dabei ist. Aber Rave ist nicht mehr so wirklich lebendig. gugg dir evtl einen anderen Reportgenerator wie Fastreport an.

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)

Geändert von Keldorn (28. Dez 2012 um 11:31 Uhr)
  Mit Zitat antworten Zitat
SearchBot

Registriert seit: 27. Jun 2004
Ort: N-W vom Bodensee
313 Beiträge
 
Delphi 12 Athens
 
#3

AW: Rave druckt wie blöd.. - oder garnicht. [erledigt-mit Tutorial]

  Alt 29. Dez 2012, 01:13
Vielen Dank für die neuen Denkanstöße. Hat geholfen.

Und damit ich das später auch noch weiß, und andere auch daraus Nutzen ziehen können, schreibe ich hier mal die Auflösung hin

Ich habe mich also für die GetRow/GetCols/OnOpen-Variante entschieden und die anderen entfernt.
Rave übernimmt dann das zeilenweise Daten-anfordern.

Dazu muss man dann auch wissen (ich habs jetzt gelernt), daß der große Raveeditor aktiv mit der IDE zusammenarbeitet, auch wenn er nicht danach aussieht.

Um das Layout in Rave zu gestalten, sollte das eigene Programm ausgeführt sein und im Grid Daten bereitstellen. Dann kann man nämlich im Raveeditor mit F9 beim Layout-gestalten sich immer wieder die Druckvorschau ansehen, mit den Daten des Grids.
Dabei ist zu beachten, daß Felder, die man im Delphi mit SetParam an Rave sendet, leer bleiben.

Parameterfelder sind DataText-Komponenten.

Um diese zu nutzen, legt man rechts in der Objektanzeige bei "RaveProject" bzw. spätestens bei "Report1" (anklicken) in der Eigenschaft "Parameters" (Stringliste editieren, in jede Zeile einen) die Namen der Parameter an.
Die Parameter werden dann so übergeben:
Delphi-Quellcode:
procedure TForm2.Drucken1Click(Sender: TObject);
begin
  with RvProject1 do begin
  SetParam('DataText1',edit1.text);
  SetParam('DataText2',edit2.text);
// SelectReport('Report1', true); // wenn man noch andere Reports hätte
  Execute;
 end;
end;
Andersherum schreibt man in seinem Programm den Code, zB optische Anpassungen der Strings. Das Programm wird normal ausgeführt - und dann sind auch die mit SetParam übergebenen Parameterfelder gefüllt. Wenn Rave feststellt, daß die in StoreRAV gespeicherte Version des Layouts nicht aktuell ist, bietet es an, dieses zu laden - andernfalls kann man das zur Entwurfszeit auch selber machen.

Sollte es vor der Druckvorschau einen Fehler geben, daß Rave etwas nicht öffnen/konnektieren könne, liegt das daran, daß man sich die Vorschau sowohl im RaveEditor als auch im Programm ansehen wollte (hier und da öffnen funktioniert nicht) - Dann eines von beiden beenden (hat was mit Threads zu tun). Bleibt der Fehler beim Klick auf [Wiederholen]: Rave beenden, dann sollte es wieder gehen.

Ich hatte auch das Problem mit den Regionen und Bändern.

Schließlich habe ich alles auf eine Region1 gepackt und wie folgt konfiguriert:
-Band1 (Briefkopf, nur auf der ersten Seite zu drucken): TextBand, (Master 1). Hier sind auch die Parameter-Felder.
-Band2 (Überschriften der Spalten, Kopfzeile): TextBand, (B 1 P), Controllerband: DataBand1
-DataBand1 (Hier füllt Rave dann die Daten in meine vorgegebenen Felder rein): (Master 1 P)
Region1 füllt dann fast das ganze Blatt, damit Rave genügend Raum für die Tabelle hat.

Die Tabelle selbst (also das Gitter) legt man einfach mit Linien an (im Tab "Drawing" zu finden).

Zusätzlich habe ich noch eine Fußzeile aufs Blatt gebracht, die nicht - wie man denken könnte - als Footer in Region1 angelegt wird, weil der Bodyfooter unlogischerweise nur auf der letzten Seite am Tabellenende gedruckt wird (im Gegensatz zum Bodyheader, der auf jede neue Seite gedruckt wird [wahrscheinlich ein Bug]).
Diese Fußzeile habe ich in Region2 angelegt: TextBand, (Master 1P).

Im DataBand1 lege ich meine DataText-Felder an, und klicke oben links auf das Icon "view", das dann die Datenfelder in der Objektauflistung rechts unter "Data View Dictionary" und "DataView1" anlegt (ich habe das gemacht, plötzlich ging es, weiß auch nicht mehr genau wie - das Programm musste dabei laufen, oder so). Rave hat dann auch die Eigenschaft "ConnectionName" auf meine Komponente im Delphi (RvCC) gesetzt und die "Size" der StringField-Komponenten, die ich im Quellcode in der Procedure RvCCGetCols definiert habe.

Beim Auswählen der positionierten Elemente auf der Rave-Seite sollte man lieber die Objektübersicht auf der rechten Seite des Editor nehmen, weil man nur zu leicht die Positionen beim Anklicken verschieben kann und ein Undo es dafür nicht gibt.
Also wähle ich meine DataText-Objekte an (mit der Shifttaste auch mehrere auf einmal) und setze die Eigenschaft "Dataview" auf "Dataview1", was vorhin angelegt wurde.

Dann wende ich mich (wieder) dem Quellcode zu.

("RvCC" ist bei mir die TRvCustomConnection)

Ich habe die Rave-Komponenten RvSystem1, RvProject1 und RvCC.
-RvSystem: Hier passe ich die Druck-Seite an, wie ich es brauche: zB Systemprinter.Orientation: poLandscape (da suchte ich eine Weile); und die Texte auf deutsch..
-RvProject1: Hier geht es um das Layout, das in einer .rav-Datei gespeichert ist. Das also in ProjectFile angeben oder besser, den Dialog bei StoreRAV ([...]-Button) ausfüllen. Die Eigenschaft "engine" auf 'RvSystem1' setzen.

-RvCC: Hier geht es darum, die Events zu setzen:

Delphi-Quellcode:
procedure TForm2.RvCCOpen(Connection: TRvCustomConnection);
begin
//Für das TStringGrid ("FallGrid"), das ich verwende (ich habe darin eine Kopfzeile, die ich nicht in Rave ausgedruckt haben will) schreibe ich also:

  Connection.DataRows:=FallGrid.RowCount-2;
end;

procedure TForm2.RvCCGetCols(Connection: TRvCustomConnection);
begin
 with Connection do begin
   WriteField('DataText3',dtString,10,'','');
//für jedes Feld so eine Definition; "10" ist die Feldlänge in Zeichen, was drüber rausgeht, wird abgeschnitten
 end;
end;

procedure TForm2.RvCCGetRow(Connection: TRvCustomConnection);
begin
 with Connection do begin
   WriteStrData(FallGrid.Cells[1,DataIndex+1],'');
//...wie bei GetCols: für jedes Datenfeld eine Anweisung in der gleichen Reihenfolge!
 end;
end;
Tja, und nun läuft das. Schön siehts aus

Danke, daß es dieses Forum gibt
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz