Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Word Late Binding
sem
myCSharp.de - Member



Dabei seit:
Beiträge: 58
Herkunft: Österreich

Themenstarter:

Word Late Binding

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
talla
myCSharp.de - Experte

Avatar #avatar-3214.jpg


Dabei seit:
Beiträge: 6.862
Herkunft: Esslingen

beantworten | zitieren | melden

Kannst du vielleicht auch die Exception posten?
Baka wa shinanakya naoranai.

Mein XING Profil.
private Nachricht | Beiträge des Benutzers
kiar
myCSharp.de - Member



Dabei seit:
Beiträge: 231
Herkunft: Sachsen Anhalt

beantworten | zitieren | melden

moin,

vllt hilft das
http://www.magerquark.de/blog/index.php/archive/date/2005/06/01/

raik
private Nachricht | Beiträge des Benutzers
sem
myCSharp.de - Member



Dabei seit:
Beiträge: 58
Herkunft: Österreich

Themenstarter:

Fehlermeldung

beantworten | zitieren | melden

Hi!

Die Exception lautet:
Unbekannter Name. (Exception from HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME))
private Nachricht | Beiträge des Benutzers
Rainbird
myCSharp.de - Experte

Avatar #avatar-2834.jpg


Dabei seit:
Beiträge: 3.728
Herkunft: Mauer

Keine Property

beantworten | zitieren | melden

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 });

private Nachricht | Beiträge des Benutzers
sem
myCSharp.de - Member



Dabei seit:
Beiträge: 58
Herkunft: Österreich

Themenstarter:

late binding code

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
talla
myCSharp.de - Experte

Avatar #avatar-3214.jpg


Dabei seit:
Beiträge: 6.862
Herkunft: Esslingen

beantworten | zitieren | melden

Es gibt auch ne Edit Funktion, 3 Beiträge hintereinander müssen nicht sein! Danke
Baka wa shinanakya naoranai.

Mein XING Profil.
private Nachricht | Beiträge des Benutzers
Rainbird
myCSharp.de - Experte

Avatar #avatar-2834.jpg


Dabei seit:
Beiträge: 3.728
Herkunft: Mauer

Range

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
sem
myCSharp.de - Member



Dabei seit:
Beiträge: 58
Herkunft: Österreich

Themenstarter:

xml tags/textmarken

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Rainbird
myCSharp.de - Experte

Avatar #avatar-2834.jpg


Dabei seit:
Beiträge: 3.728
Herkunft: Mauer

Späte Bindung

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
sem
myCSharp.de - Member



Dabei seit:
Beiträge: 58
Herkunft: Österreich

Themenstarter:

Danke

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers