Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   COM - Word in den Vordergrund bringen (https://www.delphipraxis.net/181397-com-word-den-vordergrund-bringen.html)

onk 11. Aug 2014 17:47

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:
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;
In Form6 starte ich Word über COM. In einem Wordtemplate habe ich die Textmarke "titel" eingfügt.
Delphi-Quellcode:
// 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;
So jetzt kommt es, die OleVariant ist auf folgende Werte eingestellt:
Delphi-Quellcode:
// ob die Reihenfolge so richtig ist? funktionieren tuts ja...
objword.Activate;
objword.WindowState:=wsNormal;
objword.Visible:=true;
Word starttet korrekt, füllt die Textmarken aus bleibt aber im Hintergrund, so ein Mist… seufz
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:
// 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.
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.
Bin über jeden Tipp dankbar.
Liebe Grüße aus Berlin
MichiZi





:-D

Harry Stahl 11. Aug 2014 20:01

AW: COM - Word in den Vordergrund bringen
 
Vielleicht hilft das (nach Deinen ersten 3 Zeilen, also nach "objword.Visible:=true;"):

Delphi-Quellcode:
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;
Kurze Erläuterung: NormalizeAllTopmost macht alle Deine Fenster Nichtmodal, so dass andere Fenster (z.B. eben Word) darüber liegen können.
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.

onk 12. Aug 2014 06:20

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:
Application.NormalizeAllTopMosts;
Application.ProcessMessages;
BringWindowToTop (FindWindow ('XLMAIN', NIL));
Application.RestoreTopMosts;
und mit Outlook:
Delphi-Quellcode:
Application.NormalizeAllTopMosts;
Application.ProcessMessages;
BringWindowToTop (FindWindow ('MAPI', NIL));
Application.RestoreTopMosts;

Sherlock 12. Aug 2014 08:25

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

onk 12. Aug 2014 10:39

AW: COM - Word in den Vordergrund bringen
 
Hallo Sherlock,
das war bisher mein Ansatz: Word und Textfelder...
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 :)

Sherlock 12. Aug 2014 10:49

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

Harry Stahl 12. Aug 2014 17:07

AW: COM - Word in den Vordergrund bringen
 
Zitat:

Zitat von onk (Beitrag 1268420)
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 :)

Gern geschehen. Freut mich, dass Deine erste Frage im Forum direkt erfolgreich geklärt werden konnte.
Weiterhin viel Erfolg hier im Forum und mit Delphi.:thumb:

onk 12. Aug 2014 20:58

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 09:18 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