XbpRtf

Von Ausgaben mit der Gra-Engine über Generatoren bis zum Export in diversen Formaten

Moderator: Moderatoren

Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

XbpRtf

Beitrag von Rolf Ramacher »

Hallo,


die Klassenfunktion xbprtf habe ich noch nicht ganz verstanden. Kann ich damit eine bestehende Datei im Format RTF zum Drucken bringen?
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: XbpRtf

Beitrag von AUGE_OHR »

hi,
Rolf Ramacher hat geschrieben: die Klassenfunktion xbprtf habe ich noch nicht ganz verstanden. Kann ich damit eine bestehende Datei im Format RTF zum Drucken bringen?
schau dir einfach den Source der RTF Class an :

D:\ALASKA\XPPW32\SOURCE\SYS\axctrls.prg

dort findest du dan die Methode ::print()

gruss by OHR
Jimmy
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Beitrag von UliTs »

Hallo Rolf,

ich habe mich Wochen mit XbpRtf() herumgeschlagen.
Das Drucken ist noch nicht völlig fehlerfrei von Alaska realisiert worden.
Wenn Du einfach einen Rtf-Text auf eine Seite (und sonst nichts) drucken möchtest, klappt es wahrscheinlich.

Anderenfalls (Integration in die Preview, mischen mit anderen Textteilen, Grafiken, etc) klappt es ohne externe Hlfe (noch) nicht.

Falls Du weitere Hilfe brauchst, melde Dich bitte nochmals.

Uli
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

Hallo Jimmy,

die Datei habe ich mir angesehen. Welche Methode oder Function soll das sein? Dort gibt es mehrere wenn ich das richtig gesehen habe.

Folgendes zur Problematik: Ich habe eine RTF-Datei als Vorlage, bei denen unsere User diese verändern können. z.b. andere Positionen Schrftart, Größe. Ist auch so gewollt, da verschiedene Anwender bei verschiedenen Punkten dies als Fett wollte oder größer - wie auch immer.

Diese Datei lade ich rein ins Programm ersetze die Platzhalter und speichere diese Datei wieder als RTF- ab. Kann ich dann diese Datei
mit xbprtf ausdrucken ? Geht dies auch mit xbpPrintDialog()

@Uli wie hast du dieses denn gelöst ?
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hallo Rolf,
warum löst Du nicht das ganze unter ActiveX? Wenn die Anwender eh schon das Dokument bearbeiten wollen, warum nicht gleich mit WORD?

Hier im Forum gibt es Beispiele für WORD und ActiveX.

Gruß, Olaf
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

Hallo zusammen,

ich muß das Thema nochmal aufgreifen. Folgende Situation habe ich:

Es gibt eine RTF-Datei als Vorlage in welcher der User Änderungen wie Schriftart/größe ect. ändern soll. Soweit OK

Das Ergebnis darf aber nicht mehr zu verändern sein. Wenn ich dies mit Word starte, kann ich zwar mit Fattr die RTF-Dateien hidden, read only machen aber die Datei kann trotzdem verändert werden.
Oder gibt es hierzu einen befehl um die Bearbeitung in Word sperren zu können??

Oder kann ich die mit memowrit erstellte rtf-Datei zum Drucker schicken?
Macht das xbprtf() ?? Muß dieses Tool seperat installiert werden? die richtx32.ocx habe ich auf meinem Rechner gar nicht.

Oder kann ich Word starten- das Dokument zum Drucken zwingen und word wieder schliessen ??

Aber nicht zum Standarddrucker automatisch senden.
Auf jedenfall muß der Druck zu xbpprintdialog, da der User den Drucker
auswählen soll.

Weiß jemand hierzu eine funktionierende Lösung??
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

wenn du irgend ein Programm installiert hast, das eine RTF Datei sauber drucken kann, dann sollte die runshell Lösung hier http://www.xbaseforum.de/viewtopic.php? ... t=runshell hilfreich sein. Allerdings weiß ich nicht, ob das Programm danach geschlossen wird.

