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 :orientation 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.