Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Abfragen, ob Word geschlossen wurde (https://www.delphipraxis.net/111713-abfragen-ob-word-geschlossen-wurde.html)

s.h.a.r.k 8. Apr 2008 09:01


Abfragen, ob Word geschlossen wurde
 
Hallo erst mal.

Ich stehe gerade mal wieder vor einem Problem, bei dem ich einfach nicht weiter weiß. Ich habe eine Anwendung, welche Daten aus den Eingabefeldern einer Word-Datei liest. Dazu steuere ich Word per OLE. Hier mein Code zum Öffnen und Schließen:
Delphi-Quellcode:
// Klassendefinition
private
  //...
  FWordApplication : TWordApplication;
  //...

////////////////////////////////////////////////////////////////////////////////
////
//  Method : openWordApplication
//  Comment : Startet eine Word-Applikation im Hintergrund

function TImportTimer.openWordApplication(): Boolean;
begin
  // Word und Dokument instanziieren
  if not Assigned(FWordApplication) then
    FWordApplication := TWordApplication.Create(nil);

  Result := Assigned(FWordApplication);
  if Result then
    try
      FWordApplication.Visible := False;
      FWordApplication.Connect; // Word starten
    except
      closeWordApplication;    // Word bei Fehler schließen
      Result := False;
    end;
end;

////////////////////////////////////////////////////////////////////////////////
////
//  Method : closeWordApplication
//  Comment : Schließt eine gestartete Word-Applikation.

procedure TImportTimer.closeWordApplication();
begin
  try
    // Word schließen
    if Assigned(FWordApplication) then
    begin
      FWordApplication.Quit;
      FWordApplication.Disconnect;
      FreeAndNil(FWordApplication);
    end;
  except
    // Hier wird eigentlich was geloggt...
  end;
end;
Ich halte zwar Word im Hintergrund, d.h. es ist, außer über den TaskManager, nicht sichtbar, allerdings kann folgendes immer noch passieren: ein User öffnet ein Word-Dokument an dem Rechner und schließt die Word-Applikation, weil er eben nicht weiß, dass dort Word gestartet ist und gestartet sein muss. Die Word-Applikation ist also komplett zu, auch für mein Programm.

Nun ist es so, dass ich mit der Methode Assigned() prüfe, ob die WordApplication noch vorhanden ist. Der Zeiger drauf exisitert ja noch, ergo liefert mit Assigned(FWordApplication) True, obwohl das Objekt (wenn man das so sagen darf) geschlossen ist.

Ich weiß nun nicht genau wie ich darauf reagieren bzw. eben handeln soll, dass ich eben dieses Problem umgehe. Ich muss ja aus meiner Anwendung heraus entweder Word neu starten, nur wann genau? Oder es evtl. komplett sperren, im Sinne von: wenn der User es schließen will, dieses Event abfangen, das Schließen abbrechen, nur alle internen Dokumente schließen und Word in den Hintergrund schicken. Die Frage dabei ist aber wie kann ich sowas implementieren!?

Ich wäre echt froh um jede Hilfe.

Mit freundlichen Grüßen
der Hai ;)

s.h.a.r.k 9. Apr 2008 10:04

Re: Abfragen, ob Word geschlossen wurde
 
*push* :oops:

Hat keiner eine Idee für mich?

shmia 9. Apr 2008 10:09

Re: Abfragen, ob Word geschlossen wurde
 
Word trägt sich selber in die ROT (Running Object Table) ein.
Das kann man ausnützen:
Delphi-Quellcode:
var
  word : Olevariant;
begin
  try
    word := GetActiveOleObject('Word.Application');
    ShowMessage('Word läuft');
    word := unassigned;
  except
    ShowMessage('Word läuft nicht');
  end;

mkinzler 9. Apr 2008 10:10

Re: Abfragen, ob Word geschlossen wurde
 
Ich würde .ConnectKind auf ckRunningOrNew setzen und immer neu erstellen.

s.h.a.r.k 9. Apr 2008 22:33

Re: Abfragen, ob Word geschlossen wurde
 
Zitat:

Zitat von mkinzler
Ich würde .ConnectKind auf ckRunningOrNew setzen und immer neu erstellen.

Vielen Dank. Ich glaube, dass das hier eine der besten Lösungen sein wird. Problem wird dann wahrscheinlich nur bestehen, wenn Word gerade startet oder schließt. Dazu werd ich aber mal ein paar Tests anstellen und sehen, was sich machen lässt!

Aber schon mal ein recht herzliches Dankeschön :thumb:

[OT]

Mein 600. Beitrag *freu* *Fass aufmach* *einen drauf trink* :dp:

[/OT]


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:22 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