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
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)