Unveränderbare Endversionen, sollte man aber nicht als Textdokument eines Textverarbeitungsprogrammes speichern.

1. sind die immer irgendwie wieder zu ändern.
2. wer weiß ob in 6 Jahren dieses Format noch gelesen werden kann.

hier sollte man einen PDF Druckertreiber oder einen TIFF Druckertreiber nutzen um auf dauer lesbare Dokumente zu erhalten. Einige dieser Treiber können auch ohne Eingriffe direkt speichern.

Bei meinem MS-Office ist eine Image-Schnittstelle enthalten, habe dieses aber noch nicht probiert, da ich Acrobat und den eDOCPrinter habe.
Zuletzt geändert von brandelh am Do, 26. Apr 2007 9:44, insgesamt 1-mal geändert.
Gruß
Hubert
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hallo Rolf,
wenn es um den Druck des Dokumentes wird Word geht, dann versuche es mit folgende Routine:

Code: Alles auswählen

Func Print( cDoc, cDrucker)
Local cActivePrinter
Local oWord
Local oDoc

    oWord := CreateObject("Word.Application")

   IF Empty( oWord )
     MsgBox( "Microsoft Word ist nicht installiert" )
     RETURN
   ENDIF

   oWord:visible   := .F.                               // Word unsichtbar!
   cActivePrinter  := oWord:Activeprinter     // aktuellen Drucker feststellen
   oWord:Activeprinter:= cDrucker               // Neuen Drucker setzen
   oWord:documents:Open(cDoc)                 
   oDoc       := oWord:ActiveDocument
   oDoc:PrintOut(.T.)                                  // .T.= Druck im Hintergrund
   oWord:Activeprinter:= cActivePrinter       // alten Drucker setzen
   oDoc:close()
   oWord:Quit()
   oWord:destroy()
   oWord := NIL
Return ( NIL )

Viele Grüße
Olaf
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

Hi Olaf,

danke für deinen Hinweis. Ich werde dies mal ausprobieren. hierzu habe ich nochmal eine Rückfrage.

cDoc muß dies ein DOC-Dokument sein?
cDrucker ist dies der Name des Druckers?
läßt sich dieses evtl. mit xbpprintDialog kombinieren ?
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hallo Rolf,
ob DOC oder RTF ist in diesem Fall nicht relevant.

Über die xbbPrinterDialog-Klasse könnte der Anwender einen Drucker auswählen. Den ausgewählten Druckernamen übergibst Du dann der Word-Druck-Funktion.

cDrucker entspricht dem Namen des Druckers.

Viele Grüße,
Olaf
Sören
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 205
Registriert: Mo, 07. Aug 2006 10:18
Wohnort: Leipzig
Danksagung erhalten: 11 Mal

Beitrag von Sören »

Hallo Olaf,

danke für Deinen Code. Ist auch für mich interessant.

Beim Ausprobieren bin ich auf ein kleines Problem gestoßen, und zwar erscheint bei jedem Druck folgende Meldung:

"Word druckt gerade. Wenn Sie Word jetzt beenden, werden alle anstehenden Druckaufträge gelöscht!"

Word wird also per ActiveX gestartet, der Druck wird abgesetzt und Word wird wieder beendet, jedoch bevor alle Daten zum Drucker übertragen wurden.

Gibt es eine Möglichkeit abzufragen, ob der Druck noch aktiv ist, und Word erst dann zu beenden, wenn alle Daten wirklich übertragen wurden?

Und noch eine Frage: Kann man die Anzahl der zu druckenden Exemplare über das ActiveX-Object einstellen?

Tschüs,
Sören
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hi Sören,
das Problem mit dem Rückfrage nach dem Druckabbruch hatte ich noch nie.

Überprüfe doch mal über die Druckeigenschaften des Druckes die Einstellung, "Über Spooler drucken, um Durckaufträge schneller abzuschließen". Diese Option sollte aktiviert sein.

Falls diese Option bereits aktiviert ist, dann setzte vor oWord:Quit() ein Sleep( nWert) und gehe in den Wartezustand. Die Druckwarteschlange kann meines Wissen selbst nur über das API abgefragt werden.

Was die Anzahl der Kopien betrifft, werde ich mal nachschauen. Folgt später....
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Sören,
Word druckt noch ...
ich hatte ein ähnliches Problem vor ActiveX als ich ein Textprogramm per Runshell (nicht Word) startete. Damals habe ich den Hintergrunddruck abgeschaltet, dann hat der Prozess gewartet bis der Druck zu Ende war bevor das Programm geschlossen wurde. Somit versuche mal diese Zeile zu ersetzen, obs dann besser wird.

Code: Alles auswählen

oDoc:PrintOut(.T.)  ->  oDoc:PrintOut(.F.) 
Wirklich ein klasse Beispiel.
Ich frag mich immer woher die Leute die Infos über die Methoden nehmen ;-)
Ich habe mir damals einen mit dem Macrorecorder und VBA abgebrochen bis es lief.
Gruß
Hubert
Sören
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 205
Registriert: Mo, 07. Aug 2006 10:18
Wohnort: Leipzig
Danksagung erhalten: 11 Mal

Beitrag von Sören »

Hallo Hubert,
ich hatte ein ähnliches Problem vor ActiveX als ich ein Textprogramm per Runshell (nicht Word) startete. Damals habe ich den Hintergrunddruck abgeschaltet, dann hat der Prozess gewartet bis der Druck zu Ende war bevor das Programm geschlossen wurde. Somit versuche mal diese Zeile zu ersetzen, obs dann besser wird.

Code:
oDoc:PrintOut(.T.) -> oDoc:PrintOut(.F.)
Genau das war's!

Danke,
Sören
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Parameter für die Methode :PrintOut()

Code: Alles auswählen

#DEFINE W_BACKGROUND			 1
#DEFINE W_APPEND		  		2
#DEFINE W_RANGE					3
#DEFINE W_OUTFILENAME			4
#DEFINE W_FROM			  	     5
#DEFINE W_TO				       6
#DEFINE W_ITEM				      7
#DEFINE W_COPIES			    8
#DEFINE W_PAGES				    9
#DEFINE W_PAGETYPE			10
#DEFINE W_PRINTTOFILE		       11
#DEFINE W_ACTIVEPRINTERMACGM  12
#DEFINE W_MANUELDUPLEXPRINT     13
#DEFINE W_PRINTZOOMCOLUMN	14
#DEFINE W_PRINTZOOMROW		  15
#DEFINE W_PRINTZOOMPAPERWITDH 16
#DEFINE W_PRINTZOOMPAPERHIGHT 17


// Beispiel
Print( cDoc, cPrinter, nCopy)

Local aPrintOptions  := Array(17)

	aPrintOptions[W_BACKGROUND] 	:= .T.
	aPrintOptions[W_COPIES] 	:= nCopy

// usw

:oDoc:PrintOut( ;
	aPrintOptions[W_BACKGROUND]	,;
	aPrintOptions[W_APPEND] 		,;		
	aPrintOptions[W_RANGE]			,;
	aPrintOptions[W_OUTFILENAME]	,;
	aPrintOptions[W_FROM]			,;
	aPrintOptions[W_TO]				,;
	aPrintOptions[W_ITEM]			,;
	aPrintOptions[W_COPIES]			,;
	aPrintOptions[W_PAGES]			,;
	aPrintOptions[W_PAGETYPE]		,;
	aPrintOptions[W_PRINTTOFILE]	,;	
	aPrintOptions[W_ACTIVEPRINTERMACGM]	,;
	aPrintOptions[W_MANUELDUPLEXPRINT]	,;
	aPrintOptions[W_PRINTZOOMCOLUMN]		,;
	aPrintOptions[W_PRINTZOOMROW]			,;
	aPrintOptions[W_PRINTZOOMPAPERWITDH ]	,;
	aPrintOptions[W_PRINTZOOMPAPERHIGHT] )
