Autor |
Beitrag |
F.Art
      
Beiträge: 434
|
Verfasst: Mi 29.12.04 13:24
Ich versuche mich lngsam in das Thema COM Programmierung ein zu arbeiten und es stellen sich immer wieder neue Fragen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Button2Click(Sender: TObject); var MsWord: Variant; begin MsWord := CreateOleObject('Word.Basic'); MsWord.AppShow; MsWord.FileNew; MsWord.Insert('Test Text'); end; |
Wie bekomme ich es hin das 'MsWord.' eingebe und Delphi mir die möglichen Parameter anzeigt? Ich habe es schon versucht mit Typenbibliothek ein zu laden, aber auf dem Gebiet bin ich halt noch ein Anfänger.
Moderiert von Tino: Code- durch Delphi-Tags ersetzt.
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Mi 29.12.04 13:36
Mit der späten Bind8ung (so wie du es machst per CreateOleObject) geht das nicht, da Delphi zur Laufzeit gar nicht weiß, was für ein Programm du ansteuerst (die Variable ist ja vom Typ OleVariant und nicht irgendiwe MSWordOleVariant oder so, das gibts nicht!). Desshalb geht das nur per früher Bindung und dazu musst du eben die TLB von Word immportieren...
Bei MS Office werden aber schon Komponenten bei Delphi mitgeliefert, schau mal unter dem Register "Server". Das ist praktisch nichts anderes. Da wur4de halt aus der TLB eine Komponente erzeugt (das kann man manuell auch irgendwo machen, irgendwo muss man da nen Haken setzen). Dann kannst du über diese Komponenten auf dein Word zugreifen. Ansonsten eben TLB per Hand importieren.
MrSaint
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
F.Art 
      
Beiträge: 434
|
Verfasst: Mi 29.12.04 14:35
OK dann möchte ich das von Hand importieren, da ich das für die Zukunft öffters benötigen werde. Wie genau geht das von statten?
Project -> Typenbibliothek importieren -> Microsoft Word 9.0 Object Library (Version 8.1) ?
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Mi 29.12.04 14:52
Genau. In dem Fenster dann unten den Haken bei "Komponenten-Wrapper" entfernen, falls das angeklickt sein sollte. Dann "Unit anlegen" und Tadaa! Schon hast du sie und kannst drauf zugreifen
MrSaint
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
F.Art 
      
Beiträge: 434
|
Verfasst: Mi 29.12.04 15:06
Wie müsste mein Code dann aussehen um dort nun drauf zugreifen zu können?
Bis jetzt habe ich das ja in späten Bindung gemacht.
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Mi 29.12.04 15:25
Etwa so (ActiveX unbd die Word_TLB in die uses-Klausel):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| var WorApp : _Application;
..
procedure TForm1.Button1Click(Sender: TObject); begin CoInitialize(nil); WordApp := CoWordApplication.Create; WordApp.Visible := true; end;
procedure TForm1.Button2Click(Sender: TObject); begin WordApp := nil; CoUninitialize; end; |
MrSaint
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
F.Art 
      
Beiträge: 434
|
Verfasst: Mi 29.12.04 16:00
Was bedeutet CoClass und Instanz?
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Mi 29.12.04 16:09
Also eine Instanz ist in etwa wie eine Instanz einer Klasse. Nur dass es sich hier eben nicht um eine Klasse handelt, sondern um ein fremdes Programm oder eine DLL. Die CoClass brauchen wir einfach nur, um diese Instanz zu erzeugen, mehr nicht. Wenn du in den Quellcode der CoClass schaust, dann siehst du auch nur ein:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| class function CoWordApplication.Create: _Application; begin Result := CreateComObject(CLASS_WordApplication) as _Application; end;
class function CoWordApplication.CreateRemote(const MachineName: string): _Application; begin Result := CreateRemoteComObject(MachineName, CLASS_WordApplication) as _Application; end; |
die Create erzeugt eben eine Instanz auf dem lokalen Computer, die CreateRemote eine auf einem fremden.
MrSaint
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
F.Art 
      
