2011-07-04 7 views
0

Quelqu'un peut-il aider?MS Word 2010 mailmerge en Delphi 5

J'ai hérité de certains logiciels écrits en Delphi 5 qui permettent d'utiliser des données de membre et des champs d'une base de données (fichier .ADT) à fusionner dans un mot.

Il fonctionne très bien avec toute version de Word, sauf 2010 où il ne se charge pas des documents et montre l'erreur:

« Cette méthode n'est pas disponible sur cet objet »

On m'a dit la solution consiste à remplacer les composants prédéfinis OpWord et OpDataSet par des variantes Ole. Je l'ai fait avec OpWord en utilisant:

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

et les documents se chargent maintenant mais sans données de champ de fusion. Quelqu'un peut-il me dire comment extraire ces données de la base de données, car l'OpDataSet semble simplement pointer sur la table?

Ou quelqu'un peut-il suggérer une meilleure solution que celle que j'essaie. Je suis très nouveau à Delphes, donc je suis abit sur ma tête

Edit: (demandé Info)

Désolé j'avoir plus de détails et le code si nécessaire.

Les composants semblent appartenir à une bibliothèque appelée OfficePartner avec TOpExcel, TOpOutlook et autres.

Le .doc est sélectionné à partir d'une ListPane popup sur Form30, ouvert et avec des données de champ de fusion du tableau 4. Le tableau 1 est la base de données de membres:

{Use Table4 as we can Set a range on it} 
    Table4.SetRange([Table1.FieldByName('Member Id').AsString],[Table1.FieldByName('Member Id').AsString]); 

    {Open Word} 
    OpWord1.Connected := True; 

    {Open the Test Document} 
    OpWord1.OpenDocument(DocumentDirectory + '\' + Form30.ListBox1.Items[Form30.ListBox1.ItemIndex]); 

    {Populate the Test Document} 
    OpWord1.ActiveDocument.MailMerge.OfficeModel := OpDataSetModel1; 
    OpWord1.ActiveDocument.PopulateMailMerge; 
    OpWord1.ActiveDocument.ExecuteMailMerge; 

J'espère que cette aide ...

+0

Sans un peu de code et une meilleure indication de l'emplacement de la bibliothèque OpWord et de l'OpDataSet (ce ne sont certainement pas des composants standard de Delphi 5), tout le monde peut le deviner. Montrez comment vous créez les différents objets COM (pas seulement le mot application) et comment vous ouvrez le document et/ou démarrez la fusion. –

+0

Salut merci d'avoir répondu. Excuses je ne voulais pas écrire une question si longue, mais j'ai inclus du code dans le montage ci-dessus. – notidaho

Répondre

1

Voici une petite procédure pour le publipostage que j'ai utilisé pour D6, c'est un extrait juste et vous devez inclure dans une classe, je n'ai plus de Delphi donc je ne peux pas compiler pour m'assurer que ça marche , de toute façon il est ici, j'espère que ça aide:

procedure MailMergeWord; 
var 
    WordApp: TWordApplication; 
    WordDoc: TWordDocument; 
    doc : WordDocument; 
    FileName: OleVariant; 
    xx: integer; 
begin 
    WordApp := TWordApplication.Create(nil); 
    WordApp.ConnectKind := ckNewInstance; 
    WordDoc := TWordDocument.Create(WordApp); 
    FileName := 'TemplateDoc.doc'; 

    doc := WordApp.Documents.Open(FileName,EmptyParam,EmptyParam,EmptyParam,EmptyParam 
           ,EmptyParam,EmptyParam,EmptyParam,EmptyParam 
           ,EmptyParam); 

    WordDoc.ConnectTo(Doc); 
    for xx := 1 to WordDoc.Fields.Count do 
    WordDoc.Fields.Item(xx).Result.Text := OnWordVariable(WordDoc.Fields.Item(xx).Code.Text); 
    WordDoc.PrintOut; 
    WordDoc.Free; 
    WordApp.Free; 
end; 


function OnWordVariable(varName: string): string; 
begin 
    Result := 'Value based on variable name'; 
end; 
+0

Merci pour l'entrée. Ma compréhension des objets et de leurs attributs continue cependant de m'échouer et je ne peux pas voir comment vos données de champ se trouvent dans WordDoc.Fields et sont transmises au modèle. À la minute où j'essaie de créer un DataSourceFile dans lequel je vais passer les données de la table, mais je suis mélangé avec StringLists. argh – notidaho

+1

Je ne suis pas sûr de vous comprendre, mais la fonction OnWordVariable est appelée pour tous les champs définis dans le document Word "TemplateDoc.doc" et la fonction OnWordVariable est juste un exemple, vous devez fournir votre propre logique pour remplir les champs en doc doc selon aux noms de champs définis dans le document Word. Ne voyez pas pourquoi vous faites ce DataSourceFile, supposons que votre table a des noms de champs identiques à ceux des champs, donc vous pouvez simplement faire ceci: Résultat: = table.FieldByName ("varName"). AsString; –

+0

Fantastique! merci antonio ...Les mots-clés de modèle de mes clients ne correspondent pas réellement aux noms des champs dans la table, donc je dois soit supprimer les caractères de soulignement supplémentaires, soit créer de nouveaux modèles. Si cela fonctionne, je n'aurai plus qu'une question - Lorsque mes clients créent leurs propres modèles et ouvrent un document Word vide, comment puis-je nourrir dans les options de champs de fusion. Je l'ai vu à travers la technique du fichier source que j'ai copié à partir de http://support.microsoft.com/kb/229310, mais y a-t-il un moyen plus simple d'utiliser wrdDoc.Merge.Fields? merci beaucoup – notidaho