Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Nachrichtenschleife für nicht-modales Formular (DLL) (https://www.delphipraxis.net/114570-nachrichtenschleife-fuer-nicht-modales-formular-dll.html)

Gloegg_FHBI 27. Mai 2008 15:20


Nachrichtenschleife für nicht-modales Formular (DLL)
 
Hallo Delphianer,

Ich schreibe grade ein Programm so um, das es von einer anderen Anwendung über eine DLL aufgerufen werden kann. Das Problem dabei ist, dass das Hauptformular mit Show und nicht mit ShowModal aufgerufen werden muss. So erhält das Formular keine Nachrichtenschleife und kurioserweise bekommen einige Threads, die vom Formular, bzw. von eingebetteten Frames gestartet werden keine Rechenzeit zugeteilt. Sobald ein modaler Dialog geöffnet wird, läuft wieder alles korrekt.

Die Funktion um das Formular aus der DLL anzuzeigen sieht so aus:
Delphi-Quellcode:
function ShowForm(aHandle : HWND) : longint;
var
  aForm : TBodyFrm;
begin
  // save Application.Handle
  oldHandle := Application.Handle;
  Application.Handle := aHandle;
  { create and show form }
  aForm := TBodyFrm.Create(Application);
//aForm.Parent := Application.MainWindow;
  aForm.Show;
  Result := longint(aForm);
end;
Wie verschaffe ich dem aufzurufenden Formular eine Nachrichtenschleife?

PS: Ich habe alle mir und Google bekannten Foren, Tutorials, etc. zum Thema gelesen, aber nirgendwo konnte ich eine funktionierende Methode finden.

sirius 27. Mai 2008 15:28

Re: Nachrichtenschleife für nicht-modales Formular (DLL)
 
Die Threads in der DLL werden wahrscheinlich Probleme bei synchronize bekommen.

Und was meinst du mit fehlender Nachrichtenschleife? Dein neues Formular bekommt keine Messages?

Gloegg_FHBI 27. Mai 2008 15:38

Re: Nachrichtenschleife für nicht-modales Formular (DLL)
 
Hmm, stimmt, die Threads, die mit Synchronize arbeiten machen die Probleme, aber warum laufen die an, wenn ein Modales Fenster geöffnet wird (egal ob Formular oder ein MessageDlg)

In diesem Thread wurde mir gesagt, das mein Formular keine Nachrichtenschleife hat... es gab leider kein Wieso, weshalb, warum...

sirius 27. Mai 2008 15:57

Re: Nachrichtenschleife für nicht-modales Formular (DLL)
 
Das Handle umzubiegen dürfte nix bringen. Und eine eigene Message-Schleife brauchst du nicht in einem gesonderten Formular einer DLL osndern in einem extra Thread. Da aber der Aufruf von Showform wohl hoffentlich im MainThread erfolgt, sollten auch die Nachrichten dort ankommen. Keine Ahnung warum das nicht der Fall ist.

Das mit synchronize ist klar. Funktioniert nur zufällig bei showmodal. Hier kommen sich die beiden Instanzen von Application in die Quere. Synchronize geht leider nicht in einer DLL.

Gloegg_FHBI 28. Mai 2008 09:08

Re: Nachrichtenschleife für nicht-modales Formular (DLL)
 
Ok, wenn ich Synchronize weglasse funktioniert es wie geplant. Ist aber unschön, da in den Threads auf TChartSeries zugegriffen wird, die ja Bestandteil der VCL sind. Gibt es eine andere Methode um das abzusichern? (Momentan klappt das, da sobald das DLL-Formular etwas an den Serien ändern will, die Threads pausiert, aber es könnte ja durchaus sein, das z.B. bei einem automatischen neuzeichnen des Charts, irgendwas falschläuft...)

sirius 28. Mai 2008 10:31

Re: Nachrichtenschleife für nicht-modales Formular (DLL)
 
Ich weis nicht, ob es für dich noch sinnvoll ist eine "einfache" DLL einzusetzen. Vielleicht geht es schon mehr Richtung ActiveX. Das nur als Hinweis. Es könnte durchaus sein, dass sich derzeit nach der Lösung eines Problems zwei neue auftun. Klassen in DLL ist schon so eine Sache, Klassen mit sichtbaren Elementen noch mehr.

Zu deinem aktuellen Problem. Es gibt verschiedene Varianten. Du kannst auf synchronize verzichten und mit Messages, Critical Sections etc. arbeiten. Das bedarf aber einer gewissen Umstellung deines Programms.

Mir ist aber grad etwas eingefallen, wir wir synchronize in einer DLL zum Leben erwecken:
1. Application.Handle umbiegen (so wie du es gemacht hast)
2. im Hauptprogramm TApplicationEvents einsetzen und auf onIdle und onMessage (bei onMessage, nur bei Message=WM_Null) reagieren
3. Bei diesen beiden Ereignissen eine funktion der DLL aufrufen, die wiederum aus der Unit Classes CheckSynchronize innerhalb der DLL aufruft.
Vielleicht klappt das ja.

Gloegg_FHBI 28. Mai 2008 10:52

Re: Nachrichtenschleife für nicht-modales Formular (DLL)
 
Ja, mit dem Checksynchronize hat es geklappt, Vielen Dank.

Auf ActiveX umstellen ... tja, da kenn ich mich zuwenig aus, vielleicht beim nächsten Projekt...


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