Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi OLE-Object bei mehreren Instanzen der Exe (https://www.delphipraxis.net/180089-ole-object-bei-mehreren-instanzen-der-exe.html)

ThoPos 22. Apr 2014 09:43

OLE-Object bei mehreren Instanzen der Exe
 
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

himitsu 22. Apr 2014 09:52

AW: OLE-Object bei mehreren Instanzen der Exe
 
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.

p80286 22. Apr 2014 10:15

AW: OLE-Object bei mehreren Instanzen der Exe
 
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

ThoPos 22. Apr 2014 11:01

AW: OLE-Object bei mehreren Instanzen der Exe
 
Zitat:

Zitat von p80286 (Beitrag 1256460)
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:07 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