![]() |
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 |
AW: OLE-Steuerung von Word: DoEvents
DoEvents ist eine VBA-Funktion und keine Funktion des OLE-Objektes von Word.
|
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)?
|
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. ![]() |
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. |
AW: OLE-Steuerung von Word: DoEvents
Bei meinem ollen Delphi 7 steht sie in
Delphi-Quellcode:
Ansonsten: In Delphi Typbibliothek von Word importieren, sollte im Installationsverzeichnis von Word sowas in der Art wie "MSWORD.OLB" sein.
InstallationsverzeichnisVonDelphi\OCX\Servers\Word<wordversion>.pas
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:
zu realisieren, ist mir leider nicht bekannt.
while Word.IsBusy do Sleep(1000);
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. |
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?
|
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; |
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 02:20 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