Über diesen Weg lassen sich bequem die einzelnen Optionen setzen.

Viele Grüße,
Olaf
Zuletzt geändert von Lewi am Fr, 27. Apr 2007 15:40, insgesamt 1-mal geändert.
Sören
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 205
Registriert: Mo, 07. Aug 2006 10:18
Wohnort: Leipzig
Danksagung erhalten: 11 Mal

Beitrag von Sören »

Toll!

Danke Olaf!

Tschüs,
Sören
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hi Hubert,
Ich frag mich immer woher die Leute die Infos über die Methoden nehmen
Auf alle Fälle ist ein Oject-Viewer erforderlich. Der Rest besteht in der Kunst des "Findens" und des "Lesens" ;-)

Viele Grüße
Olaf
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Olaf,

müsste es nicht so heißen ?

Code: Alles auswählen

oDoc:PrintOut( aPrintOptions  ) 
woher nimmst du nur diese Infos ?
Liegen diese Beschreibungen Word bei oder muss man das bei MS kaufen ?
Gruß
Hubert
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hi Hubert,
oDoc:PrintOut( aPrintOptions )
Nein, es darf kein Array übergeben werden, sondern nur kommaseparierte Array-Werte. Die Reihenfolge ergibt sich aus den Word Methoden-Parametern.
Liegen diese Beschreibungen Word bei oder muss man das bei MS kaufen ?
Von MS habe ich nichts. Einen guten Einstieg bietet sicherlich das Studium von Makros. Der Rest sind "Erfahrungen" und jede Menge "Try and Errors" ;-)

Gruß, Olaf
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Lewi hat geschrieben:Auf alle Fälle ist ein Oject-Viewer erforderlich.
Jetzt wo du es sagst, bei meinem PowerBasic Compiler ist ein 'COM Browser' enthalten. Im Beispiel steht was von 'Microsoft Word 8.0 Object Library' und damit kann man den PowerBasic Code generieren. VO soll später auch sowas bekommen haben.

Was benützt du ?

Kann der Xbase++ Code generieren ?

Ob VX da was mitbringen wird ? :?
Gruß
Hubert
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

Hallo Olaf,

ich bekomme eine Fehlermeldung beim oWord:documents:Open(cDoc)

die Zeichenfolge ist länger als 255 Zeichen.

wie gesagt : Die VorlageDatei wird in die Variable mit memoread cRTF geladen Kopfzeile mit strtran ersetzt und mit memowrit wieder geschrieben.

Die Daten habe ich jetzt erstmal weggelassen. also komplett mit Daten
aufruf word mit runshell - wäre kein Problem.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hallo Hubert,
Object-Vieer: Was benützt du ?
Ich nutze den "Com Assistent"

http://www.devcomponents.com/comassistant/download.html

Dieser kann eine CHM-Hilfe mit allen Objecten und Methoden einer COM-Komponente erzeugen.

Gruß, Olaf
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

ich bekomme eine Fehlermeldung beim oWord:documents:Open(cDoc)

die Zeichenfolge ist länger als 255 Zeichen.
Ich würde das entsprechende Verzeichnis "mappen" und einem Laufwerksbuchstaben zuordnen. Da gibt es nicht das Problem mit den Anzahl der Zeichen.

Mit Runshell() kann Du allerdings nicht einzelne Druckparameter setzen.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Rolf Ramacher hat geschrieben:Hallo Olaf,

ich bekomme eine Fehlermeldung beim oWord:documents:Open(cDoc)

die Zeichenfolge ist länger als 255 Zeichen.
Du hast einen Dateinamen mit Pfad über 255 Zeichen ?

Das geht normalerweise nicht.
Bist du sicher, dass du den Pfad und nicht den Inhalt der Datei in cDOC übergibst ?
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14655
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hubert,

warum nicht? Inkl. Pfadangabe kann das schon passieren.

Jan
Antworten