Voreingestellten Drucker auslesen / RTF-Feld / LlPrintEnd()

Hallo!
Ich habe nun kein Problem mehr mit RTF-Feldern in Formularen, aber vielleicht kann mir jemand erklären, warum ich eins hatte:

Mein (XBase++) Programm hat durch eine Methode (siehe unten) vor dem Start eines Druckauftrages geprüft, welcher Drucker und Anschluss für ein ausgewähltes Formular verwendet würde, wenn der Benutzer nicht vor dem Druck einen (anderen) Drucker auswählt.
Dazu habe ich einen Pseudo-Druckjob gestartet und die Daten nur mit der Funktion LlPrintGetPrinterInfo() ausgelesen.

Das hatte über viele LL-Versionen hinweg wunderbar funktioniert, solange das Formular kein RTF-Feld enthielt. Dann gab es beim anschließenden wirklichen Druck des Formulars einen XBase-Fehler (Internal Data Structures corupted) beim ersten Aufruf der Funktion LLPrint().

Durch Zufall habe ich festgestellt, dass alles prima funktioniert, wenn das Programm auf das Auslesen des voreingestellten Druckers verzichtet. Dann habe ich festgestellt, dass der Aufruf der Funktion LlPrintEnd() (am Ende des Codebeispiels) fehlte.
…wie gesagt kam es nur zu einem Absturz, wenn das Formular ein RTF-Feld enthielt.

Falls also jemand meine Neugier befriedigen kann, warum das so ist, oder sogar sagen kann, wie das Auslesen des Druckers eleganter oder schneller geschehen kann, wäre ich sehr dankbar…

Ingo Kothke


XBase-Code zum Auslesen des voreingestellten Druckers:

LL15MODULEINIT()
// List & Label Job oeffnen und handle holen
hJob := LlJobOpen( CMBTLANG_GERMAN )

// Der Block muss Daten definieren -> sonst gibt’s Fehler!!
Eval( self:bLL_Block, hJob )

// List & Label Druckjob starten
LlSetPrinterDefaultsDir( hJob, ::cPrinterPfad )

// Job pseudostarten
nRet := LlPrintStart(hJob,;
self:LL_ProjectTyp,;
sName,;
LL_PRINT_NORMAL)

IF nRet <> 0
MsgBox( “Druckerfehler! nRet LlPrintStart= " + ALLTRIM( STR( nRet ) );
+ " vermutlich fehlerhaftes Formular!”,;
“Fehler!” )
cDruckerName = “unbekannt (Formularfehler?)”
cDruckerPort = “unbekannt (Formularfehler?)”
ELSE
// Druckername und -Port ermitteln
nRet := LlPrintGetPrinterInfo( hJob,;
@cDruckerName, 50,;
@cDruckerPort, 50 )
IF nRet <> 0
MsgBox( "Druckerfehler! nRet LlPrintGetPrinterInfo= " + ALLTRIM( STR( nRet ) ),;
“Fehler!” )
cDruckerName = “unbekannt (Formularfehler?)”
cDruckerPort = “unbekannt (Formularfehler?)”
ENDIF

ENDIF
// List & Label Druckjob abschliessen
LlPrintEnd( hJob, 0) // <- wenn LlPrintEnd() fehlt stürzt das Programm beim folgenden
// Druck ab, wenn das Formular ein RTF-Feld enthält!
// List & Label-Job beenden
LlJobClose(hJob)
LL15MODULEEXIT()