Hallo Delphi Community,
da ich fast ausschließlich reine technische Berechnungen OHNE visuelle Komponenten programmiere, stoße ich mit folgender Aufgabenstellung leider an meine Grenzen:
Eine Berechnungsroutine ist über eine
DLL in Excel eingebunden und erledigt umfangreiche Berechnungen und übergibt diese an Excel. So weit, so gut.
Nun möchte ich innerhalb obiger NICHT-visueller Berechnungsroutine ein Editor-Fenster oder Memo-Fenster etc. zur Anzeige von Zwischenergebnissen zur Laufzeit aufmachen.
Wie läßt sich das bewerkstelligen?
Vielen Dank für Eure Hilfe im Voraus!
Gruß
Andreas
Ich nehme mal an, die Berechnung soll weiter laufen, während das Fenster angezeigt wird? Das kriegst Du nur hin, wenn eines von beiden in einem sekundären Thread läuft.
Zuerst mal: es ist kein Problem, in einer
DLL die
VCL zu verwenden, solange Du nur
modale Fenster anzeigst. Die haben ihre eigene Message loop und sind somit unabhängig von der message loop der Hostanwendung. Mein Vorschlag wäre also folgendes:
- Lege ein normales VCL Form für die Anzeige an
- In der nach Excel exportierten Funktion erzeugst Du eine Instanz dieses Forms und zeigst sie per ShowModal
- Im OnPaint event des Forms setzt Du zuerst OnPaint auf nil, damit der Handler nur einmal aufgerufen wird, und startest dann den Thread für die Berechnung
- Der Thread kann Zwischenergebnisse per Synchronize an das Form zur Anzeige schicken
- Wenn die Berechnung fertig ist legt der Thread das Ergebnis in einem Feld des Forms ab und setzt Modalresult auf mrOK, beendet sich dann
- In der exportierten Routine kehrt daraufhin der ShowModal-Aufruf zurück, die Routine holt das Ergebnis aus dem Feld des Forms, zerstört das Form, und gibt das Ergebnis an Excel zurück
Es gibt da noch ein potentielles Problem mit der Z-Order. Um das Meldungsfenster zuverlässig oberhalb des Excel-Fensters zu lassen solltest Du den formstyle auf fsTopMost setzen, oder die CreateParams-Methode überschreiben und params.wndParent auf den Rückgabewert von GetForegroundWindow setzen.