AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi OLE-Object bei mehreren Instanzen der Exe
Thema durchsuchen
Ansicht
Themen-Optionen

OLE-Object bei mehreren Instanzen der Exe

Ein Thema von ThoPos · begonnen am 22. Apr 2014 · letzter Beitrag vom 22. Apr 2014
Antwort Antwort
ThoPos

Registriert seit: 30. Jun 2004
Ort: Köln
69 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

OLE-Object bei mehreren Instanzen der Exe

  Alt 22. Apr 2014, 09:43
Hallo zusammen,

ich stehe vor folgendem Problem:

Ich möchte aus meiner Anwendung einen Text per Drag&Drop nach MS Word ziehen und anschließend den Text in Word als Textmarke festlegen. Für die D&D-Funktionalität benutze ich die Komponenten von melander.dk

Bisher sieht mein Code so aus:

Delphi-Quellcode:
procedure TFrmOffice.DTSOfficeAfterDrop(Sender: TObject; DragResult: TDragResult; Optimized: Boolean);
var
  app, doc: OLEVariant
begin
  app := GetActiveOLEObject('Word.Application');
  doc := app.ActiveDocument;
  doc.bookmarks.add(_Text, app.selection.range);
  doc := UnAssigned;
  app := UnAssigned;
end;
Funktioniert eigentlich super ... solange der Anwender nicht die WINWORD.EXE mehrfach laufen hat. Denn dann erhielt ich bei meinen Tests in 1 von ca. 20 Fällen mit GetActiveOLEObject die falsche WINWORD-Instanz.

Kennt einer von Euch einen Trick, wie ich über das Handle (mittels GetForegroundWindow erhalten) das richtige OLE-Object verbinden kann? Natürlich bin ich auch für andere Lösungsansätze offen.

Gruß aus Köln
Thomas
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.132 Beiträge
 
Delphi 12 Athens
 
#2

AW: OLE-Object bei mehreren Instanzen der Exe

  Alt 22. Apr 2014, 09:52
Du könntest dir alle OLE-Objekte geben lassen,
zu jedem das zugehörige Parent-Fenster auslesen (und/oder die Prozess-ID)
und dann nimmst du dir das OLE-Objekt davon, welches auf dem GetForegroundWindow liegt. (bzw. die selbe Prozess-ID besitzt, wie das GetForegroundWindow)


Ist der Eingabefokus im AfterDrop eigentlich wirklich immer beim Word, oder vielleicht doch wo anders? (z.B. wieder/noch bei deinem Programm)
Wenn nicht, dann liefert GetForegroundWindow natürlich nicht Word, sondern das andere Programm.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (22. Apr 2014 um 09:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: OLE-Object bei mehreren Instanzen der Exe

  Alt 22. Apr 2014, 10:15
Jetzt die allseits beliebte Frage, wofür soll das gut sein?
Wenn der Benutzer schon einen Text in Word einfügt, warum dann nicht gleich das Setzen einer Textmarke durch Word erledigen lassen?
Solch ein Benutzer/Programm1/Programm2 Kuddelmuddel ist nur sehr schwierig in den Griff zu bekommen, sprich es gibt mehr Fehlermöglichkeiten, als es die Phantasie des Programmierers sich ausmalen kann.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
ThoPos

Registriert seit: 30. Jun 2004
Ort: Köln
69 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: OLE-Object bei mehreren Instanzen der Exe

  Alt 22. Apr 2014, 11:01
Jetzt die allseits beliebte Frage, wofür soll das gut sein?
Ganz einfach:
Die Anwender müssen ihre Aufträge in einem zentralen System verwalten. Leider hat dieses System keinen so flexiblen Report-Generator, wie es die Vielzahl an Prüfmethoden in einem naturwissenschaftlichen Auftragslabor erfordern. Dafür gibt es aber eine Schnittstelle zu MS Word und MS Excel, welche die Daten in benannte Zellen bzw. an Textmarken einträgt. Hierbei ist der Syntax für die Benennung der Namen bzw. Textmarken nicht gerade anwenderfreundlich.
Deshalb habe ich ein Tool entwickelt, mit denen die Benennung anhand von Beispieldaten aus einem vorhandenen Auftrag erfolgen kann. Damit können jetzt die Laborant(inn)en ihre Vorlagen selber erstellen.

Funktioniert bei Excel phantastisch (hier kommt man relativ einfach an den Titel der aktiven Mappe und anschließend über die ROT an das OLE Object).
Nur bei Word klappt dies nicht, da der Titel immer "Microsoft Word Dokument" ist.

Bisher ist es immer so, daß beim Drop die Ziel-Applikation des Fokus erhalt und der eingefügte Text markiert ist.

Bzgl. des Tipp mit "alle OLE-Objekte ermitteln ..." stehe ich auf dem Schlauch. Ich habe so etwas noch nie programmiert und sege auch keinen Ansatz dafür.

Gruß aus Köln
Thomas
Thomas
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:01 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