2011-05-06 19 views
6

मेरे पास डेल्फी -7 में एक प्रोग्राम लिखा गया है जो एक नया वर्ड दस्तावेज़ खोलता है जो टेम्पलेट पर आधारित है।
दस्तावेज़ खोलने के बाद, स्वचालन एक बुकमार्क (टेम्पलेट में पूर्वनिर्धारित) पर कूदता है और वहां कुछ टेक्स्ट जोड़ता है।
निम्नलिखित कोड Word 2003 में ठीक काम करता है लेकिन Word 2010 में invalid variant operation त्रुटि संदेश का कारण बनता है (मैंने स्पष्टता के लिए try/except ब्लॉक छोड़े हैं)शब्द 2010 स्वचालन: 'गोटो बुकमार्क'

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

अगर मैं

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

कार्यक्रम वर्ड 2003 में ठीक काम करता है, लेकिन अभी भी वर्ड में दुर्घटनाओं के साथ तीसरी लाइन की जगह 2010

को Word 2010 के लिए सही कोड क्या है 'जाना बुकमार्क करने के लिए?

+0

बस उत्सुक, यदि आप पहली और दूसरी पंक्ति के बीच 10 सेकंड प्रतीक्षा ('नींद (10000);') डालते हैं, तो क्या आपको अभी भी त्रुटि मिलती है? –

+0

अविश्वसनीय लेकिन सच! अपनी टिप्पणी को एक उत्तर दें क्योंकि नींद कोड कोड को बनाती है। मैंने समय 5 सेकंड तक काट दिया लेकिन यह भी काम किया। –

+0

एक मिनट रुको ... वहाँ * एक निश्चित नींद अंतराल से बेहतर तरीका है *। बेशक, यह दृष्टिकोण लगभग हर उदाहरण में काम कर सकता है, लेकिन संभवतः एक ऐसा तरीका है जो हर * उदाहरण में काम करने की गारंटी देता है। एक 'wrdApp.WaitUntilReady' जैसे कुछ की अपेक्षा करेगा ... –

उत्तर

5

Word 2010 एक बग कि Normal.dotm लोड हो रहा है से संबंधित है है (और शायद प्लगइन्स भी, कौन जानता है?)। जब आप Word 2010 को सामान्य रूप से प्रारंभ करते हैं, तो आप एक स्प्लैशस्क्रीन देखते हैं और Word Normal.dotm को लोड करने सहित कुछ प्रारंभिक कार्य करता है। जब आप स्वचालन के माध्यम से शब्द शुरू करते हैं - CreateOleObject('Word.Application') - यह Normal.dotm लोड होने तक प्रतीक्षा नहीं करता है और तुरंत लौटाता है। लेकिन जब Normal.dotm अभी भी लोड हो रहा है तब संचालन निष्पादित करना Word को क्रैश करना प्रतीत होता है। मैंने इस समस्या को हल करने के लिए क्या किया है वह लूप बनाना है जो टेम्पलेट को लोड करने की प्रतीक्षा करता है। आप शब्द को प्रारंभ करने का समय देने में देरी का भी चयन कर सकते हैं, लेकिन अब तक, लूप काम करता है।

कुछ इस तरह:

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

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

//continue operations 

पुनश्च: मैं इतना कोड त्रुटियां हो सकती हैं, यहाँ उपलब्ध डेल्फी की जरूरत नहीं है, लेकिन आप विचार

+0

ठीक है, "एक बग" एक है [ के तहत] (http://superuser.com/questions/274153/microsoft-word-cannot-save) [बयान] (http://superuser.com/questions/277425/microsoft-word-cannot-open) ... –

+0

+1, हालांकि, यह बहुत अच्छा लगता है। –

+0

अनलोप्ड 'नींद' अच्छी तरह से काम करता है, हालांकि मुझे लगता है कि मैं लूप का उपयोग करूंगा क्योंकि यह शायद समय बचाएगा। मैंने देखा कि सही प्रोग्राम चलाते समय एक छोटी सी खिड़की नींद के दौरान स्क्रीन पर चली गई और बंद हो गई, लेकिन यह इतनी तेजी से हुआ कि मैं खिड़की में क्या लिखा था उसे नहीं देख सका। शायद टेम्पलेट्स के साथ कुछ करने के लिए .... –

0

मुझे लगता है कि आपको चर के साथ "GoTo_" कॉल में स्थिरांक को प्रतिस्थापित करना चाहिए। कि जैसा:

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

चर का उपयोग करके यह त्रुटि संदेश दिया गया: "B1 बुकमार्क करने में त्रुटि - मॉड्यूल' testword.exe 'में पते 00458BCB पर उल्लंघन उल्लंघन। पता 00000000 पता पढ़ें। संयोग से, मैं 'wrdApp.Selection.goto' लिख रहा हूं और 'wrdApp.selection.goto_' नहीं हूं क्योंकि बाद में Office 2003 के साथ "autoot object द्वारा विधि geto_ समर्थित नहीं है"। –

0

हाय मैं इस मदद आशा है कि आप मिलता है। मैं D2010 और कार्यालय उपयोग कर रहा हूँ 2010

क्या मैं कर रहा हूँ: अगर मैं एक बुकमार्क का नाम मिल गया है, मैं इस बात में एक शब्द दस्तावेज़ सम्मिलित

मेरे कोड का एक हिस्सा:


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; 
संबंधित मुद्दे