![]() |
AddIn funktioniert nicht richtig (Word2003)
Guten Morgen, alle miteinander!
Ich habe in den letzten Wochen ein Word-AddIn geschrieben, das in Word2000 auch wunderbar funktioniert. Je nachdem, welche DOT im Hintergrund an dem Dokument hängt, wird der Benutzer über einen Dialog aufgefordert, Einstellungen vorzunehmen und dann werden Formate und CommandBars etc. dynamisch erzeugt, damit genau die Arbeitsumgebungen vorhanden sind, die der Benutzer benötigt. Wie gesagt, in Word 2000 funktioniert alles wunderbar. Ein Installer ist gebaut, auf mehreren Geräten getestet - und nirgends gab es Problem. Anders in Word 2003. Ich habe den Installer an einem Gerät mit Word 2003 ausprobiert. Die DLL ist installiert und registriert und wird von Word auch geladen. Beim Erzeugen der Formatvorlagen hängt Word2003 sich allerdings auf. Und zwar an folgender Stelle:
Delphi-Quellcode:
function TWordSettings.Style_Create(Format: TFormat): Style;
var My_Font: WordFont; [...] begin Result := nil; _Type := 1; if Assigned ( Format ) then begin if HasActiveDocument then begin Result := Style_GetStyle ( Format.StyleInfoAF.Name ); if Result = nil then Result := FWord.ActiveDocument.Styles.Add ( Format.StyleInfoAF.Name, _Type ); // In Result können jetzt die Werte eingetragen werden... with Format.StyleInfoAF do begin // Allgemein Result.Set_LanguageID ( LanguageID ); // Link 2 List if Format.Link2ListSet then begin try LG := FWord.ListGalleries.item(LinkToList.GalleryIdx.Value); LevelIdx := LinkToList.LevelIdx.Value; TemplateIdx := LinkToList.TemplateIdx.Value; Result.LinkToListTemplate ( LG.ListTemplates.item(TemplateIdx), LevelIdx ); // Und in die Listgallery eintragen LG.ListTemplates.item(TemplateIdx).ListLevels.Item(LevelIdx).Set_LinkedStyle ( Name ); except end; end; // Font My_Font := Result.Get_Font; with Font do begin // Hier: // // bei My_Font.Set_Name // // hängt Word2003 sich auf, während es in Word2000 KEINERLEI // Probleme gibt... Wenn die Zeile auskommentiert ist, hängt Word // sich entsprechend bei Set_Size auf etc. Ein Zugriff auf das WordFont- // Objekt bereitet also die Probleme My_Font.Set_Name ( Name.Value ); My_Font.Set_Size ( Size.Value ); if Bold.Value then My_Font.Set_Bold ( 1 ) else My_Font.Set_Bold ( 0 ); if Italic.Value then My_Font.Set_Italic ( 1 ) else My_Font.Set_Italic ( 0 ); [...] Hatte jemand schon einmal ein ähnliches Problem und dazu eine Lösung gefunden? Ich weiß, dass einige unserer Kunden mit Word2003 arbeiten, ich kann es also leider nicht auf sich beruhen lassen... :( Matthias |
Re: AddIn funktioniert nicht richtig (Word2003)
Guten Morgen!
Wie Ihr seht, bastele ich immer noch an meinem Problem herum. Auch die Änderung des Codes und Einbinden eines CoClass-Objekts haben mich nicht weiter gebracht:
Delphi-Quellcode:
In Word2000 funktioniert auch der neue Code einwandfrei, in Word2003 hat sich ebenfalls nichts geändert. Beim Zugriff auf die Font-Eigenschaften der Formatvorlage geht alles ins Leere. Word2003 gibt keine Rückmeldung mehr...
function TWordSettings.Style_Create(Format: TFormat): Style;
var _Type: OleVariant; MF: TWordFont; _Para: WordParagraphFormat; counter: Integer; TSAlignment, TSLeader: OleVariant; TemplateIdx: OleVariant; LevelIdx: OleVariant; LG: ListGallery; srvIntfFont: _Font; begin Result := nil; _Type := 1; if Assigned ( Format ) then begin if HasActiveDocument then begin Result := Style_GetStyle ( Format.StyleInfoAF.Name ); if Result = nil then Result := FWord.ActiveDocument.Styles.Add ( Format.StyleInfoAF.Name, _Type ); // In Result können jetzt die Werte eingetragen werden... with Format.StyleInfoAF do begin // Allgemein Result.Set_LanguageID ( LanguageID ); // Link 2 List if Format.Link2ListSet then begin LG := FWord.ListGalleries.item(LinkToList.GalleryIdx.Value); LevelIdx := LinkToList.LevelIdx.Value; TemplateIdx := LinkToList.TemplateIdx.Value; Result.LinkToListTemplate ( LG.ListTemplates.item(TemplateIdx), LevelIdx ); // Und in die Listgallery eintragen LG.ListTemplates.item(TemplateIdx).ListLevels.Item(LevelIdx).Set_LinkedStyle ( Name ); end; // Font try // Erzeugen und Verbinden eines expliziten TWordFont-Objektes, // um hierüber auf die Font-Eigenschaften zuzugreifen MF := TWordFont.Create ( nil ); srvIntfFont := Result.Font; if srvIntfFont <> nil then MF.ConnectTo ( srvIntfFont as Word_TLB._Font ) else ShowMessage ( 'Kein Font-Objekt' ); // ... und hier der Zugriff... with Font do begin MF.Name := Name.Value; MF.Size := Size.Value; if Bold.Value then MF.Bold := 1 else MF.Bold := 0; [...] :wall: Matthias |
Re: AddIn funktioniert nicht richtig (Word2003)
Hallo, alle miteinander!
Die Font-Probleme (betraf auch das ParagraphFormat) sind jetzt gelöst. Folgender Code funktioniert sowohl in Word2000 als auch in Word2003:
Delphi-Quellcode:
Ein weiteres Problem stellen aber die Positionsrahmen innerhalb des Styles dar. Hier gibt es keine CoClass, die ich verwenden kann. Außerdem kann ich im Style den Frame nur LESEN und nicht SCHREIBEN...
function TWordSettings.Style_Create(Format: TFormat): Style;
var _Type: OleVariant; MF: TWordFont; MP: TWordParagraphFormat; TemplateIdx: OleVariant; LevelIdx: OleVariant; LG: ListGallery; srvIntfFont, _MF: _Font; srvIntfPara, _MP: _ParagraphFormat; [...] begin Result := nil; _Type := wdStyleTypeParagraph; if Assigned ( Format ) then begin if HasActiveDocument then begin Result := Style_GetStyle ( Format.StyleInfoAF.Name ); if Result = nil then Result := FWord.ActiveDocument.Styles.Add ( Format.StyleInfoAF.Name, _Type ); // In Result können jetzt die Werte eingetragen werden... with Format.StyleInfoAF do begin // Allgemein try Result.Set_LanguageID ( LanguageID ); except end; // Link 2 List if Format.Link2ListSet then begin try LG := FWord.ListGalleries.item(LinkToList.GalleryIdx.Value); LevelIdx := LinkToList.LevelIdx.Value; TemplateIdx := LinkToList.TemplateIdx.Value; Result.LinkToListTemplate ( LG.ListTemplates.item(TemplateIdx), LevelIdx ); // Und in die Listgallery eintragen LG.ListTemplates.item(TemplateIdx).ListLevels.Item(LevelIdx).Set_LinkedStyle ( Name ); except end; end; // Font try // Verbindung herstellen - Dazu wird ein Objekt // Einer CoClass gebildet und mit dem Font-Interface des // Styles verbunden MF := TWordFont.Create ( nil ); srvIntfFont := Result.Font as Word_TLB._Font; if srvIntfFont <> nil then begin MF.ConnectTo ( srvIntfFont as Word_TLB._Font ); end else begin if FDebug then ShowMessage ( 'Kein Font-Interface' ); end; // Erstaunlicherweise reicht die CoClass nicht, sondern man muss // ein Duplikat des Interfaces erzeugen. Dieses Duplikat kann man // bearbeiten und dem Style später wieder zuweisen... _MF := MF.Duplicate; // Werte eintragen with Font do begin _MF.Name := Name.Value; _MF.Size := Size.Value; if Bold.Value then _MF.Bold := 1 else _MF.Bold := 0; if Italic.Value then _MF.Italic := 1 else _MF.Italic := 0; if Underline.Value then _MF.Underline := 1 else _MF.Underline := 0; [...] end; Result.Font := _MF; MF.Destroy; :gruebel: Matthias |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz