Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit Word öffnen / Klasse (https://www.delphipraxis.net/84879-problem-mit-word-oeffnen-klasse.html)

Anuschka 23. Jan 2007 09:25


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:
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.
und hier noch die WordEx.pas
Code:
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.
In der WordEx.pas bringt er an folgender Stelle
WordApplication1.Connect;
die oben beschriebene Fehlermeldung.


Vielen Dank im Vorraus für Ideen

cruiser 23. Jan 2007 09:39

Re: Problem mit Word öffnen / Klasse
 
kann mich irren, aber evtl. solltest du die Klasseninstanz auch erzeugen vor dem benutzen ;)

greetz

Anuschka 23. Jan 2007 09:45

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:
ShowMessage('Object wurde erzeugt!!!');
end;
Procedure TWordExp.test();
var FileName, newFile: OleVariant;
Begin
ShowMessage('OPEN WORD');
das macht er ja. Daher ist das Objekt auch erzeugt, sonst müsste er die Fehlermeldung da schon bringen.
Aber die kommt ja eben erst bei dem besagten Connect.

LG

cruiser 23. Jan 2007 09:49

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:
Self.WordApplication1 := TWordApplication.Create({weiss nich});
und einen destructor anlegen, der es auch wieder freigibt:

Delphi-Quellcode:
Self.WordApplication1.Free;
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 ;) ).

greetz

Edit: Hoppla.. jetzt erst gesehn.. warum leitest du von TForm ab??? in dem Fall reicht doch TObject

Union 23. Jan 2007 09:54

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