Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#9

Re: MS Word mit Delphi öffnen

  Alt 13. Feb 2009, 11:39
Hallo,

eigentlich bin ich der Meinung, dass Dein Wordaufruf korrekt ist.
Vor längerer Zeit hatte ich da auch mal mit Problemen zu kämpfen.

Der folgende Quelltext ist daraus entnommen, eventuell hilft er Dir als Denkanstoß. Seinerzeit wurde der Zugriff auf Word nicht über die Komponenten gemacht, sondern über CreateOLEObject bzw. GetActiveOleObject, wenn schon eine Instanz von Word lief.

Der Quelltext ist mit Sicherheit nicht in einem verwendbaren Zustand.
Delphi-Quellcode:
// Eventuell Felder aktuallisieren im Optionendialog.Drucken von Word ausschalten,
// sonst kann es passieren, dass den Anwendern beim Drucken Daten verloren gehen.
// Den Schalter Feldfunktionen Optionendialog.Ansicht ausschalten, sonst sieht
// man den Inhalt der Felder nicht.

// WordBool -> True und False werden durch WordBool(1) und WordBool(0) dargestellt.

unit WordSchnittstelle;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleServer, Grids, ValEdit, ExtCtrls, IniFiles,
  ActnList, ComObj, ActiveX;

type
  TfmWordSchnittstelle = class(TForm)
    pnMain: TPanel;
    pnTop: TPanel;
    btnWordStarten: TButton;
    btnWordBeenden: TButton;
    vleWordVorlagen: TValueListEditor;
    odVorlagen: TOpenDialog;
    procedure btnWordStartenClick(Sender: TObject);
    procedure btnWordBeendenClick(Sender: TObject);
    function WordStarten(sTemplate : String) : Boolean;
    procedure WordBeenden;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormShow(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    function CreateWord : Boolean;
  private
    { Private-Deklarationen }
    CanClose : Boolean;
    sCaption : String;
    sCaptionTemp : String;
  public
    { Public-Deklarationen }
    FVisible: Boolean;

    FWord: Variant;
    FWordCreated: Boolean;
    FWordDoc : Variant;
  end;

var
  fmWordSchnittstelle: TfmWordSchnittstelle;

implementation

{$R *.dfm}

function tfmWordSchnittstelle.CreateWord : Boolean;
begin
  FWordCreated := False;
  Try
    FWord := GetActiveOleObject('Word.Application');
    FWordCreated := True;
  Except
    on e : Exception Do Begin
      // MessageDlg(e.Message + #13 + 'Word.Application not Active',mtError,[mbok],0);
      FWordCreated := False;
    End;
  End;
  If Not FWordCreated Then Begin
    try
      FWord := CreateOLEObject('Word.Application');
      FWordCreated := True;
    except
      on e : Exception Do Begin
        // MessageDlg(e.Message,mtError,[mbok],0);
        FWordCreated := False;
      End;
    End;
  End;
  FWord.Visible := True;
  If FWordCreated Then Begin
    Try
      FWordDoc := CreateOleObject('Word.Document');
      FWordDoc.Activate;
      FWordCreated := True;
    Except
      on e : Exception Do Begin
        MessageDlg('Der Aufruf von Word ist fehlgeschlagen.' + #13
        + 'Ursache: ' + e.Message,mtError,[mbok],0);
        FWordCreated := False;
      End;
    End;
  End;
  Result := FWordCreated;
End;

function TfmWordSchnittstelle.WordStarten(sTemplate : String) : Boolean;
Var
          ovTemplate : OleVariant;
          ovVisible : OleVariant;
          sError : String;

Begin
  Result := False;
  ovVisible := WordBool(0);
  odVorlagen.Title := 'Bitte Serienbriefvorlage auswählen.';
  If CreateWord Then Begin
    If Trim(sTemplate) <> 'Then Begin // wurde uns gesagt, welche Vorlage?
      ovTemplate := vleWordVorlagen.Values[sTemplate];
      Try // diese öffnen
        FWordDoc := FWord.Documents.Add(ovTemplate,WordBool(0),EmptyParam, EmptyParam);
        Result := True;
      Except
        on e : Exception Do Begin
          MessageDlg('Falsche WinWord-Version.' + #13 + e.Message,mtError,[mbok],0);
          FWord := UnAssigned;
        End;
      End;
    End Else If odVorlagen.Execute Then Begin // es wurde nicht gesagt, welche Vorlage,
      ovTemplate := odVorlagen.FileName; // über Dialog Vorlage auswählen lassen.
      Try
        FWordDoc := FWord.Documents.Add(ovTemplate,WordBool(0),EmptyParam, EmptyParam);
        Result := True;
      Except
        on e : Exception Do Begin
          MessageDlg('Falsche WinWord-Version.' + #13 + e.Message,mtError,[mbok],0);
          FWord := UnAssigned;
        End;
      End;
    End Else Begin
      sError := 'Fehlerhafter Aufruf der Wordschnittstelle.';
      MessageDlg(sError,mtInformation,[mbOk],0);
    End;
  End Else Begin
    MessageDlg('Word konnte nicht gestartet werden',mtError,[mbok],0);
  End;
End;

procedure TfmWordSchnittstelle.WordBeenden;
Begin
  FWordDoc.Activate;
  FWord.Activate;
  FWordDoc := Unassigned;
  FWord := Unassigned;
End;

procedure TfmWordSchnittstelle.btnWordStartenClick(Sender: TObject);
Var
          sTemplate : String;
begin
  sTemplate := vleWordVorlagen.Cells[0,vleWordvorlagen.Row];
  WordStarten(sTemplate);
end;

procedure TfmWordSchnittstelle.btnWordBeendenClick(Sender: TObject);
begin
  WordBeenden;
end;

procedure TfmWordSchnittstelle.FormCreate(Sender: TObject);
Var
          iniVorlagen : tIniFile;
begin
  CanClose := True;
  sCaption := Caption;
  sCaptionTemp := Caption;
  iniVorlagen := tIniFile.Create(Application.ExeName + '.ini');
  iniVorlagen.ReadSectionValues('WORDVORLAGEN',vleWordVorlagen.Strings);
  iniVorlagen.Free;
  vleWordVorlagen.Col := 1;
  vleWordVorlagen.Row := 1;
end;

procedure TfmWordSchnittstelle.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  If CanClose Then Begin
    Action := caHide;
  End Else Begin
    Action := caNone;
  End;
end;

procedure TfmWordSchnittstelle.FormShow(Sender: TObject);
begin
  CanClose := True;
end;

procedure TfmWordSchnittstelle.FormKeyPress(Sender: TObject; var Key: Char);
begin
  Case Key Of
    #32..#255 : Begin
                  Caption := sCaptionTemp + ' *';
                End;
  End;
end;

end.
  Mit Zitat antworten Zitat