![]() |
COM - Word in den Vordergrund bringen
Hallo liebe Delphianer,
das ist mein erster Post, aber ich bin schon jahrelanger Besucher von Delphi Praxis. Ich hoffe, ich gehe euch nicht zu sehr auf den Keks. Jetzt kommt die Problemstellung. Wenn ich von meinem Programm aus Word starte bleibt Word im Hintergrund. Das ist unschön, weil das der Monatsbericht ist und man erst mit Alt - Tab zu Word wechseln muss. Ich starte von der Mainform ein Formular mit folgenden Code:
Delphi-Quellcode:
In Form6 starte ich Word über COM. In einem Wordtemplate habe ich die Textmarke "titel" eingfügt.
IrgendeinButtonClick((Sender: TObject);
//hier der Aufruf von Form6 aus Form1... // den Code habe ich aus eurer Rubrik „Tipps und Tricks“ und dem SwizDelphiCenter. Form6 := TForm6.Create(nil); try Form6.ShowModal; finally FreeAndNil(Form6); end;
Delphi-Quellcode:
So jetzt kommt es, die OleVariant ist auf folgende Werte eingestellt:
// Wenn das Ereignis ausgelöst wird die hier zugewiesene Information im WordDokument eingetragen. Das ist der Monatsbericht.
// hier der Code... meinebookmark := 'titel'; if Doc.Bookmarks.Exists(meinebookmark) then begin R := Doc.Bookmarks.Item(meinebookmark).Range; // Add text at our bookmark // Text bei Textmarke einfügen r.select; try objword.selection.typetext(adodataset1.FieldByName('bezeichnung').AsString); except end; end;
Delphi-Quellcode:
Word starttet korrekt, füllt die Textmarken aus bleibt aber im Hintergrund, so ein Mist… seufz
// ob die Reihenfolge so richtig ist? funktionieren tuts ja...
objword.Activate; objword.WindowState:=wsNormal; objword.Visible:=true; Da wird der Monatsbericht nach Word ausgedruckt und den sollte man sofort sehen und nicht erst mit der „Alt-Tab-Kombination“ zu Word wechseln. Jetzt probiere ich das aus...
Delphi-Quellcode:
Das Problem ist, dass ich Word von der 2. Form aus starte und mir alle Aktionen mit "application" Form1 anzeigen, wo aber alles auf enabled:=false steht, weil Form6 showmodal ist.
// einzeln und in Kombination
objword.Activate; objword.WindowState:=wsNormal; objword.Visible:=true; //application.hide; application.ModalFinished; application.minimize //bringt aber auch nicht das gewünschte Ergebnis. Bin über jeden Tipp dankbar. Liebe Grüße aus Berlin MichiZi :-D |
AW: COM - Word in den Vordergrund bringen
Vielleicht hilft das (nach Deinen ersten 3 Zeilen, also nach "objword.Visible:=true;"):
Delphi-Quellcode:
Kurze Erläuterung: NormalizeAllTopmost macht alle Deine Fenster Nichtmodal, so dass andere Fenster (z.B. eben Word) darüber liegen können.
Application.NormalizeAllTopMosts;
//Falls Dein Anwendungsfenster minimiert werden soll, nächste Zeile auskommentieren //SendMessage (Application.mainform.handle, wm_SysCommand, sc_Minimize, 0); Application.ProcessMessages; BringWindowToTop (FindWindow ('opusApp', NIL)); //... evtl. weitere Aktionen Application.RestoreTopMosts; Die nächste Zeile sorgt dafür, dass Dein Hauptformular minimiert wird (falls gewünscht). Mit BringWindowToTop wird Word auf die oberste Ebene des Z-Fensterstapels verfrachtet. RestoreTopMosts stellt wieder den Ursprungszustand Deiner Fenster her, lässt Word aber im Vordergrund. Das funktioniert zumindest bei meinem Programm PC-Adreßzz!, welches auch Word startet, Adressdaten an ein Briefformular übergibt und Word dann anzeigt. |
AW: COM - Word in den Vordergrund bringen
Vielen Dank Harry Stahl, es funktioniert. :)
Endlich ist das Problem gelöst. Was ich da schon für Stunden gegoogelt und ausprobiert habe. Darauf wäre ich ja nie gekommen. Nochmals vielen Dank und viele liebe Grüße aus Berlin von MichiZi :) Funktioniert auch mit Excel:
Delphi-Quellcode:
und mit Outlook:
Application.NormalizeAllTopMosts;
Application.ProcessMessages; BringWindowToTop (FindWindow ('XLMAIN', NIL)); Application.RestoreTopMosts;
Delphi-Quellcode:
Application.NormalizeAllTopMosts;
Application.ProcessMessages; BringWindowToTop (FindWindow ('MAPI', NIL)); Application.RestoreTopMosts; |
AW: COM - Word in den Vordergrund bringen
Kleine Anmerkung am Rande, weil ich auch mal einen "Reportgenerator" in Word durch Ersetzung von Textmarken entwickelt hatte. OLEVariant ist, abgesehen vom händischen Tippen, die langsamste Zugriffsmöglichkeit, die Du Dir dazu hättest aussuchen können. Bei 10 Textmarken ist das vermutlich egal. Ich hatte über 300...da merkt man das schon :D
Sherlock |
AW: COM - Word in den Vordergrund bringen
Hallo Sherlock,
das war bisher mein Ansatz: ![]() Wenn es eine bessere Variante gibt, bin ich für jeden weiteren Hinweis dankbar. Ich hab wirklich nur maximal 8 Textmarken, da ist es noch flott. Danke Sherlock :) |
AW: COM - Word in den Vordergrund bringen
Dann mach Dir keine Gedanken. Wie gesagt, ist zwar ungefähr Faktor 10 langsamer, aber bei 8 Textmarken vernachlässigbar.
Sherlock |
AW: COM - Word in den Vordergrund bringen
Zitat:
Weiterhin viel Erfolg hier im Forum und mit Delphi.:thumb: |
AW: COM - Word in den Vordergrund bringen
Sherlock
Also bei mir ist es so: Ich klicke auf den WordReportButton und meine Form ist noch sichtbar und der User sieht ein sich drehenden Kreis als Sanduhr verkleidet. Sind alle Textmarken gefüllt wird Word erst sichtbar. Bei 300 Textmarken würde ich eine Progressbar in Aktion setzen. Also ist alles schön Anwendergerecht, der kann nämlich dann erst mal eine Pause machen. Wenn ich so eine Situation mit 300 Textmarken hätte, würde ich erst mal meine TOfficePartner Komponente raus kramen. Die ist gar nicht mal so schlecht und Freeware. Ob das auch alles mit Office 2007 und aufwärts funktioniert wird sich dann zeigen. Viele Grüße aus Berlin :) MichiZi Delphi2005(NetFrameWork 1.1), Windows 8.1 mein Ziel: RadStudio XE6 :wink: :-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:35 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