2011-05-06 20 views
6

Ben bir şablona dayalı yeni bir Word belgesi açar Delphi-7 ile yazılmış bir program var.
Belge açık olduğunda, otomasyon bir yer imine (şablonda önceden tanımlı) gider ve orada bir miktar metin ekler.
Aşağıdaki kod, Word 2003'te düzgün çalışıyor ancak Word 2010 numaralı telefona invalid variant operation hata iletisine neden oluyor (hata bloklarını atlattım).Kelime 2010 otomasyon: 'git imi'

wrdapp:= CreateOleObject ('Word.Application'); 
wrdDoc:= wrdapp.documents.add (wrdApp.Options.DefaultFilePath[wdUserTemplatesPath] + '1.dot' 
wrdApp.selection.goto (wdGotoBookmark, unassigned, unassigned, 'B1') 

Ben

wrdDoc.bookmarks.item ('B1').select 

programı Word 2003'te çalışıyor ama hala Word çöküyor ile üçüncü çizgi değiştirin 2010.

Word 2010 için doğru kod için nedir 'go 'yer imi?

+0

: benim kod

Bölüm bu noktada bir kelime belgesi eklemek Bir İmi adını bulduysanız merak ediyorum, eğer birinci ve ikinci satır arasında 10 saniye bekle ('Sleep (10000);') koyarsanız, hatayı hala alıyor musunuz? –

+0

İnanılmaz ama gerçek! Yorumunuzu cevaplayın, çünkü uyku kodun çalışmasını sağlayan şeydir. Zamanı 5 saniyeye indirdim ama bu da işe yaradı. –

+0

* Sabit bir uyku aralığından daha iyi bir yolu olmalı * sahiptir Orada ... Bekle bir dakika. Tabii ki, bu yaklaşım neredeyse her durumda işe yarayabilir, ancak muhtemelen her * örnekte çalışması garanti edilen bir yol vardır. Bir "wrdApp.WaitUntilReady" gibi bir şey beklerdi ... –

cevap

5

Word 2010 Normal.dotm yüklenirken ilgili bir hata vardır (bilir belki eklentileri de ve,?). Normalde yaptığınız gibi, Word 2010'u başlattığınızda, bir açılış ekranı görür ve Word, Normal.dotm yükleme dahil olmak üzere bazı başlatma işlemlerini gerçekleştirir. CreateOleObject('Word.Application') - - Otomasyon yoluyla Word'ü başlattığınızda bu normal.dotm yüklenir ve anında döndürür kadar beklemez. Ancak Normal.dotm hala yükleniyorken gerçekleştirilen işlemleri yapmak, Word'ü kilitliyor gibi görünüyor. Bu sorunu çözmek için yaptığım şey, yalnızca şablonun yüklenmesini bekleyen bir döngü oluşturmaktır. Ayrıca, Word’e başlatılacak zamanı vermek için bir gecikme de seçebilirsiniz, ancak şimdiye kadar, döngü çalışır. Böyle

şey:

wrdapp := CreateOleObject('Word.Application'); 

//loop that waits for the normal template to load 
while wrdapp.Templates.Count = 0 do 
    Sleep(200); 

//continue operations 

Not: kod hatalar içerebilir yüzden, burada mevcut Delphi yok ama

+0

Eh," bir hata " altında] (http://superuser.com/questions/274153/microsoft-word-cannot-save) [deyim] (http://superuser.com/questions/277425/microsoft-word-cannot-open) ... –

+0

+1, yine de bu çok iyi gözüküyor. –

+0

Açılmamış 'uykular' iyi çalışır, ancak muhtemelen zamandan tasarruf edeceğinden bu döngüyü kullanacağımı düşünüyorum. Düzeltilmiş programı çalıştırırken, küçük bir pencerenin ekranda uykuya daldığını ve kapatıldığını fark ettim, ancak o kadar hızlı oldu ki pencerede ne yazdığını göremedim. Muhtemelen şablonlarla ilgisi var .... –

0

Sana değişkenlerle "GoTo_" çağrısında sabitleri yerine gerektiğini düşünüyorum. Bunun gibi:

... 
var 
    vWhat, vBookmark:OleVariant; 
begin 
    ... 
    vWhat:=wdGoToBookmark; 
    vBookmark:='B1'; 
    wrdApp.Selection.GoTo_(vWhat,emptyParam,emptyParam,vBookmark); 
    ... 
end; 
+0

Değişkenleri kullanarak bu hata iletisini verdi: "B1 imi gitme hatası - 'Testword.exe' adresindeki 00458BCB adresindeki erişim ihlali. 00000000 adresi". Bu arada, 'wrdApp.Selection.goto' yazıyor ve 'wrdApp.selection.goto_' yazmıyor çünkü ikincisi, Office 2003 ile "otomasyon nesnesi tarafından desteklenmeyen goto_ yöntemi" hatası veriyor. " –

0

Merhaba ben bu size yardım umut anladınız. Ben D2010 ve Office kullanıyorum 2010

Ne yapıyorum

: Sadece


try 
    Template := EmptyParam; 
    NewTemplate := true; 
    ItemIndex := 1; 
    try 
    Wdapplication.Connect; 
    except 
    Screen.Cursor := crDefault; 
    MessageDlg('No se detecta Word Puede no estar instalado(1) o versi?n incorrecta de Word', mtError, [mbOK], 0); 
    Abort; 
    result := False; 
    end; 
    Wdapplication.Visible := true; // False; 
    WdApplication.Caption := 'Kalemat automation'; 
    {Turn Spell checking of because it takes a long time if enabled and slows down Winword} 
    WdApplication.Options.CheckSpellingAsYouType := false; 
    WdApplication.Options.CheckGrammarAsYouType := false; 
    lbInfo.Lines.Add('Word connected'); 
except 
    on E: Exception do begin 
    ShowMessage(E.Message); 
    WdApplication.Disconnect; 
    result := False; 
    Exit; 
    end; 
end; 

//- 
if wdapplication.Documents.Count > 0 then begin 
    Screen.Cursor   := crDefault; 
    MessageDlg(
    'Por Favor cierre todos sus Word-documentos antes de proseguir...', mtWarning, 
    [mbRetry], 0); 
    wdApplication.Visible := true; 
    WdApplication.Disconnect; 
    result := False; 
    exit; 
end 
else begin 
    with WdApplication do begin 
    //  OnQuit    := WordAppQuit; 
    //  OnChangeDocument := WordDocChange; 
    //  OnOpenDocument  := WordDocOpen; 
    //  OnPreCloseDocument := WordPreClose; 
    //  OnCloseDocument := WordDocClose; 
    //  DisableSystemCloseBox; 
    end 
end; 
{Create new document} 
Template  := EmptyParam; 
NewTemplate := false; 
oNewDocument := ModEsc; 

// abre documento 
lbInfo.Lines.Add('Abriendo escritura '+ModEsc); 

WdApplication.Documents.AddOld(oNewDocument, NewTemplate); 
// Conecta con al instancia de Word 
WdDocument.ConnectTo(WdApplication.Documents.Item(ItemIndex)); 
sBookMarkName := 'FPROEMIO'; 
lbInfo.Lines.Add('Busca marcador Proemio'); 
if WdDocument.Bookmarks.Exists(sBookMarkName) then begin 
    //  ShowMessage(' -Existe: '+sBookMarkName); 
    owhat := wdGotoBookMark; 
    owhich := unAssigned; 
    ocount := unAssigned; 
    //-->>>  //  ShowMessage(' -Ve a..: '+sBookMarkName); 
    //-->>>  // Ve a ese marcados addendum 

    wdDocument.GoTo_(oWhat, oWhich, OCount, sBookMarkName); 

    //  ShowMessage(' GoTo_.. ya estoy en: '+sBookMarkName); 
    // Lo encontre 
    oRange  := ''; 
    oConformConv := false; 
    oLink  := false; 
    oattachment := false; 
    fl_Name  := proemi; 
    lbInfo.Lines.Add('Insertando Proemio '+Proemi); 
    if not FileExists(fl_name) then begin 
    Screen.Cursor := crDefault; 
    lbInfo.Lines.Add('No Existe Documento PROEMIO '); 
    MessageDlg('Documento FPROEMIO NO EXISTE, Revise el modelo de escritura', mtError, [mbRetry], 0); 
    end 
    else 
    wdDocument.Bookmarks.Item(sBookMarkName).Range.InsertFile(Fl_Name, oRange, oConformConv, oLink, oattachment); 
    //  ShowMessage(' -.. inserte el addendum'); 
end 
else begin 
    lbInfo.Lines.Add('No Existe Marcador PROEMIO '); 
end;