Beiträge: 434
|
Verfasst: Mo 03.01.05 12:00
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComObj, ActiveX, Word_TLB;
type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var WordApp : _Application; begin CoInitialize(nil); WordApp := CoWordApplication.Create; // Die CoClass benutzen, um eine Instanz zu bekommen! WordApp.Visible := true; WordApp := nil; CoUninitialize; end;
end. |
[Fehler] Unit1.pas(31): Undefinierter Bezeichner: 'CoWordApplication'
Was habe ich hier falsch gemacht?
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Mo 03.01.05 13:26
Scheint auf den ersten Blick alles richtig zu sein. Schau mal in deine Word_TLB rein und guck, ob das CoWordApplication da deklariert ist. Also ich hab n Office 2003 und bei dem ist das dann in der Word_TLB drin... kann sein, dass es in älteren Versionen noch nicht drin ist, dann musst du schauen, wie's da funktioniert... Da gibts dann eben auch n _Application (da motzt der Compiler ja nicht, das kennt er also) und da musst dann halt irgendwie ne CoClass finden, die sowas erzeugt...
MrSaint
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
F.Art 
      
Beiträge: 434
|
Verfasst: Mo 03.01.05 13:49
Wurde nicht gefunden. Ich nutze das Word 2000 mit Delphi 7.
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Mo 03.01.05 13:56
Poste mal die Implementationen der ganzen CoClasses aus deiner Word_TLB... irgendwo muss eine sein, die _Application erzeugt...
MrSaint
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
F.Art 
      
Beiträge: 434
|
Verfasst: Mo 03.01.05 14:29
fart.itse-server.de/Word_TLB.zip
Habs mal gezipt zum Downloaden.
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Mo 03.01.05 15:09
So, hab mir das mal kurz angeschaut. Also die Typbibliotheken sind gleich (also mit der gleichen GUID), nur ich hab Version 8.3 und du 8.1. Das liegt eben wohl daran, dass ich Office 2003 hab und du 2000. Dann steht bei dir in dem riesen Kommentar-Block am Anfang was von "Übergeordneter Typbibliothek".. Was ist denn das? Hast du das genauso wie oben beschrieben importiert? Also über Projekt -> Typbibliothek importieren -> Microsoft Word auswählen -> Haken unten bei Komponenten-Wrapper rausmachen (den könntest evtl. mal anlassen, vllt kommt so weiter, kann ich mir aber net vorstellen) -> Unit anlegen? Weil dann sollte da ja keine übergeordnete Typbibliothek drin sein. Also bei mir steht das nicht in dem Kommentar. Das könnte aber evtl. auch an unseren Unterschiedl. Delphi-Versionen liegen (D6Pro <-> D7), dass Delphi da dann halt bissle was anderes ausgibt. Bei deiner Typübibliothek fehlen dann noch jegliche CoClasses, frag mich net warum  Aber du könntest mal versuchen, irgendeine Office-TLB zu finden, in der die CoClasses dann drin sind, k.A. ob's sowas gibt, könnt ja aber sein.. Sonst bin ich ziemlich ratlos.
Wenn alles nichts hilft, versuch mal deine Frage im Entwickler-Forum zu stellen, da sollte dir auf jeden Fall geholfen werden können
MrSaint
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
rochus
      
Beiträge: 416
Win XP Prof, Fedora Core 4, SuSE 7.0
D7 Ent, D2005 Pers
|
Verfasst: Mo 03.01.05 15:13
wenn die GUIDS vorhanden sind kann er sich ja auch die entsprechenden COM Objekte selber zusammenbasteln...
statt
Quelltext 1:
| wordapp := CoWordApplication.Create; |
eben ein
Quelltext 1:
| wordapp := CreateComObject(CLASS_WordApplication) as _Application; |
wobei ich zugeben muss, dass mir diese Lösung nicht gefällt und lieber so vorgehen würde, wie du beschrieben hast
gruß
rochus
_________________ Im Nachhinein ist man immer ein Schlauch!
"Dream as if you'll live forever, live as if you'll die today!" James Dean
|
|
F.Art 
      
Beiträge: 434
|
Verfasst: Mo 03.01.05 16:31
Quelltext 1:
| wordapp := CreateComObject(CLASS_WordApplication) as _Application; |
So hat es geklappt, aber sonst ka.
Würde mir einer aus folgenden TLB eine frühe Bindung mal erstellen?
Irgendwie kommt bei mir immer ein Fehler, beim späteren Kompelieren des Projektes.
[url]fart.itse-server.de/mfcom.tlb[/url]
Folgenden Code möchte ich als frühe Bindung haben.
Quelltext 1: 2: 3: 4: 5: 6:
| procedure TForm1.Button1Click(Sender: TObject); var Citrix2 : Variant; begin Citrix2 := CreateOleObject('MetaFrameCOM.MetaFrameFarm'); ShowMessage('Text: ' + Citrix2.FarmName); end; |
|
|