Seite 1 von 1
Fehlermeldung bei setzen der Orientation
Verfasst: Mi, 12. Dez 2007 7:41
von Koverhage
Hallo,
habe das Problem (bisher nur bei einem Kunden, hat Office bzw. Word 2003), sobald versucht wird die Orientation zu setzen, das Programm mit einer Xbase Fehlermeldung beendet wird. Komischerweise klappt das sichern der aktuellen Einstellung.
Gibt es Systemeinstellungen oder ähnliches, die dies verursachen können?
Code: Alles auswählen
// Oeffnen eines Word-Dokuments und Zugriff auf
// eine Sammlung von Lesezeichen
oWord:documents:open( cFile )
oDoc := oWord:ActiveDocument
oBM := oDoc:Bookmarks
oDruckerSettings := oDoc:PageSetup
// Ersetzen des Lesezeichens durch einen neuen
// Wert
// Speichern des Ergebnisses
IF(ValType(cSaveAs)=="C")
oDoc:saveas(cSaveAs)
ENDIF
// Sichern der aktuellen Einstellungen
nFirstTrayID := oDruckerSettings:FirstPageTray
nOtherTrayID := oDruckerSettings:OtherPagesTray
nOldOrientation := oDruckerSettings:Orientation
// Setzen der gew
Verfasst: Mi, 12. Dez 2007 11:11
von Lewi
Moin,
über oDoc:PageSetup:Orientation = <wdOrientation> wird eine Druckeigenschaft für das Dokument gesetzt. Nach Deiner Fehlermeldung wird ein ungültiger Wert gesetzt. Ich vermute, dass über über die Property :Orientation ein Wert gesetzt wird, aber nicht aktuelle Wert zurückgegeben wird.
Warum soll überhaupt der Wert gesichert werden? Die Eigenschaften des Druckers werden über PageSetup selbst nicht geändert.
Gruß, Olaf
Verfasst: Mi, 12. Dez 2007 11:15
von Rolf Ramacher
Hi Klaus,
setzt man mit
rientation nicht "PORTRAIT" oder "LANDSCAPE".
Hast du das etwas gesetzt ??
Verfasst: Mi, 12. Dez 2007 11:47
von Koverhage
Hallo Rolf,
unter Xbase++ schon
PORTRAIT
bei MS Word = 0
bei MS Excel = 1
bei Xbase++ = 1
LANDSCAPE
bei MS Word = 1
bei MS Excel = 2
bei Xbase++ = 2
wie so oft ist hier Microsoft mit seinen Produkten nicht kompatibel
Verfasst: Mi, 12. Dez 2007 11:49
von Koverhage
Hallo Olaf,
ok das sichern der aktuellen Einstellungen muss nicht sein.
Aber warum kann ich die Eigenschaft Orientation nicht setzen ?
Bis jetzt funktioniert das nur bei diesem Kunden nicht.
Klaus
Verfasst: Mi, 12. Dez 2007 12:39
von brandelh
Hallo Klaus,
Kann es sein, dass dieser Drucker (Treiber) das Setzen der Orientation nicht unterstützt ?
Kann der Kunde das in Word direkt machen ?
Welche Wordversion hat er, eventuell gibt es da Unterschiede ?
Verfasst: Mi, 12. Dez 2007 16:25
von Lewi
Koverhage hat geschrieben:Hallo Olaf,
ok das sichern der aktuellen Einstellungen muss nicht sein.
Aber warum kann ich die Eigenschaft Orientation nicht setzen ?
Bis jetzt funktioniert das nur bei diesem Kunden nicht.
Poste doch mal Deinen Code. Die Property :Orientation führte bei meinen Anwendungen noch bei keinem Kunden zu einem Laufzeitfehler.
Gruß, Olaf
Verfasst: Do, 13. Dez 2007 9:44
von Rolf Ramacher
Hi,
also bei mir klappt dies auch ohne Probleme. Ich setze den Orientation nach der If-Abfrage auf Printer.
hier mein Auszug.
Code: Alles auswählen
// Druckausgabe nicht standardmäßig in Datei umleiten
oDlg:enablePrintToFile := .f.
oDlg:printToFile := .f.
oDlg:create()
// Konfiguriertes Drucker Objekt erzeugen
oPrinter := oDlg:display()
oDlg:destroy()
IF oPrinter <> NIL
oPrinter:setOrientation(XBPPRN_ORIENT_LANDSCAPE)
// Neuen Presentation-Space erzeugen
oPS := XbpPresSpace():new()
// Bedruckbarer Bereich auf dem Papier
aSize := oPrinter:paperSize()
aSize := { aSize[5] - aSize[3],aSize[6] - aSize[4] }
oPS:create( oPrinter, aSize, GRA_PU_LOMETRIC )
Danach kommt oPrinter:Startdoc() und was gedruckt wird.
Verfasst: Do, 13. Dez 2007 16:21
von Koverhage
Olaf,
hier der Code, ich habe das Problem ja bisher nur bei einem Kunden, bei allen anderen funktioniert das.
Code: Alles auswählen
FUNCTION WordFillANSHKA(cFile,cSaveAs,lPrint, lDruOrEdit,nCopies,lVorschau, nSchacht1, nSchacht2, nOrientation, cPrinter)
LOCAL oWord,oBM,oDoc, oDruckerSettings
local mess1 := LGTrans(('Cdb')->sprache,'0051001','Microsoft Word ist nicht installiert')
LOCAL mess1029 := LGTrans(('Cdb')->sprache,'0051029','nicht gefunden!')
LOCAL mess1030 := LGTrans(('Cdb')->sprache,'0051030','Datei:')
local lWordFinished := .f.
local i := 0
LOCAL nEvent := 0, mp1, mp2
LOCAL lBackground := .f.
LOCAL cOldPrinter
LOCAL nFirstTrayID := 0
LOCAL nOtherTrayID := 0
LOCAL nOldOrientation := 0
LOCAL cPathWord := cWin2Dos( DC_RegQuery(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Winword.exe", "") )
#if XPPVER > 01890000
default lDruOrEdit to .f.
default lPrint to .f.
default nCopies to 1
default lVorschau to .f.
default nSchacht1 to 0
default nSchacht2 to 0
default nOrientation to 0 // Portrait = Normal
if !Fexists(cFile)
msgbox(mess1030+" "+cFile+" "+mess1029)
return .f.
endif
i := Rat( ".",cFile)
if i < 1
cFile := cFile + ".doc"
endif
IF(ValType(cSaveAs)=="C")
i := Rat( ".",cSaveAs)
if i < 1
cSaveAs := cSaveAs + ".doc"
endif
ENDIF
// Erzeugen einer ActiveX-Komponente
oWord := CreateObject("Word.Application")
IF Empty( oWord )
oWord := CreateObject("opendocument.WriterDocument.1")
ENDIF
IF Empty( oWord )
MsgBox( mess1 )
Return .f.
ENDIF
if lDruOrEdit
oWord := oWord:dynamicCast(ActiveXObject())
oWord:Quit := {||lWordFinished := .T.}
oWord:Visible := .T.
lWordFinished := .F.
else
#ifndef WAD
oWord:Visible := .F.
oWord:DisplayAlerts := .F.
#endif
endif
// Oeffnen eines Word-Dokuments und Zugriff auf
// eine Sammlung von Lesezeichen
oWord:documents:open( cFile )
oDoc := oWord:ActiveDocument
oBM := oDoc:Bookmarks
oDruckerSettings := oDoc:PageSetup
// Ersetzen des Lesezeichens durch einen neuen
// Wert
// Kundendaten
ReplaceBookmark(oBM , "M_KDNR" , m_kdnr ) // Kundenummer
// Speichern des Ergebnisses
IF(ValType(cSaveAs)=="C")
oDoc:saveas(cSaveAs)
ENDIF
// Sichern der aktuellen Einstellungen
nFirstTrayID := oDruckerSettings:FirstPageTray
nOtherTrayID := oDruckerSettings:OtherPagesTray
nOldOrientation := oDruckerSettings:Orientation
// Setzen der gew
Verfasst: Do, 13. Dez 2007 16:23
von Koverhage
Rolf,
irgendwie verwechselt Du hier was
Es geht nicht um Xbase++ sondern Activex und Druck über Word
Verfasst: Do, 13. Dez 2007 16:29
von Koverhage
Hallo Hubert,
ein Drucker (Treiber) der das nicht unterstützt ?
Das kann doch jeder Drucker (sogar die "alten" Nadeldrucker)
Ja in Word direkt geht es.
Der Kunde hat so wie viele andere auch Word 2003.
Ob es da Unterschiede gibt, kann ich nicht sagen, aber was für eine Einstellung sollte das sein ?
Word über Activex aufrufen funktioniert ja, glaube nicht das man einzelne
Eigenschaften verbieten kann, aber dafür kenne ich mich zuwenig aus.
Verfasst: Do, 13. Dez 2007 16:30
von Rolf Ramacher
Hi Klaus,
doch das war mir schon klar. Also dann liegt es am Word oder am Druckertreiber-.
Verfasst: Do, 13. Dez 2007 17:10
von Lewi
Hi Klaus,
ich würde das Setzen von :Orientation nach dem Druck einfach weglassen.
Das Setzten von :Orientationen bezieht sich eh auf das aktuelle Dokument und nicht auf die generelle Drucker-Einstellung.
Um den Fehler als solches abzufangen, würde ich folgenden Code implementieren:
Code: Alles auswählen
#define wdPortrait 0
#define wdLandcape 1
if Valtype( nOldOrientation ) == "N"
IF (nOldOrientation == wdLandcape) .or. (nOldOrientation == wdPortrait)
oDruckerSettings:Orientation := nOldOrientation
endif
endif
....
Gruß, Olaf
Verfasst: Do, 13. Dez 2007 19:17
von Koverhage
Hi Olaf,
bis dahin kommt das Programm ja nicht.
Die aktuelle Einstellung wird gesichert (ok, könnte entfallen)
aber der Fehler tritt ja hier
oDruckerSettings:Orientation := nOrientation
auf.
Wie man in der errorlog sieht, enthält nOrientation den Wert 0
Gruss
Klaus
Verfasst: Do, 13. Dez 2007 19:37
von Lewi
Dann könnte die Fehlerursache in Zusammenhang mit dem
Code: Alles auswählen
oWord := CreateObject("Word.Application")
IF Empty( oWord )
oWord := CreateObject("opendocument.WriterDocument.1")
ENDIF
liegen. Falls also kein Ms-Word Automationsobject erzeugt wurde, wird versucht auf eine eine andere ActiveX-Komponente zuzugreifen. Und der könnte :Orientation unbekannt sein.
Gruß, Olaf
Verfasst: Fr, 14. Dez 2007 7:34
von Koverhage
Olaf,
ja das wäre die einzige Erklärung dafür. Werde das mal prüfen.