Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   OLE-Steuerung von Word: DoEvents (https://www.delphipraxis.net/206401-ole-steuerung-von-word-doevents.html)

ts-d 17. Dez 2020 11:43

OLE-Steuerung von Word: DoEvents
 
Hallo,

ich muss Word steuern und im Zeit geben, seine Befehle abzuarbeiten, bevor es den nächsten Befehl bekommt.
Darum wollte ich DoEvents aus Delphi2010 zwischendurch aufrufen.

var
WordObj: variant;

...

WordObj := UnAssigned;

try
WordObj := GetActiveOLEObject('Word.Application');
except
WordObj := CreateOleObject('Word.Application');
end;
WordObj.Visible := False;
WordObj.Documents.Add;

...

WordObj.DoEvents;


Delphi meldet dann: "Im Projekt ... ist eine Exception der Klasse EOleError mit der Meldung 'Die Methode 'DoEvents' wird vom Automatisierungsobjekt nicht unterstützt' aufgetreten."



Delphi meldet jedeoch

Delphi.Narium 17. Dez 2020 12:12

AW: OLE-Steuerung von Word: DoEvents
 
DoEvents ist eine VBA-Funktion und keine Funktion des OLE-Objektes von Word.

ts-d 17. Dez 2020 12:14

AW: OLE-Steuerung von Word: DoEvents
 
vielen Dank - gibt's denn irgendwo eine Übersicht, was nur VBA ist und was OLE-Befehle sind (so eine Art Liste mit genauer Syntax, da die ja oft anders ist als in VBA)?

Delphi.Narium 17. Dez 2020 12:18

AW: OLE-Steuerung von Word: DoEvents
 
Wenn ich wissen will, was Word kann, schau ich in die Pas-Datei zur importierten Typelib.

Ansonsten frag' ich, wie gerade bei DoEvents, einfach die Suchmaschine meiner Wahl.

Bei Google suchenword ole doevents erstes Ergebnis

ts-d 17. Dez 2020 12:30

AW: OLE-Steuerung von Word: DoEvents
 
na ja, was meinst Du, wie ich auf dieses Forum gekommen bin?
Das mit der PAS-Datei ist gut. Wo finde ich die?

Oder kennst Du eventl. eine andere Möglichkeit, Word für die Abarbeitung der OLE-Befehle Zeit einzuräumen.

Bei mir passiert Folgendes: Auf einem Rechner funktioniert das Einfügen von Daten in eine Word-Tabelle. Auf dem anderen Rechner verschluckt Word einen Befehl und fügt die Daten ab einer bestimmten Tabellenzelle versetzt ein.

Delphi.Narium 17. Dez 2020 13:36

AW: OLE-Steuerung von Word: DoEvents
 
Bei meinem ollen Delphi 7 steht sie in
Delphi-Quellcode:
InstallationsverzeichnisVonDelphi\OCX\Servers\Word<wordversion>.pas
Ansonsten: In Delphi Typbibliothek von Word importieren, sollte im Installationsverzeichnis von Word sowas in der Art wie "MSWORD.OLB" sein.

Wenn Du Word fernsteuerst, solltest Du folgendes beachten:
Word darf nicht vom Anwender geöffnet sein.

Word sollte unsichtbar arbeiten. Die meiste Zeit geht bei der Darstellung des von Word ausgeführten auf dem Bildschirm drauf. Und das bringt (nach meiner Erfahrung) Word (und auch den Rest aus dem Officepaket) zuweilen arg ins Straucheln. (Ausgehend von Deinem Codeschnipsel scheint Word jedoch schon unsichtbar zu sein.)

Keinesfalls während der Fernsteuerung von Word nach Word wechseln, um zu sehen, ob es arbeitet. Das ging bei meinen Versuchen bisher immer schief.

Eine Möglichkeit, um eine Warteschleife ala
Delphi-Quellcode:
while Word.IsBusy do Sleep(1000);
zu realisieren, ist mir leider nicht bekannt.

Bei welchen Aufgaben der Wordfernsteuerung treten denn bei Dir konkret Probleme auf? Zeig' uns doch bitte mal entsprechende Codefragmente. Eventuell weiß ja jemand, wie man mit 'nem konkreten Problem umgehen kann.

Jumpy 17. Dez 2020 13:43

AW: OLE-Steuerung von Word: DoEvents
 
Was für Befehle sendest du denn? OLE ist doch nicht fire and forget sondern erst wenn der erste Befehl abgearbeitet ist kann man den nächsten senden, oder hab ich das falsch im Kopf?

ts-d 17. Dez 2020 13:51

AW: OLE-Steuerung von Word: DoEvents
 
vielen Dank

Ich denke, die Sache ist gelöst - muß es aber noch testen.

Es werden mehrer Word-Tabellen aus einer Paradox-Tabelle befüllt, quasi so eine Art Word-Formulargenerator. Und an einer Stelle happert's - da springt Word nicht in die nächste Zelle, sondern bleibt sitzen und fügt praktisch den nächsten Wert in die Zelle mit ein.

Ich habe jetzt folgendes an den kritischen Stellen eingefügt:

Delay(1);

und die Funktion:

procedure TMainForm.Delay(const Milliseconds: DWord);
var
FirstTickCount: DWord;
begin
FirstTickCount := GetTickCount;
while ((GetTickCount - FirstTickCount) < Milliseconds) do
begin
Application.ProcessMessages;
Sleep(0);
end;
end;

Delphi.Narium 17. Dez 2020 14:12

AW: OLE-Steuerung von Word: DoEvents
 
Das ist jetzt ein Workaround, der vielleicht klappt, vielleicht dauerhaft, vielleicht auch nicht.

Interessant wäre es zu wissen, wie Du die Tabelle befüllst.

Ist sie im Worddokument schon vorhanden (z. B. aus 'ner Dokumentenvorlage)?
Wird sie manuell erstellt?
Werden die einzelnen Wert z. B. durch 'nen Tab getrennt, um so jeweils in die nächste Zelle bzw. am Zeilenende in die erste Spalte der nächsten Zeile zu gelangen.
Oder wird zuerst mit Word eine fertige Tabelle (in Bezug auf Zeilen und Spalten) erstellt und dann die Werte der einzelnen Zellen eingefügt?
Oder wird zuerst eine einzeilige Tabelle erstellt mit einer Spalte und einer Zeile und dann werden jeweils die Werte einer Zeile mit WordTabelle.Rows.Add bzw. WordTabelle.Cell(Zeile, Spalte).Range.Text := 'Text' hinzugefügt?

...

Da gibt es vermutlich viele Wege, die mal mehr, mal weniger gut funktionieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz