Reportlistener mit Successor

26/11/2007 - 07:58 von Andreas Beger | Report spam
Hallo Füxe,

ich habe eine Problem beim Verketten von Reportlistenern. Rein funktionell
làuft alles, aber nach dem Druck scheint es noch eine hàngende Referenz zu
geben.
Ich arbeite mit privaten Datensitzungen. Nach dem Schließen des Formulars
bleibt die jeweilige Datensitzung noch erhalten, obwohl alle Tabellen
geschlossen sind.
Nur ein CLEAR ALL làsst die Datensitzungs-Leichen verschwinden, ist aber
keine Lösung mitten im Programm.
Zum Nachvollziehen habe ich im folgenden Programm das Problem auf das
Wesentliche reduziert.


***********************
LOCAL loForm AS FORM, lnI, laSession
CLEAR ALL
? "Test ohne Sucessor"
FOR lnI=1 TO 5
loForm=CREATEOBJECT("testform", .F.)
? lnI, "Anzahl Datensitzungen: "+TRANSFORM(ASESSIONS(laSession))
loForm.RELEASE
ENDFOR
? "Test mit Sucessor"
FOR lnI=1 TO 5
loForm=CREATEOBJECT("testform", .T.)
? lnI, "Anzahl Datensitzungen: "+TRANSFORM(ASESSIONS(laSession))
loForm.RELEASE
ENDFOR

DEFINE CLASS testform AS FORM

DATASESSION = 2 && private Datasession

PROCEDURE INIT
LPARAMETERS tlSuccessor
LOCAL loListener1, loListener2, lnI
* Datei erstellen mit Druckdaten
CREATE CURSOR Dummy (Feld1 c(20))
FOR lnI=1 TO 5
INSERT INTO Dummy VALUES ("Test ReportListener")
ENDFOR


* einfachen Report erstellen
CREATE REPORT test FROM Dummy

loListener1= NEWOBJECT("_ReportListener", ;
ADDBS(HOME()) + "FFC\" + "_ReportListener.VCX")
loListener2= NEWOBJECT("_ReportListener", ;
ADDBS(HOME()) + "FFC\" + "_ReportListener.VCX")
IF tlSuccessor
loListener1.successor=loListener2
ENDIF

* zeige Report-Vorschau
loListener1.LISTENERTYPE = -1 && keine Ausgabe
REPORT FORM test OBJECT loListener1

* Cursor schließen und Report löschen
USE IN Dummy
DELETE FILE test.fr?
ENDPROC

ENDDEFINE
***********************

Hat jemand eine Erklàrung für das Verhalten.

Andreas
VFP 9, SP2
 

Lesen sie die antworten

#1 Andreas Beger
26/11/2007 - 17:37 | Warnen spam
Hallo,

ich hab's gefunden. Zum Erstellen der Reportlistener-Objekte die
Default-Datasession einstellen, und schon wird wieder richtig aufgeràumt.
Ich frage mich nur, warum diese Maßnahme bei einem einzelnen
Reportlistener nicht notwendig ist.

lnDatasession = SET("DATASESSION")
SET DATASESSION TO 1
loListener1= NEWOBJECT("_ReportListener", ;
ADDBS(HOME()) + "FFC\" + "_ReportListener.VCX")
loListener2= NEWOBJECT("_ReportListener", ;
ADDBS(HOME()) + "FFC\" + "_ReportListener.VCX")
loListener1.successor=loListener2
SET DATASESSION TO lnDatasession

Ähnliche fragen