Autor Beitrag
F.Art
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: 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.

ausblenden 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 user profile iconTino: Code- durch Delphi-Tags ersetzt.
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Mi 29.12.04 15:25 
Etwa so (ActiveX unbd die Word_TLB in die uses-Klausel):

ausblenden 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;  // Die CoClass benutzen, um eine Instanz zu bekommen!
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: Mi 29.12.04 16:00 
Was bedeutet CoClass und Instanz?
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: Mo 03.01.05 12:00 
ausblenden volle Höhe Quelltext
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: Mo 03.01.05 13:49 
Wurde nicht gefunden. Ich nutze das Word 2000 mit Delphi 7.
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: Mo 03.01.05 14:29 
fart.itse-server.de/Word_TLB.zip

Habs mal gezipt zum Downloaden.
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416

Win XP Prof, Fedora Core 4, SuSE 7.0
D7 Ent, D2005 Pers
BeitragVerfasst: Mo 03.01.05 15:13 
wenn die GUIDS vorhanden sind kann er sich ja auch die entsprechenden COM Objekte selber zusammenbasteln...

statt

ausblenden Quelltext
1:
wordapp := CoWordApplication.Create;					


eben ein

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 434



BeitragVerfasst: Mo 03.01.05 16:31 
ausblenden 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.
ausblenden 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;