Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Zugriffe auf MS Word (https://www.delphipraxis.net/151398-zugriffe-auf-ms-word.html)

Mysterio08 16. Mai 2010 14:09


Zugriffe auf MS Word
 
Guten Tag,

ich habe angefangen, mich mit den Zugriffen auf MS Word zu beschäftigen, komme aber nicht zurecht, weil mir Quellen zu diesem Thema ganz unterschiedliche Informationen bieten. Es fängt schon beim Zugriff an. Im Buch Borland Delphi 7 habe ich diesen Zugriff gefunden:
Delphi-Quellcode:
uses comobj;
{$R *.DFM}
var word: variant;
  procedure TForm1.Button1Click(Sender: TObject);
  begin
    word := CreateOleObject('Word.Application');
    word.visible := True;
    word.Documents.Open(FileName:= ExtractFilePath(Paramstr(0)) + 'name.doc');
  end
Bei Delphi-Treff steht nun etwas (komplett) anderes unter der Verwendung von TWordApplication:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  WordApplication:=TWordApplication.create;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if assigned(WordApplication) then
  begin
    WordApplication.Connect;
    WordApplication.Visible:=true;
  end;
end;
Es ist doch gleichtültig, welche Variante ich verwende, oder übersehe ich etwas?

Und wie funktioniert es, dass ich ein ganz neues Dokument mit Delphi erstellen kann? Ich habe schon so mit der TWordDocument-Komponente versucht:
Delphi-Quellcode:
Dokument: TWordDocument; //Öffentliche Deklarationen
Word: TWordApplication
...
Dokument := TWordDocument.Create(Self) //Erstellen im OnCreate-Ereignis
...
//Beim Klicken auf einen Button
Dokument.Connect;
Word.NewDocument;
Word.NextLetter
Und drittens: Wie funktioniert es mit dem Zugriff auf ActiveX-Steuerelemente wie der TextBox (Edit) etc.? In Borland Delphi 7 wurde es mit "Formulare aus der Vorversion" realisiert (Aber dort fine ich keine TextBoxen...), wie es in MS Word heißt:
Delphi-Quellcode:
word.ActiveDocument.FormFields.Item('Text1').Result := edit1.text;
So klappt der Zugriff auf die ActiveX-Steuerelemente allerdings nicht, es treten immer Laufzeitfehler auf.

Ich wäre schon dankbar, wenn eine Verlinkung zu einem sehr vollständigen Tutorial gepostet würde.

mfg.

mkinzler 16. Mai 2010 16:33

Re: Zugriffe auf MS Word
 
Das erste Beispiel ist späte Bindung. Die Verbindung wird erst zur Laufzeit geprüft. Der Compiler kennt das OLE-Interface nicht.
Das 2. frühe Bindung. Der Compiler kennt das Interface der COM-Objekte und kann Prüfungen auf Korrektheit durchführen

Mysterio08 16. Mai 2010 17:59

Re: Zugriffe auf MS Word
 
Zitat:

Zitat von mkinzler
Das erste Beispiel ist späte Bindung. Die Verbindung wird erst zur Laufzeit geprüft. Der Compiler kennt das OLE-Interface nicht.
Das 2. frühe Bindung. Der Compiler kennt das Interface der COM-Objekte und kann Prüfungen auf Korrektheit durchführen

Das hört sich für mich nicht nach einem signifikanten Unterschied an, es ist also nur wichtig zu wissen, wann die Zugriffe geschehen (wenn ich das so richtig verstanden habe).

Das mit dem neuen Dokument hat auch funktioniert, einfach Anweisung:
Delphi-Quellcode:
Word.Documents.Add(EmptyParam, EmptyParam, EmptyParam, EmptyParam)
Wie genau kann ich das Öffnen einer Datei realisieren? Ich habe versucht, die Funktion Word.Documents.Open zu verwenden, bin aber nicht weit gekommen, weil ich nicht weiß, wie ich den ersten Parameter vom Typ OleVariant füllen soll - mit einem Dateinamen vom Typ String leider nicht.

Bei dem Zugriff auf die ActiveX-Elemente bin ich auch noch nicht weitergekommen und eine Frage hat sich noch ergeben: Wenn ich im OnCreate-Ereignis die Variable Word vom Typ TWordApplication mit Word := TWordApplication.Create(Self) erstelle, muss ich dann nicht Word nicht auch wieder mit Word.Free freigeben?

mfg.

mkinzler 16. Mai 2010 18:41

Re: Zugriffe auf MS Word
 
Der COM-Klasse ist es egal welche Form der Bindung du wählst. Die Bedeutung der Parameter kannst du ihnder VBA-Hilfe zu Word nachschlagen oder halt in TWordApplication, wobei die 2. für eine bestimmte Word-Version zugeschnitten sind.

idefix2 16. Mai 2010 19:09

Re: Zugriffe auf MS Word
 
Zitat:

mit einem Dateinamen vom Typ String leider nicht.
Warum nicht? Wo ist das Problem? Wenn es nicht funktioniert, dürfte es nicht daran liegen.

edit: Den String musst Du natürlich einer Variablen vom Typ olevariant zuweisen und die übergeben.

Mysterio08 16. Mai 2010 19:33

Re: Zugriffe auf MS Word
 
Zitat:

Zitat von idefix2
Zitat:

mit einem Dateinamen vom Typ String leider nicht.
Warum nicht? Wo ist das Problem? Wenn es nicht funktioniert, dürfte es nicht daran liegen.

edit: Den String musst Du natürlich einer Variablen vom Typ olevariant zuweisen und die übergeben.

Bei folgendem Code kreidet mir der Compiler die gekennzeichnete Zeile wie folgt an an: [DCC Fehler] Word_u.pas(66): E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen:
Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var s: String;
begin
  try
    if OpenDialog.Execute then s := OpenDialog.FileName;
    Word.Documents.Open(s) //Hier steckt der Fehler?! Ungültige Parameterliste?
  except
     Application.MessageBox('Fehler beim Laden der Datei aufgetreten', 'Achtung', 48)
  end
end;

omata 16. Mai 2010 19:47

Re: Zugriffe auf MS Word
 
Versuch es mal so...
Zitat:

Zitat von Mysterio08
Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var s: OleVariant;
begin
  try
    if OpenDialog.Execute then
      s := OpenDialog.FileName;
    Word.Documents.Open(s);
  except
    Application.MessageBox('Fehler beim Laden der Datei aufgetreten', 'Achtung', 48);
  end
end;


Mysterio08 16. Mai 2010 20:03

Re: Zugriffe auf MS Word
 
Danke, omata, ich musste nur noch ein paar Parameter bei der Zeile, die das Dokument öffnet, hinzufügen:
Delphi-Quellcode:
Word.Documents.Open(s, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam)
Was ist jetzt aber mit Free und den ActiveX-Steuerelementen?

idefix2 16. Mai 2010 20:42

Re: Zugriffe auf MS Word
 
Bevor Du Dein Programm schliesst, musst Du alle Objekte, die Du dynamisch (z.B. mit Create) erstellt hast, wieder freigeben.

Bez. des active X Codes, der Probleme macht: mir ist nicht ganz klar, was Du damit erreichen willst. Direkte Zuweisungen an COM Objekte gehen glaub ich überhaupt nicht, Daten müssen generell mittels Parametern vom Typ oleParam übergeben werden.

Mysterio08 17. Mai 2010 07:57

Re: Zugriffe auf MS Word
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von idefix2
Bez. des active X Codes, der Probleme macht: mir ist nicht ganz klar, was Du damit erreichen willst.

Beispielsweise habe ich in der Kopfzeile ein Feld, das ich mit dem aktuellen Datum füllen will, welches von Delphi ermittelt und in einer Variable gespeichert wurde - klar muss ich für diesen Fall nicht extra ein Steuerelement benutzen, aber es ist ja nicht ausgeschlossen.
So weit so gut: auf die "Formulare aus der Vorversion" kann ich zugreifen mit folgendem Code:
Delphi-Quellcode:
s := 'Text';
WordDoc.ActiveDocument.FormFields.Item(s).Result := Edit.Text;
Das Problem ist, dass bei diesem Formularen aus der Vorversion z.B. kein Editierfeld dabei ist, dafür aber bei den ActiveX-Elementen, ich habe es im Bild im Anhang markiert. Nun habe ich im "Objektinspektor" von VBA die Name-Eigenschaft geändert und versucht, mit der oben genannten Funktion auf das AcitveX-Steuerelement zuzugreifen, das hat aber nicht funktioniert.

Wie muss der Code lauten?


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:02 Uhr.
Seite 1 von 2  1 2      

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 by Thomas Breitkreuz