Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Vorgang nicht verfügbar bei Word Doc öffnen (https://www.delphipraxis.net/120283-vorgang-nicht-verfuegbar-bei-word-doc-oeffnen.html)

Overclocker 8. Sep 2008 16:53


Vorgang nicht verfügbar bei Word Doc öffnen
 
Hi,

folgender Code verursacht bei mir einen Fehler:
Delphi-Quellcode:
sql1 := 'select * from `Profil`';
         sql2 := 'where id_user in ('+userids+')'; //userids ist eine stringlist mit lauter IDs


         dbquelle := ExtractFilePath (ParamStr(0))+'Bewerbermanagement.mdb';

         dm.brief_oeffnen(strtoint(DBGrid1.DataSource.DataSet.Fields.Fields[0].AsString)); //hier öffne ich den brief mit einer bestimmten ID

// hier der code von "brief_oeffnen"

procedure Tdm.brief_oeffnen(id_vorlage:integer);
var
pfad:string;

begin
with varqry4 do
        begin
        close;
        sql.clear;
        sql.text := 'select pfad from vorlagen where id_vorlage='+inttostr(id_vorlage);
        open;
        pfad := datasource4.dataset.fieldbyname('vorlagenpfad').asstring;

        ShellExecute(application.handle, 'open', PChar(pfad), '', Pchar(ExtractFileDir(pfad)), SW_SHOW);
        end;
end;
//
         Word:=GetActiveOleObject('Word.Application');

         //Dokument als normales Dokument einrichten, Serienbrieffunktion sozusagen entfernen

         Word.ActiveDocument.MailMerge.MainDocumentType:= wdNotAMergeDocument;
         
         //Dokument wieder als Serienbrief einrichten
         Word.ActiveDocument.MailMerge.MainDocumentType:= wdFormLetters;



         Word.ActiveDocument.MailMerge.OpenDataSource(dbquelle,
         ConfirmConversions :=False, ReadOnly:=False, LinkToSource:=True,
         AddToRecentFiles:=False, PasswordDocument:='', PasswordTemplate:='',
         WritePasswordDocument:='', WritePasswordTemplate:='', Revert:=False,
         Format:=wdOpenFormatAuto, Connection:=
         'Provider=Microsoft.Jet.OLEDB.4.0;Password='''';User ID=Admin;Data Source='+dbquelle+';Mode=Read;Extended Properties='''';Jet OLEDB:System database='''';Jet OLEDB:Registry Path='''';Jet OLEDB:Database Password='''
         , SQLStatement:=SQL1, SQLStatement1:=SQL2);
         word.ActiveDocument.MailMerge.ViewMailMergeFieldCodes := wdToggle;

Problem jetzt: immer wenn ich den brief öffne kommt ein fehler bei
Delphi-Quellcode:
Word.ActiveDocument.MailMerge.MainDocumentType:= wdNotAMergeDocument;
//vorgang nicht verfügbar

wieso nimmt er denn
Delphi-Quellcode:
Word:=GetActiveOleObject('Word.Application');
nicht an und macht aus dem brief ein normalen brief...

ich komme nicht weiter :(


bei word 2002 funktioniert der code soweit, bei word 2003 kommt der fehler ://

danke für die hilfe

Chemiker 8. Sep 2008 17:42

Re: Vorgang nicht verfügbar bei Word Doc öffnen
 
Hallo Overclock,

Delphi-Quellcode:
Word:=GetActiveOleObject('Word.Application');
Ich bin jetzt nicht ein MSWord-Spezialist, aber mit dieser Anweisung wird keine Instanc von MSWord erstellt, sondern eine Verbindung zu einer geöffneten MSWord-Instanc hergestellt.
Wenn Du eine MSWord-Instanc öffnen will’s, so geht das mit:

Delphi-Quellcode:
Word:= CreateOleObject('Word.Application');
Außerdem kann es beim Ausprobieren dazukommen dass schon eine Instanc offen ist, man sie aber nur im Taskmanger sieht.

Zum Testen sollte man die MSWord-Instanc sichtbar machen.

Delphi-Quellcode:
Word.Visible:= TRUE;
Es reicht nicht aus mit:

Delphi-Quellcode:
Word.Quit;
Word zu Schließen, sondern mal sollte auch die Verbindung kappen

Delphi-Quellcode:
Word:= Unassigned;
Bis bald Chemiker

Overclocker 8. Sep 2008 17:44

Re: Vorgang nicht verfügbar bei Word Doc öffnen
 
hi, das mit geoleobject hast du natürlich recht ;)

aber wenn du dir mal die procedure ansiehst, dann wird hier VORHER ein word dokument via shellexecute geöffnet, d. h. es MUSS eine wordinstanz bereits offen sein und ist es auch trotzdem danke für den hinweis.

nur wieso funktioniert das mit word2002 und mit word 2003 nicht :gruebel:

gibt es schon units für word 2003 oder ähnliches (in meiner ist ja noch word 2000 mit drinnen, aber müsste doch kompatibel sein oder?)

toms 8. Sep 2008 17:51

Re: Vorgang nicht verfügbar bei Word Doc öffnen
 
Zitat:

Zitat von Overclocker
aber wenn du dir mal die procedure ansiehst, dann wird hier VORHER ein word dokument via shellexecute geöffnet, d. h. es MUSS eine wordinstanz bereits offen sein und ist es auch trotzdem danke für den hinweis.

Hallo, warum dann nicht gleich CreateOleObject() verwenden?

Keldorn 8. Sep 2008 17:52

Re: Vorgang nicht verfügbar bei Word Doc öffnen
 
Hallo,

gugg mal hier:
http://support.microsoft.com/default...b;en-us;825765

bzw probier mal, was passiert, wenn du ein Serienbriefdokument per Hand in Word öffnest, ob du dort eine Fehlerausschrift bekommst.

Gruß Frank

Chemiker 8. Sep 2008 17:54

Re: Vorgang nicht verfügbar bei Word Doc öffnen
 
Hallo Overclock,

dann Teste mal ob eine MSWord-Instans offen ist.

Delphi-Quellcode:
function TOLEObj.OleObjAktive(strApplicationsName: String): boolean;
var
  ClassID: TCLSID;
  Unknown: IUnknown;
begin
  try
    ClassID := ProgIDToClassID(strApplicationsName);
    Result := GetActiveObject(ClassID, nil, Unknown) = S_OK;
  except
    Result := False;
  end;
end;
Delphi-Quellcode:
If OleObjAktive('Word.Application') then
  ShowMessage('Alles Klar')
else
 ShowMessage('Nicht offen')

Word:=GetActiveOleObject('Word.Application');
Bis bald Chemiker

Overclocker 8. Sep 2008 19:30

Re: Vorgang nicht verfügbar bei Word Doc öffnen
 
@toms: wozu createoleobject? ich öffne ja einfach einen serienbrief/normalen brief, sollte egal sein --> somit istauch eine word instanz offen, und mit shellexecute geht das ja ruck zuck mit 1 befehl

@Keldorn: die meldung kenne ich. wenn ich das dokument öffne klicke ich auch auf nein damit es sozusagen ein serienbrief "ohne" datenquelle ist. falls es aber manchmal vorkommt, dass die serienquelle trotzdem mit dran hängt, möchte ich einfach mit dem befehl den brief als "normalen brief" einstellen und dann sozuasgen im anschluss wieder einen serienbrief mit MEINER datenquelle machen

@Chemiker: werde ich morgen dann mal testen weil ich hier nur ein word 2002 drauf habe, aber danke.

so wie ich es bis jetzt rausgelesen habe liegt es also nicht an der kompatibilität mit word (nutze delphi 6 mit uses win2000);

danke für die hilfe schonmal

Overclocker 9. Sep 2008 17:51

Re: Vorgang nicht verfügbar bei Word Doc öffnen
 
Hi zusammen,

also habe mal den code von chemiker ausprobiert und es kam folgendes dabei raus:

NEIN, es ist keine Instanz offen (warum auch immer?) --> Also Message "Nicht offen"


Jetzt das Komische: Ich habe bei der IF Abfrage beide Messages geändert auf: "Brief wird nun geöffnet und kann bearbeitet und gedruckt werden"

Jetzt öffnet der einen Brief, gibt anstatt "Nicht offen" meine neue Message zurück und auf einmal funktioniert der brief??

Lasse ich beide showmessage befehle weg, kommt der fehler wieder????

also erst mal bin ich froh dass es jetzt funktioniert, allerdings möchte ich nun gerne wissen wieso das so ist

jemand ne idee?

toms 10. Sep 2008 19:25

Re: Vorgang nicht verfügbar bei Word Doc öffnen
 
Zitat:

Zitat von Overclocker
@toms: wozu createoleobject? ich öffne ja einfach einen serienbrief/normalen brief, sollte egal sein --> somit istauch eine word instanz offen, und mit shellexecute geht das ja ruck zuck mit 1 befehl

Wenn du ShellExecute ausführst und gleich danach GetActiveOleObject aufrufst kann ja Word noch nicht gestartet sein.
Das Problem ist dann - in deinen Worten - dass es zu "ruck zuck" ist.

Darum ziehe ich ein Öffnen per CreateOleObject vor.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz