Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi OLE Excel Handle (https://www.delphipraxis.net/134404-ole-excel-handle.html)

Anonymos 21. Mai 2009 13:38


OLE Excel Handle
 
Hallo DP'ler

Ich stehe im Moment vor folgendem Problem:

Ich schreibe gerade an einer MDI-Anwendung.
Dabei möchte ich aus mehreren StringGrids Daten in eine Exceltabelle schreiben.
Diese Daten in Excel reinzuschreiben ist dank OLE kein Problem.
Leider öffnet OLE Excel "ganz normal".
Ich würde diese neu geöffnete Excel-Anwendung jedoch gerne wie ein MDI-Child in meiner Anwendung haben.
Dazu benötige ich jedoch das Handle von dem Excelfenster.

Ist es also möglich dieses Handle irgendwie via diesem OLE-Variant herauszubekommen?

Wenn ich des ganze über FindWindow mache habe ich leider das Problem, dass ich nicht eindeutig sicher sein kann, genau meine neue Excel-Anwendung zu haben (es könnte auch jede belibige andere offene sein).

mfg

toms 24. Mai 2009 10:15

Re: OLE Excel Handle
 
Hallo

Wie öffnest du Excel?

Anonymos 24. Mai 2009 14:56

Re: OLE Excel Handle
 
Hey,

Ich benutze nafür die Variable Variant in ComObj

Delphi-Quellcode:
ExcelApplication, ExcelWorksheet: Variant;

ExcelApplication := CreateOleObject('Excel.Application');
ExcelApplication.Visible := true;
ExcelApplication.Application.SheetsInNewWorkBook := 1;
ExcelApplication.Workbooks.Add;
ExcelWorlsheet := ExcelApplication.Sheets[1];
ExcelWorksheet.Select;
...
Das erstellt jedesmal eine neue ExcelApplication mit einem Worksheet.

Gibt es mehrere Möglichkeiten sowas zu öffnen?
Ich weiß zwar, dass es noch andere Schnittstellen gibt, damit kenn ich mich aber überhauptnicht aus.

sx2008 24. Mai 2009 15:28

Re: OLE Excel Handle
 
Du musst vorher schauen, ob Excel schon läuft.
Excel registriert sich selbst in der ROT (running object table) und das kann man mit GetActiveOleObject abfragen.
Delphi-Quellcode:
try
  // Versuche bestehende Excel-Anwendung aus der ROT zu holen
  ExcelApplication:=GetActiveOleObject('Excel.Application');
except
  // falls das fehlschlägt eine neue Excel-Anwendung starten
  ExcelApplication:=  CreateOleObject('Excel.Application');
end;

Anonymos 24. Mai 2009 15:51

Re: OLE Excel Handle
 
Was würde denn dabei passieren, wenn es schon mehrere Excelanwendungen gibt?
bekomm ich dann irgendene, oder kann ich mir die vllt alle der Reihe nach auflisten lassen?

sx2008 24. Mai 2009 15:59

Re: OLE Excel Handle
 
Du bekommst die aller erste, die gestartet wurde und sich in der ROT registriert hat.
Wie man eine Liste bekommt, ist mir nicht bekannt.

Anonymos 24. Mai 2009 16:11

Re: OLE Excel Handle
 
Aber an das Handle dieser Anwendung komm ich immernoch nich?

Ich mein ich könnt natürlich dem Fenstertitel einen total Exotischen Namen geben, un diesen dann über Findwindows suchen, aber ...
Das ist irgendwie keine Schöne Lösung

mfg

toms 24. Mai 2009 16:21

Re: OLE Excel Handle
 
Ab Excel 2002 kommst du an das Handle des Fensters mit

Delphi-Quellcode:
ExcelApplication.hwnd

sx2008 24. Mai 2009 16:27

Re: OLE Excel Handle
 
Zitat:

Zitat von Anonymos
Aber an das Handle dieser Anwendung komm ich immernoch nich?

Wozu? Du brauchst es nicht.
Du öffnet die Excel-Anwendung nur einmal und erzeugst dann soviele Workbooks, wie du Stringgrids in deiner Anwendung hast.
Ein Workbook entspricht einer Exceldatei.
Du kannst auch ein Workbook mit mehreren Worksheets (Arbeitsblätter) erzeugen; dann hast du alle Daten in einer Exceldatei.

Anonymos 24. Mai 2009 16:41

Re: OLE Excel Handle
 
Nein, nein, das ist ja garnich mein Problem,
in meinem Code öffne ich ja genau nur 1 Workbook mit einem Worksheet.

Sondern,
Ich würde das ganze gerne als MDI-Child in meine Anwendung einbinden,
also sozusagen vom Desktop klauen und als Parent meine MDI-Form angeben.
Sodass das ganze dann in meiner Anwendung gefangen ist.

Das kann ich über SetWindowPlacement machen,
dann geb ich dabei das Handle des Parents und das des anderen Fensters an.
Das hat bisher auch so priema geklappt, bis auf den SpeichernDialog, der nicht mehr angezeigt wurde.


Das Handle kann ich also einfach mit Excel.hwnd herausbekommen?

Gott, is das primitiv :-D
An sowas denkt man doch nicht :-(

thx

Aber habt ihr vllt eine Ahnung, warum das mit dem Dialogfenster nicht funzt?
Das erscheint einfach nirgendwo mehr, weder auf dem Desktop, noch in meiner Anwendung.

toms 24. Mai 2009 16:51

Re: OLE Excel Handle
 
Nimm mal SetParent anstatt SetWindowPlacement.
Delphi-Quellcode:
Windows.SetParent(ExcelApplication.HWND, Self.Handle);

Anonymos 24. Mai 2009 17:12

Re: OLE Excel Handle
 
Oh sorry, da is mir en Fehler unterlaufen,

SetWindowPlacement verändert ja nur die Fensterposition.

Ich meinte natürlich SetParent();

Also des geht nicht. Des setzt zwar das Fenster schön zu mir in die Anwendung, aber dieser Dialog bleibt da irgendwo auf der Strecke.

sx2008 24. Mai 2009 21:33

Re: OLE Excel Handle
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Anonymos
Ich würde das ganze gerne als MDI-Child in meine Anwendung einbinden,
also sozusagen vom Desktop klauen und als Parent meine MDI-Form angeben.
Sodass das ganze dann in meiner Anwendung gefangen ist.

Achso...sag's doch gleich.
Aber das mit dem Fensterhandle ist Käse.
Du solltest stattdessen einen OLEContainer verwenden.
Damit kann man beliebige OLE-Controls in die eigene Anwendung einbinden.

Ich hab dir mal einen Screenshot gemacht.
Bei Office 2007 stört das neue Toolbarkonzept; bei Office 2003 ist das besser, weil die die Excelmenupunkte in dein Hauptmenu integrieren.

Anonymos 26. Mai 2009 16:28

Re: OLE Excel Handle
 
Ah, des is natürlich ne feine Sache,
ich kannte bisher nur dieses komische V1Book, un des is einfach nur MIST!!!
und auch überhaupt nicht kompatibel.

Dann kann ich mir also quasi ein eigenes "Excel-Formular" erstellen.
Über .OLEObject kann ich dann ganz normal aus meinem Quellcode aus via VBA zugreifen.

Jetzt nurnoch eine Sache

In der Menüleiste fehlt der Eintrag "Datei"
d.h. ich kann nicht speichern un nich beenden.

Des müsst ich dann alles über den OLEContainer machen und eigens ein Menü anlegen?
(Es war halt genau das Beenden was bisher nicht geklappt hat)

shmia 26. Mai 2009 17:53

Re: OLE Excel Handle
 
Zitat:

Zitat von Anonymos
In der Menüleiste fehlt der Eintrag "Datei" d.h. ich kann nicht speichern un nich beenden.

Beim Hauptmenue gibt es bestimmte Regeln, die beim TOleContainer beachtet werden müssen.
Es hängt vom Groupindex der MenuItems ab, an welcher Stelle die Menübefehle eingeblendet werden.
Das ist in der OH von TOleContainer beschrieben.

Anonymos 31. Mai 2009 13:12

Re: OLE Excel Handle
 
OK hab alles gefunden und verstanden.
War echt ne super Hilfe

Danke an alle
mfg


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