| |
|
|
Normann Strübli | Hallo,
ich habe gerade damit angefangen ein kleines Programm zu schreiben welches Meßwerte in ein vorgegebenes Protokoll schreiben soll. Da das protokoll etwas komplizierter Aussieht (mit tabellen, Grafiken, Fußnoten etc.) habe ich mich entschlossen das Protokoll in MS-Word (2002) zu erstellen anstatt es Aufwendig irgendwie mit Profan zu realisieren :roll: Um die einzelnen Strings und Werte nun an die richtige position im Dokument zu bekommen hat jedes Feld einen eindeutigen Namen -z.B: |1202. Die .doc-Datei wird nun mit Profan geöffnet und die Feldnamen mit den gewünschten Zeichenketten ersetzt - Voila! Klappt super Jetzt aber zum Problem:
Da das Prüfprotokoll ein wichtiges Dokument ist möchte ich es vor Änderungen/ Fälschung schützen. Die erste Maßnahme die die dafür getroffen habe ist die Checksumme der geänderten .doc Datei zu ermitteln und mit auszudrucken. So kann wenn nötig festgestellt werden ob etwas in dem Dokument geändert wurde. Allerdings bin ich mit der Lösung noch nicht ganz zufrieden. Ist es also möglich in Word direkt die Druckvorschau anzuzeigen - oder noch besser das Dokument auszudrucken ohne Word laden zu müssen? evtl. via kommandozeilen-parameter? Habe leider im Netz und in der Word- hilfe nix dazu gefunden - aber vielleicht weiß hier ja zufällig jmd. etwas darüber.
gruß Normann |
|
|
| |
|
|
|
| Aus genau diesem Grunde empfehle ich dir [...]
Dort machst Du Deine Vorlagen im Format .sdc - und eine shellexec print anweisung läßt das OOffice Drucken wie ein Baby - ohne lästige Nachfragen.
Suche mal hier in der Community nach binprint - glaube ich hatte schonmal ne Inc gebastelt dafür welche ich selbst Nutze um verschiedene Clients übers Netzwerk drucken lassen zu können - und alles im Nachhinein auch noch Nachvollziebar bleibt.
Salve, iF |
|
|
| |
|
|
|
Normann Strübli | danke iF für die schnelle Antwort - werd mich mal wohl mal mit OpenOffice beschäftigen müssen aber mit Word werd ich trotzdem weitertüfteln. Von wem war nochmal die Vorlage ein fremdes Programm im eigenen Profanfenster auszuführen- sozusagen einzufangen. Kann mich nur noch sehr dunkel daran erinnern... Nebenbei find ich es toll wie Du die Community wieder aufgebaut hast, man fühlt sich schon wieder ganz wie Zuhause |
|
|
| |
|
|
|
Jörg Sellmeyer | Hallo Normann, Eigentlich müßtest Du mit ShellExec(Document.doc,Print,0) Word unsichtbar starten können um das Dokument direkt auszudrucken. Gruß Jörg |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 26.01.2005 ▲ |
|
|
|
|
| @Norman: Danke
@Jörg: leider geht es so mit word nicht - da sonst vielleicht sogar der PrinterDialog nicht angezeigt würde.
Das Problem mit word ist halt einfach das vor dem Ausdruck ein PrinterDialog kommt - bei OO ist dies halt nicht der Fall. Und da viele Firmen eine Lizensverwaltung eingeführt haben - ist man mit OO auf der sicheren Seite.
Salve, iF |
|
|
| |
|
|
|
Normann Strübli | Der Vorschlag von Jörg ist funktioniert aber -wenn Word auch nicht unsichtbar gestartet wird, so wird das Dokument an den Drucker gesandt und Word anschließend wieder geschlossen. Abgesehen davon muß ich es zumindest für Word noch besser lösen - falls man mal nicht mit dem Standarddrucker drucken will - mal gucken.
gruß Normann |
|
|
| |
|
|
|
| Ach echt? Lol ich hatte es mit OfficeXP probiert und da kam immer der lästige PrinterDLG. Sag doch - welche Word-Version nutzt Du?
Salve, iF |
|
|
| |
|
|
|
Jörg Sellmeyer | Hallo Normann, Von Sebastian König gibts eine OleFile.prf. Sieht ziemlich klompiziert aus, abervielleicht kannst Du was damit anfangen. KompilierenMarkierenSeparieren+-----------------------------------------------------------------------+
| olefile.prf - Dateien öffnen und schließen mit OLE |
| Autor: Sebastian König |
| email: feedback@sekoenig.de |
| Homepage: http://www.sekoenig.de |
| Copyright ©2001 Sebastian König |
| |
| Dieser Quellcode zeigt, wie man mit OLE und Profan² ein Word-Dokument |
| zum Bearbeiten öffnet. |
| |
| |
| WICHTIG: Dieser Quellcode funktioniert erst ab Profan 7.0 und setzt |
| voraus, dass Microsoft® Word installiert ist. |
| |
| TIP(P): Diese Methode funktioniert nicht nur mit Word-Dokumenten. |
| Wenn man die Dateimaske zum Beispiel in *.bmp ändert, wird |
| automatisch Paint (oder ein anderes Zeichenprogramm) |
| geöffnet. |
| |
+-----------------------------------------------------------------------+
---Prozeduren
proc Release
parameters obj&
declare vptr&
let vptr& = @long(obj&,0)
return Call(@long(vptr&,8),obj&)
endproc
+++
---Benötigte (COM/OLE)-API-Funktionen:
DEF OleInitialize(1) !"OLE32","OleInitialize"
DEF OleUninitialize(0) !"OLE32","OleUninitialize"
DEF IIDFromString(2) !"OLE32","IIDFromString"
DEF CoTaskMemAlloc(1) !"OLE32","CoTaskMemAlloc"
DEF CoTaskMemFree(1) !"OLE32","CoTaskMemFree"
DEF CreateILockBytesOnHGlobal(3) !"OLE32","CreateILockBytesOnHGlobal"
DEF StgCreateDocfileOnILockBytes(4) !"OLE32","StgCreateDocfileOnILockBytes"
DEF OleCreateFromFile(8) !"OLE32","OleCreateFromFile"
DEF MultiByteToWideChar(6) !"KERNEL32","MultiByteToWideChar"
DEF Sleep(1) !"KERNEL32","Sleep"
---Variablen deklarieren:
declare ILockBytes&,IStorage&,IOleClientSite&,IRichEditOle&,MSWord&,IUnknown&
declare vp_MSWord&,vp_RTFOle&
declare CLSID_MSWord&,IID_IOleObject&,IID_IOleClientSite&,IID_IUnknown&
declare clsid$,iid$,olestr&
declare file$,file&
declare FORMATETC#,RECT#,MSG#
declare count&
---Speicher allokieren:
let ILockBytes& = CoTaskMemAlloc(4)
let IStorage& = CoTaskMemAlloc(4)
let MSWord& = CoTaskMemAlloc(4)
let IID_IOleObject& = CoTaskMemAlloc(16)
let olestr& = CoTaskMemAlloc(256)
let file& = CoTaskMemAlloc(1024)
dim FORMATETC#,20
---Neues Fenster erstellen:
windowtitle "OLE mit Profan²"
window 100,100-640,480
---OLE initialisieren:
print "OleInitialize:",OleInitialize(0),"
"
---Storage-Objekt erstellen:
print "CreateILockBytesOnHGlobal:",CreateILockBytesOnHGlobal(0,1,Addr(ILockBytes&)),"
"
print "StgCreateDocfileOnILockBytes:",StgCreateDocfileOnILockBytes(ILockBytes&,$1012,0,Addr(IStorage&)),"
"
---MSWord-Objekt erstellen:
--IID für IOleObject aus String bilden:
let iid$ = "{00000112-0000-0000-C000-000000000046}"
MultiByteToWideChar(0,0,Addr(iid$),Len(iid$),olestr&,261),"
"
print "IIDFromString:",IIDFromString(olestr&,IID_IOleObject&),"
"
--Datei wählen
let file$ = LoadFile$("Word-Dokumente","*.doc")
MultiByteToWideChar(0,0,Addr(file$),Len(file$),file&,261),"
"
--FORMATETC# füllen...
long FORMATETC#,0 = 0
long FORMATETC#,4 = 0
long FORMATETC#,8 = 1 DVASPECT_CONTENT
long FORMATETC#,12 = 0
long FORMATETC#,16 = 0 TYMED_NULL
--Objekt erstellen:
print "OleCreateFromFile:",OleCreateFromFile(0,file&,IID_IOleObject&,0,FORMATETC#,0,IStorage&,Addr(MSWord&)),"
"
--vptr ermitteln:
let vp_MSWord& = @long(MSWord&,0)
MessageBox("Die Datei wird nun geöffnet und in ca. 5 Sekunden
automatisch wieder geschlossen.","Meldung",64)
---Objekt zum Bearbeiten öffnen:
print "MSWord&->DoVerb:",Call(@long(vp_MSWord&,44),MSWord&,-1,0,0,0,%hwnd,0)
---5 Sekunden warten, ohne den Prozess zu blockieren:
let count& = @add(&GetTickCount,5000)
while @lt(&GetTickCount,count&)
Sleep(0)
wend
---Objekt wieder schließen:
print "MSWord&->Close:",Call(@long(vp_MSWord&,24),MSWord&,0)
print " "
print "> Taste oder Mausklick zum Beenden! <"
waitinput
---Aufräumarbeiten:
Release MSWord&
Release IStorage&
Release ILockBytes&
CoTaskMemFree(ILockBytes&)
CoTaskMemFree(IStorage&)
CoTaskMemFree(MSWord&)
CoTaskMemFree(CLSID_MSWord&)
CoTaskMemFree(IID_IOleObject&)
CoTaskMemFree(olestr&)
dispose FORMATETC#
OleUninitialize()
---Ende:
end
Gruß Jörg |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 28.01.2005 ▲ |
|
|
|
|
Normann Strübli | [quote:efc5161f7d]welche Word-Version nutzt Du?[/quote:efc5161f7d] hab gar kein Word Kann das nur im Büro testen und da ist office Xp installiert, hmm...
Das Beispiel von Sebastian muß ich erst noch aufarbeiten -oder besser gesagt verstehen, stürzt auch leider mit einer Exeption EAccessVioaltion ab. |
|
|
| |
|
|
|
CB | Hi, Normann!
Meintest Du folgenden Link?
[...]
Ich bin mir nicht ganz sicher, ob es das ist, was Du erreichen willst, aber vielleicht hilft Dir folgendes weiter:
Ich habe Dir ein kleines Word-Makro gebastelt (Ver 97, lauffähig müßte es auf jeden Fall sein bis incl. Word XP - höher hab ich nicht ) Was diesem Makro noch fehlt, ist die Abfrage, ob der Ausdruck schon fertig ist, weil sich Word sonst möglicherweise beschwert, daß es beendet werden soll, wos doch mit dem Drucken noch nicht fertig ist!
NewMakros.txt umbenennen in *.bas. VisualBasic-Editor öffnen - Datei importieren - Link zur .bas - Editor verlassen - speichern (nicht vergessen!) - testen mit irgendeinem doc. Nächster Schritt: Du erstellst Dir eine Vorlage (SinnvollerName.dot) und stellst dieses Makro dorthinein (Makros - organisieren - kopieren)
Nach dem Schema aus meinem Link kannst Du dann aus Deinem Profan-Programm heraus Word starten - einen Makro automatisch ausführen lassen (DruckenStdBeenden) und Word wird automatisch wieder geschlossen (Application.Quit machts möglich). Noch ein Tip: (nicht ausprobiert): WinExec(Wait) kannst Du als Parameter den Abbildungsmodus übergeben - vielleicht druckt Word auch minimiert (Modus 2)?
Es gibt noch eine Möglichkeit: schau mal unter den Units im Forum nach: Michael Dell hat da eine Deco.inc veröffentlicht zum Codieren und Decodieren - vielleicht kannst Dus brauchen (bevor Du was an Word schickst..).
Solltest Du Probleme haben mit meinem Beispielcode - ich bin (fast) jeden Tag online...
Christian |
|
|
| |
|
|