2015-02-22 3 views
0

Я действительно надеюсь, что вы можете мне помочь с этим. Это заняло 2 дня. Я попытался отладить, выполнив выполнение в модуле System.variants, но не вижу решения.Delphi XE7 с использованием EmptyParam для открытия Word2010 документа через OLE Auto

Я пытаюсь заставить Delphi XE7 открыть файл .doc в Word 2010 через OLE Automation.

Я установил 16 параметров, готовых для функции Open(), которая указана в файле Word2010.pas (получена из библиотеки типов MSWORD.OLB и поставляется с Delphi XE7 под .. \ OCX \ Servers), затем вызывается он и получить исключение EVariantBadVarTypeError с сообщением: «Недопустимый тип варианта».

Я внимательно следил за спецификацией параметров (я думаю) и не могу понять, что не так.

Word2010.pas имеет линию в преамбуле: // SYS_KIND: SYS_WIN32 с указанием (я думаю), что это устройство для 32-разрядной случае, так что я компиляции под 32-битной Win цели.

Вот фрагмент кода: -

`... 
uses 
Word2010, 
Vcl.OleServer, 
System.Win.ComObj, 
Winapi.OLE2, 
System.variants, 
Winapi.ActiveX 
... 

procedure TDocPDF.ExOpenDocument(sDocFile :string); 
var 
    WordApp : _ApplicationDisp; 
    DocumentTemplate : _DocumentDisp; 
    DocsCollection : DocumentsDisp; 
    vTemplate : OleVariant; 
    vVisible : OleVariant; 
    vOpenFormat : OleVariant; 
    vConfirmConversions, 
    vReadOnly , 
    vAddToRecentFiles, 
    vPasswordDocument, 
    vPasswordTemplate, 
    vRevert, 
    vWritePasswordDocument, 
    vWritePasswordTemplate , 
    vEncoding : OleVariant; 
    vOpenAndRepair : OleVariant; 
    vDocumentDirection : OleVariant; 
    vNoEncodingDialogue : OleVariant; 
    vXMLTransform : OleVariant; 

begin 
// load a copy of Word 2010: 
CoInitialize(nil); 
WordApp := (CoWordApplication.Create as _ApplicationDisp); 
WordApp.Visible := bVisible; 
DocsCollection := WordApp.Documents as DocumentsDisp; 

// set up the parameters for the .Open command: 
vTemplate := sDocFile ; 
vVisible := False; 
vConfirmConversions:=false; 
vReadOnly :=False; 
vAddToRecentFiles:=False; 
vPasswordDocument:=EmptyParam; 
vPasswordTemplate :=EmptyParam; 
vRevert:=False; 
vWritePasswordDocument:=EmptyParam; 
vWritePasswordTemplate:=EmptyParam; 
vOpenFormat:=wdOpenFormatAuto; 
vEncoding:=EmptyParam; 
vOpenAndRepair:=EmptyParam; 
vNoEncodingDialogue:=EmptyParam; 
vDocumentDirection:=EmptyParam; 
vXMLTransform:=EmptyParam; 

try 
    DocumentTemplate := DocsCollection.Open(vTemplate, 
     vConfirmConversions, 
     vReadOnly, 
     vAddToRecentFiles, 
     vPasswordDocument, 
     vPasswordTemplate, 
     vRevert, 
     vWritePasswordDocument, 
     vWritePasswordTemplate, 
     vOpenFormat, 
     vEncoding, 
     vVisible, 
     vOpenAndRepair, 
     vDocumentDirection, 
     vNoEncodingDialogue, 
     vXMLTransform) as _DocumentDisp; 
except on e: exception do begin 
    Application.MessageBox(PChar('Problem':'+E.message),        PChar('ExOpenDocument'), MB_OK); 
end; 
end; 

`

Большое спасибо.

Steve

+1

Зачем вам нужны какие-либо приведения? –

+0

Вы имеете в виду «как _ApplicationDisp» в – SteveF

+0

Вы имеете в виду такие, как .... «как _ApplicationDisp» в «WordApp: = (CoWordApplication.Create as _ApplicationDisp);». ? Он не будет компилироваться, если вы не сравните результат. Или вы имеете в виду что-то еще? В общем, я пытаюсь придерживаться набора объектов «dispinterface». – SteveF

ответ

0

Это мне кажется более сложным, чем это должно быть. Я бы написал так:

var 
    App: WordApplication; 
    Docs: Documents; 
    Doc: WordDocument; 
.... 
App := CoWordApplication.Create; 
App.Visible := True; 
Docs := App.Documents; 
Doc := Docs.Open('C:\desktop\temp.docx', EmptyParam, EmptyParam, EmptyParam, 
    EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, 
    EmptyParam, EmptyParam); 
+0

Я попытался это изменение вашего DocsOpen (..): 'Doc: = Docs.Open (dfile, ложь, ложь, ложь, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, wdOpenFormatAuto, EmptyParam, правда, EmptyParam , EmptyParam, EmptyParam, EmptyParam); ' – SteveF

+0

Код в моем ответе сработал для меня –

+0

Я пробовал этот вариант вашего DocsOpen (..):' Doc: = Docs.Open (dfile, false, false, false, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, wdOpenFormatAuto, EmptyParam, true, EmptyParam, EmptyParam, EmptyParam, EmptyParam); 'Кажется, что урок состоит в том, что значение параметра должно быть не-OleVariant. Большое вам спасибо @David Heffernan - это замечательный материал. – SteveF