Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Prozess in einen anderen 'hineinrendern' (https://www.delphipraxis.net/174969-prozess-einen-anderen-hineinrendern.html)

Der schöne Günther 22. Mai 2013 12:49


Prozess in einen anderen 'hineinrendern'
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe eine Hauptanwendung und weitere optionale Bestandteile die als eigene Prozesse realisiert wurden. Momentan ist es so einfach, dass die Plugin-Bestandteile
  • auf dem selben System,
  • im gleichen Account,
  • und sogar Kindprozesse des Hauptprogramms
sind.

Das Hauptprogramm ist immer sichtbar und stellt einen Bereich zur Verfügung, in welchem die Plugins dargestellt werden sollen. Ganz grob einmal so wie im Anhang.

Bislang habe ich einfach das entsprechende Fenster des Plugins zum Kindfenster des Hauptprogramm-Fensters gemacht:
Delphi-Quellcode:
if SetParent(
   <Plugin-HWnd>,
   <Hauptprogramm-HWnd>
)=0 then
   logError();

if not SetWindowPos(
   <Plugin-HWnd>,
   HWND_TOP,
   640,
   8,
   0,
   0,
   SWP_FRAMECHANGED or SWP_NOSIZE or SWP_SHOWWINDOW //or SWP_NOMOVE
) then
   logError();

Das funktioniert eigentlich super. Ich frage mich nur,
  1. ob ich das richtig gemacht habe oder es bessere Wege gibt
  2. Was ich dagegen tun kann, dass das Hauptprogramm-Fenster mit einfriert, wenn es das Kindfenster tut!

Ich habe mir spaßeshalber auf der Oberfläche des Plugins einen Button mit
Delphi-Quellcode:
sleep(5000)
gelegt: Die Oberfläche des Plugins friert ein, die Hauptanwendung läuft weiter, die grafische Oberfläche wird auch weiterhin aktualisiert. Klicke ich nun irgendwo auf die Oberfläche des Hauptprogramms, wird diese auch nicht weiter aktualisiert.

Warum? :o
Ich lese immer von Multiple Document Interfaces, aber das scheint irgendwie auch eher eine Weltanschauung, als eine konkrete Menge an WinAPI-Befehlen zu sein, oder?

Neutral General 22. Mai 2013 14:12

AW: Prozess in einen anderen 'hineinrendern'
 
Ich kann dir leider nicht sagen warum dann der Hauptprozess nicht aktualisiert wird, aber MDI Anwendungen bestehen eigentlich aus einem Prozess und mehreren Fenstern und nicht aus mehreren Prozessen.

Ich könnte mir Vorstellen, dass es was damit zu tun haben könnte dass die Plugins Kindprozesse sind. Aber da kenne ich mich nicht wirklich aus. Keine Ahnung was für Auswirkungen Kindprozesse auf ihre "Eltern" haben können.
Du könntest ja mal (testweise) verusche die Plugins als eigenständige Prozesse starten.

Der schöne Günther 22. Mai 2013 14:23

AW: Prozess in einen anderen 'hineinrendern'
 
Zitat:

Zitat von Neutral General (Beitrag 1216069)
MDI Anwendungen bestehen eigentlich aus einem Prozess und mehreren Fenstern und nicht aus mehreren Prozessen

Schonmal gut zu wissen :thumb:

Ich kann auch einmal einen wildfremden Prozess nehmen, glaube aber nicht, dass es etwas damit zu tun hat - Im Grund geht es ja wohl um die Message Loop:

Wenn
  • das Plugin-Fenster das aktive Fenster im Hauptprogramm-Fenster ist
  • und hängt
  • und ich nun irgendwo in das Hauptprogramm-Fenster klicke

scheint Windows wohl direkt erst einmal (nicht asynchron!) eine Nachricht an das aktive Fenster dort drinnen zu senden. Das reagiert nicht, also hängt alles. Ob das so sein könnte? :gruebel:

Von FireMonkey habe ich (noch) keine Ahnung, der Satz "As such, Firemonkey can serve as merely a UI for an external application, or serve as the application itself." auf Wikipedia hat mich allerdings neugierig gemacht. Vielleicht wäre FM ja eine bessere Lösung?


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