Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Werkzeuge (https://www.delphipraxis.net/63-sonstige-werkzeuge/)
-   -   RaveReport Error #40 Boolean expression expected (https://www.delphipraxis.net/178784-ravereport-error-40-boolean-expression-expected.html)

TUX_der_Pinguin 27. Jan 2014 14:31

RaveReport Error #40 Boolean expression expected
 
So ich hoffe jemand von euch weiß woran das liegen kann das wenn ich folgende Routine ein
weiteres mal aufrufe das dann ein Fehler gemeldet wird. "Error #40 - Boolean expression expected".
Der erste Durchlauf funktioniert einwandfrei und dann war es das, ich muss die Anwendung beenden
und kann dann die Routine erst dann wieder benutzen.

Ich bekomme den Fehler weg wenn ich die Zeile RvProject.ProjMan.Compile weglasse nur dann werden
auch die Ereignisse nicht erzeugt. Und bei google findet sich nur ein Eintrag mit der gleichen
Fehlermeldung, hier aus dem Forum, nur ohne eine Lösung.


Delphi-Quellcode:
procedure PrintReport;
var
  Report: TRaveReport;
  Page: TRavePage;
  DataBandTabData: TRaveDataBand;
  DV_TabData: TRaveDataView;
  Event: TRaveSimpleEvent;

begin
  //Report öffnen & Komponenten ermitteln
  RvProject.ProjectFile := glLocalAppDir+FILE_REPORT_GENERAL;
  RvProject.Open;
  Report := RvProject.ProjMan.FindRaveComponent('MyReport', nil) as TRaveReport;
  Page := RvProject.ProjMan.FindRaveComponent('Page1', Report) as TRavePage;
  DataBandTabData := RvProject.ProjMan.FindRaveComponent('DataBandTabData', Page) as TRaveDataBand;
  DV_TabData := RvProject.ProjMan.FindRaveComponent('DV_TabData', Page) as TRaveDataView;
  CreateFields(DV_TabData, nil, nil, True);

  //Feld erstellen
  DataText := DataBandTabData.CreateChild(TRaveDataText, 'dt_DynamischerFeldName') as TRaveDataText;
  DataText.DataField := 'DynamischerFeldName';
  DataText.DataView := DV_TabData;

  //Event erzeugen
  Event := TRaveSimpleEvent.Create;
  Event.Name := TableLayout.Tabs[Idx].Key+'OnBeforePrint';
  Event.ModuleOwner := Page;
  Event.Sender := DataText;
  Event.Owner := DataText;
  Event.Body := 'Self.Color := '+IntToStr(clRed)+';';

  //Event zuweisen
  DataText.OnBeforePrint := Event;

  //Event kompilieren
  RvProject.ProjMan.Compile;

  //Report ausführen und schließen
  RvProject.ExecuteReport('MyReport');
  RvProject.Close;

end;

Aviator 27. Jan 2014 14:50

AW: RaveReport Error #40 Boolean expression expected
 
Hast du es mal mit dem Debugger versucht und geschaut wo er stehen bleibt? :?:

Edit: Vielleicht liegt es ja an der CreateFields() Prozedur.

baumina 27. Jan 2014 14:58

AW: RaveReport Error #40 Boolean expression expected
 
Du createst einiges in dieser procedure, das du nicht wieder frei gibst, evtl. liegt es daran.

TUX_der_Pinguin 27. Jan 2014 15:48

AW: RaveReport Error #40 Boolean expression expected
 
Zitat:

Zitat von Aviator (Beitrag 1245534)
Hast du es mal mit dem Debugger versucht und geschaut wo er stehen bleibt? :?:

Also Debuggen kann ich da nichts, er bleibt bei RvProject.ExecuteReport(''); hängen da der Fehler irgendwo in den Eingeweiden vom Rave System auftritt.
Und da bei der Delphi Version keine Quelltexte von Rave dabei sind kann man auch nicht sehen wo genau der Fehler ausgelöst wird.

Zitat:

Zitat von baumina (Beitrag 1245536)
Du createst einiges in dieser procedure, das du nicht wieder frei gibst, evtl. liegt es daran.

Daran habe ich auch schon gedacht nur wenn ich z.b. versuche nach ExecuteReport oder Close z.b. das Ereignis mit Event.Free freizugeben dann bekomme ich einen Zeigerfehler.

In den Beispielen von Nevrona, wo es darum geht Felder etc. zuerzeugen wird auch nichts explizit freigegeben am Ende. Die Beispiele enthalten leider nicht die Erzeugung von Ereignissen bzw. die
Ausführung des Kompiler.

baumina 28. Jan 2014 06:10

AW: RaveReport Error #40 Boolean expression expected
 
Bevor du das Event freigeben kannst, musst du die Zuordnung DataText.OnBeforePrint auf NIL setzen. Aber muss Datatext nicht ebenfalls freigegeben werden? Ist DataText global deklariert?

TUX_der_Pinguin 28. Jan 2014 08:01

AW: RaveReport Error #40 Boolean expression expected
 
Zitat:

Zitat von baumina (Beitrag 1245591)
Bevor du das Event freigeben kannst, musst du die Zuordnung DataText.OnBeforePrint auf NIL setzen. Aber muss Datatext nicht ebenfalls freigegeben werden? Ist DataText global deklariert?

DataText ist lokal deklariert, ich hatte es nur vergessen in meinem Beispiel anzugeben im echten Code
ist es aber da.

Ich habe keinen Schimmer was ich noch ausprobieren soll, in allen Beispielen sowohl mit als auch ohne
Ereignis Erzeugung wird nach RvProject.ProjMan.Compile nichts freigegeben oder durch weitere Befehle zurückgesetzt.

baumina 28. Jan 2014 08:41

AW: RaveReport Error #40 Boolean expression expected
 
Ich würde an deiner Stelle versuchen den Report vor dem Compile auf Festplatte zu speichern und ihn mir dann anschauen.

TUX_der_Pinguin 28. Jan 2014 11:35

AW: RaveReport Error #40 Boolean expression expected
 
Zitat:

Zitat von baumina (Beitrag 1245612)
Ich würde an deiner Stelle versuchen den Report vor dem Compile auf Festplatte zu speichern und ihn mir dann anschauen.

So ich habe das mal ausprobiert, nach dem ersten lauf kann ich mir den Report anschauen und alle Felder wurden so angelegt wie sie es auch sollten. Alles ist in Ordnung.

Beim zweiten versuch kommt die Fehlermeldung und mache ich dann im Report Designer ein Refresh des DataView sehe ich nur noch ein Feld mit der Bezeichnung "DV_TabHeaderFieldName".
Das DataView heißt "DV_TabHeader" aber ein Feld "FieldName" erzeuge ich nicht, für mich deutet das darauf hin das er beim versuch das erste Feld zu erzeugen crasht.
Aber warum und wieso zum Teufel eine so nichts sagende Meldung kommt "Boolean expression expected" verstehe ich nicht.

Langsam verzweifel ich an dem Teil. :evil:

TUX_der_Pinguin 6. Feb 2014 09:53

AW: RaveReport Error #40 Boolean expression expected
 
Liste der Anhänge anzeigen (Anzahl: 1)
So ich habe jetzt noch mal ein kleines Tool gebastelt um alles andere von dem eigentlichen Projekt auszuschließen.

Ich habe einen einfachen Report erstellt, eine Region mit einem Databand auf den wird dann zur Laufzeit ein DataText Objekt plaziert.
Und mit Hilfe eines Ereignis welches ebenfalls zur Laufzeit erstellt wird soll der Text eingefärbt werden.

Durch den Klick auf den Button wird der Report aufgerufen und als PDF Datei exportiert und anschließend wird das PDF geöffnet.

Und wieder kann ich dieses nur einmal machen, beim zweiten Versuch erhalte ich eine Fehlermeldung dies mal ist es jedoch "General Compiler Error".
Das liegt aber wohl nur daran das ich Integer an den Report übergebe und keine Strings mehr, bei Strings würde ich wieder die
ursprüngliche Fehlermeldung "Error #40 Boolean expression expected" erhalten.

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
  Report: TRaveReport;
  Page: TRavePage;
  DataBand: TRaveDataBand;
  DataView: TRaveDataView;
  DataText: TRaveDataText;
  Event: TRaveSimpleEvent;

begin
  //Rave für PDF Export vorbereiten...
  RvSystem.DefaultDest   := rdFile;
  RvSystem.DoNativeOutput := False;
  RvSystem.RenderObject  := RvRenderPDF;
  RvSystem.OutputFileName := '.\test.pdf';
  RvSystem.SystemSetups  := RvSystem.SystemSetups - [ssAllowSetup];
  RvSystem.SystemOptions := RvSystem.SystemOptions - [soShowStatus];

  //Report öffnen
  RvProject.ProjectFile := '.\test.rav';
  RvProject.Open;

  //Komponenten ermitteln
  Report := RvProject.ProjMan.FindRaveComponent('Test', nil) as TRaveReport;
  Page := RvProject.ProjMan.FindRaveComponent('Page1', Report) as TRavePage;
  DataBand := RvProject.ProjMan.FindRaveComponent('DataBand1', Page) as TRaveDataBand;
  DataView := RvProject.ProjMan.FindRaveComponent('DataView1', Page) as TRaveDataView;
  CreateFields(DataView, nil, nil, True);

  //Feld erstellen
  DataText := DataBand.CreateChild(TRaveDataText, 'dtData') as TRaveDataText;
  DataText.DataField := 'DataFeld';
  DataText.DataView := DataView;
  DataText.Top := 0;
  DataText.Left := 0 / RvProject.ProjMan.UnitsFactor;
  DataText.Width := 15 / RvProject.ProjMan.UnitsFactor;

  //Ereignis erstellen
  Event := TRaveSimpleEvent.Create;
  Event.Name := 'DataFeldOnBeforePrint';
  Event.ModuleOwner := Page;
  Event.Sender := DataText;
  Event.Owner := DataText;
  Event.Body := 'if DataView1Color.AsInteger <> '+IntToStr(clBlack)+' then'+
                ' Self.Color := DataView1Color.AsInteger;'+
                'end;';

  DataText.OnBeforePrint := Event;

  //Events kompilieren..
  RvProject.ProjMan.Compile;

  //Report ausführen...
  RvProject.ExecuteReport('Test');

  //Report schließen...
  RvProject.Close;

  ShellExecute(Application.Handle, 'open', PWideChar('.\test.pdf'), nil, nil, SW_NORMAL);

end;

Der Quellcode, kompilierte Exe und die Report Datei habe ich angehängt.

sx2008 6. Feb 2014 10:59

AW: RaveReport Error #40 Boolean expression expected
 
Du solltest das
Delphi-Quellcode:
TRaveSimpleEvent
nach dem Schliesen des Reports mit
Delphi-Quellcode:
Free
freigeben; ansonsten hast du ein Speicherleck.
Es könnte sogar sein, dass das alte Event irgendwie noch gecached wird und sich deshalb der Compiler beschwert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:35 Uhr.
Seite 1 von 2  1 2      

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