Laden...

Word Late Binding

Erstellt von sem vor 17 Jahren Letzter Beitrag vor 17 Jahren 7.029 Views
S
sem Themenstarter:in
58 Beiträge seit 2005
vor 17 Jahren
Word Late Binding

Hi!

Ich brauche dringedn Hilfe, bin kanpp am verzweifeln.
Ich will aus C# in word ein bild einfügen, und zwar unbedingt mit late binding.
mit early binding ist es leicht, aber mitlate binding schaff ichs einfach nicht.

early binding gehts so:


string fileName = "d://x.bmp";  //the picture file to be inserted
                Object oMissed = doc.Paragraphs[2].Range; //the position you want to insert
                Object oLinkToFile = false;  //default
                Object oSaveWithDocument = true;//default
                doc.InlineShapes.AddPicture(fieldName, ref  oLinkToFile, ref  oSaveWithDocument, ref  oMissed); 

aber mit late binding schaff ich es einfach nicht das range object zu bekommen. kann immer nur am anfang einfügen! so hab ichs versucht, aber kommt eine exception:
object para = wordDocument.GetType().InvokeMember("get_Item", BindingFlags.GetProperty, null, wordDocument, new object[1] {2});

wirft nur eine exception.
Wäre super wenn mit wer helfen könnte. im netz find ich NUR early binding beispiele.

danke!

6.862 Beiträge seit 2003
vor 17 Jahren

Kannst du vielleicht auch die Exception posten?

Baka wa shinanakya naoranai.

Mein XING Profil.

K
231 Beiträge seit 2005
vor 17 Jahren
S
sem Themenstarter:in
58 Beiträge seit 2005
vor 17 Jahren
Fehlermeldung

Hi!

Die Exception lautet:
Unbekannter Name. (Exception from HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME))

3.728 Beiträge seit 2005
vor 17 Jahren
Keine Property

Auch wenn Item wie eine normale Property aussieht, ist es keine. So funktioniert es:


// Laufende Word-Instanz holen
object word = Marshal.GetActiveObject("Word.Application");

// Metadaten von Word.Application abrufen
Type wordType=word.GetType();

// Dateiname festlegen
string fileName = @"C:\test.bmp"; 

// Aktuelles Dokument abrufen
object document = wordType.InvokeMember("ActiveDocument", BindingFlags.GetProperty, null, word, new object[0]);

// Absätz-Auflistung des Dokuemnts abrufen
object paragraphs=document.GetType().InvokeMember("Paragraphs",BindingFlags.GetProperty,null,document,new object[0]);

// 2. Absatz des Dokuments abrufen
object secondPara = paragraphs.GetType().InvokeMember("Item", BindingFlags.InvokeMethod, null, paragraphs, new object[1] { 2 });

// Range des Absatzes abrufen
object range = secondPara.GetType().InvokeMember("Range", BindingFlags.GetProperty, null, secondPara, new object[0]);
            
// Variablen für übrige ref-Parameter erzeugen            
object linkToFile = false;  
object saveWithDocument = true;

// Bilder-Auflistung des Dokuemnts abrufen
object shapes = document.GetType().InvokeMember("InlineShapes", BindingFlags.GetProperty, null, document, new object[0]);

// Bild zufügen
shapes.GetType().InvokeMember("AddPicture", BindingFlags.InvokeMethod | BindingFlags.OptionalParamBinding, null, shapes, new object[4] { fileName, linkToFile, saveWithDocument, range });


S
sem Themenstarter:in
58 Beiträge seit 2005
vor 17 Jahren
late binding code

Hallo!

Hab grade gesehen, ich hab vorher den falschen code fürs late binding gepostet, aber fehlermeldung bleibt gleich:

*/das wordDocument hol ich ordnungsgemäß und funktioniert auch, dann hol ich das paragraphs objekt:*/
object para = wordDocument.GetType().InvokeMember("Paragraphs", BindingFlags.GetProperty, null, wordDocument, null);
//das geht nocht
/*aber dann will ich ein range objekt aus dem paragraphs array holen, in early binding sag ich einfach paragraphs[2], das geht bei late binduing sowieso nicht, aber folgendes leider auch nciht: */
object range = para.GetType().InvokeMember("get_Item", BindingFlags.GetProperty, null, para, new object[1] { 2 });
/*hier fliegt die exception: Unbekannter Name. (Exception from HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME)) */

Ich vermut mal es ist ne einfache sache wenn mans weiß, aber ich komm nicht drauf...

Danke für Eure Hilfe!


Danke Rainbird, du bist der Beste!

Werd das gleich mal probieren!


Hallo!

Das von rainbird gepostete funktioniert super!
Ohne euch überstrapazieren zu wollen, vielleicht kann mir noch jemand sagen, ob ich vielleicht ein range objekt irgendwie auch über eine suche im dokument bekommen kann.

also in pseudcode meine ich das so:
range = document.find("§§§MYPLACEHOLDER§§§");

wie ich sowas mit text ersetze habe ich schon herausen, aber ich bekomme dabei kein range objekt, das ich fürs einfügen eines bildes verwenden könnte...

danke!

6.862 Beiträge seit 2003
vor 17 Jahren

Es gibt auch ne Edit Funktion, 3 Beiträge hintereinander müssen nicht sein! Danke

Baka wa shinanakya naoranai.

Mein XING Profil.

3.728 Beiträge seit 2005
vor 17 Jahren
Range

Du kannst Dir vom Document ein Range-Objekt zurückgeben lassen in dem Du Start und Ende angibst. Mit Start und Ende sind jeweils Zeichenpositionen (also z.B. das 4561te Zeichen) gemeint.

Ich möchte Dir allerdings ans Herz legen, die Bilder nicht per Zeichenfolgenposition oder per "3ter Absatz von links" einzufügen. Verwende lieber XML-Tags zum festlegen der Bildposition. Oder Textmarken (wobei ich persönlich Textmarken nicht mag; Ist rein subjektiv). Dann kommen die Bilder auch dann noch an die richtige Stelle, wenn der Benutzer das Dokument verändert.

S
sem Themenstarter:in
58 Beiträge seit 2005
vor 17 Jahren
xml tags/textmarken

Hm, hatte mich damit schon kurz beschäftigt, aber irgendwie ist es mir auch nicht so recht gelungen via late binding eine textmarke zurückzubekommen bzw. wie kann ich die dann verwenden um das bild einzufügen, da brauch ich doch ein range objekt, oder?

Bin was word anbindungen und besonders late binding betrifft leider ein rookie.

danke.

3.728 Beiträge seit 2005
vor 17 Jahren
Späte Bindung

Späte Bindung ist ganz leicht, wenn man folgende Regeln beherzigt:
*Aufrufe verketten geht nicht (Für jeden Punkt immer ein eigener InvokeMember-Aufruf) *Original-Namen verwenden und nicht die COM-Wrapper-Namen (Es heißt z.B. Item und nicht get_Item) *BindingFlags.OptionalParameterBinding immer verwenden, wenn Methoden optionale Parameter haben

S
sem Themenstarter:in
58 Beiträge seit 2005
vor 17 Jahren
Danke

Hallo!

Danke für die Hilfe!
Ich hab mittlerweile auch festgestellt, dass es eigentlich nicht schwierig ist, wenn man sich etwas Zeit nimmt und eben genau das beachtet, was du gepostet hast.