![]() |
Problem mit Word öffnen / Klasse
Hallo zusammen,
ich habe wieder mal ein kleines Problem. Ich möchte mit Delphi ein Word Dokument öffnen und etwas hineinschreiben. Soweit kein Problem. Wenn ich alles in ein Project schreibe ohne verschiedene Klassen funktioniert alles wunderbar. Nun möchte ich aber eine Klasse mit der Graphischen Oberfläche und eine Klasse mit der Word Abwicklung haben Und genau da läuft es vor den Baum. Immer wenn ich das Word Dokument öffnen möchte, bekomme ich die Fehlermeldung: Exception: EAccessViolation Komisch ist nur, wenn ich wie gesagt das ganze nicht in Klassen trenne funktioniert es. Ich poste euch mal beide Klassen. Vielleicht sieht einer von euch das Problem. Die Gui.pas:
Code:
und hier noch die WordEx.pas
unit Gui;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, WordEx, Word2000, OleServer; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Button2: TButton; Button3: TButton; WordApplication1: TWordApplication; WordDocument1: TWordDocument; SaveDialog1: TSaveDialog; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; ExpDoc : TWordExp; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var FileName, newFile: OleVariant; begin ExpDoc := TWordExp.Create; ExpDoc.test; end; end.
Code:
In der WordEx.pas bringt er an folgender Stelle
unit WordEx;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Word97, OleServer, Word2000; type TWordExp = class(TForm) SaveDialog1: TSaveDialog; WordApplication1: TWordApplication; WordDocument1: TWordDocument; Constructor Create ; Procedure test(); private { Private-Deklarationen } public { Public-Deklarationen } end; var WordExp: TWordExp; implementation {$R *.DFM} Constructor TWordExp.Create; Begin ShowMessage('Object wurde erzeugt!!!'); end; Procedure TWordExp.test(); var FileName, newFile: OleVariant; Begin ShowMessage('OPEN WORD'); FileName := 'c:\vorlage.dot'; WordApplication1.Connect; WordDocument1.ConnectTo(WordApplication1.ActiveDocument); WordAppLication1.Visible := true; end; end. WordApplication1.Connect; die oben beschriebene Fehlermeldung. Vielen Dank im Vorraus für Ideen |
Re: Problem mit Word öffnen / Klasse
kann mich irren, aber evtl. solltest du die Klasseninstanz auch erzeugen vor dem benutzen ;)
greetz |
Re: Problem mit Word öffnen / Klasse
Hi erstmal danke für deine Antwort. Das macht das Projekt doch automatisch.
Das Objekt wird auch erzeugt und funktioniert. Das weiss ich daher, weil die Show Messages komplett kommen.
Delphi-Quellcode:
das macht er ja. Daher ist das Objekt auch erzeugt, sonst müsste er die Fehlermeldung da schon bringen.
ShowMessage('Object wurde erzeugt!!!');
end; Procedure TWordExp.test(); var FileName, newFile: OleVariant; Begin ShowMessage('OPEN WORD'); Aber die kommt ja eben erst bei dem besagten Connect. LG |
Re: Problem mit Word öffnen / Klasse
Okay... hab mich zu kurz ausgedrückt.
Bevor du dein TWordApplication benutzen kannst musst du eine Instanz erzeugen. Wärend es als invis-Component auf einer Form automatisch created wird ist das innerhalb deiner Klasse nicht der Fall. Und Achtung. Auch wieder freigeben. du solltest also deinen Constructor erweitern mit:
Delphi-Quellcode:
und einen destructor anlegen, der es auch wieder freigibt:
Self.WordApplication1 := TWordApplication.Create({weiss nich});
Delphi-Quellcode:
Noch eine Anmerkung... schieb die ganzen Subklassen ins Private und sprich sie über Public-Funktionen und/oder Properties an. Unter umständen macht sich auch eine Saubere Benennung (z.B.: FWordApp statt WordApplication1) wobei 'F' für Field steht (glaub ich :gruebel: ) und Quelltext-Einrückung positiv bemerkbar (Übersicht und so ;) ).
Self.WordApplication1.Free;
greetz Edit: Hoppla.. jetzt erst gesehn.. warum leitest du von TForm ab??? in dem Fall reicht doch TObject |
Re: Problem mit Word öffnen / Klasse
Dein Constructor sollte mit override oder reintroduce gekennzeichnet werden. Dann fehlt das inherited - das Object wird nicht korrekt erzeugt. Ausserdem sollte auch noch ein entsprechzend angepasster destructor vorhanden sein.
Delphi-Quellcode:
constructor Create(AOwner: TComponent) ; override;
... Procedure TForm1.Create(AOwner: TComponent); begin inherited; // Hier kommen dann Deine "Spezialitäten" end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:27 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