AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Nachrichtenschleife für nicht-modales Formular (DLL)

Nachrichtenschleife für nicht-modales Formular (DLL)

Ein Thema von Gloegg_FHBI · begonnen am 27. Mai 2008 · letzter Beitrag vom 28. Mai 2008
Antwort Antwort
Benutzerbild von Gloegg_FHBI
Gloegg_FHBI

Registriert seit: 28. Nov 2006
Ort: Neuss
46 Beiträge
 
Delphi 10 Seattle Professional
 
#1

Nachrichtenschleife für nicht-modales Formular (DLL)

  Alt 27. Mai 2008, 15:20
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.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Nachrichtenschleife für nicht-modales Formular (DLL)

  Alt 27. Mai 2008, 15:28
Die Threads in der DLL werden wahrscheinlich Probleme bei synchronize bekommen.

Und was meinst du mit fehlender Nachrichtenschleife? Dein neues Formular bekommt keine Messages?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Gloegg_FHBI
Gloegg_FHBI

Registriert seit: 28. Nov 2006
Ort: Neuss
46 Beiträge
 
Delphi 10 Seattle Professional
 
#3

Re: Nachrichtenschleife für nicht-modales Formular (DLL)

  Alt 27. Mai 2008, 15:38
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...
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Nachrichtenschleife für nicht-modales Formular (DLL)

  Alt 27. Mai 2008, 15:57
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Gloegg_FHBI
Gloegg_FHBI

Registriert seit: 28. Nov 2006
Ort: Neuss
46 Beiträge
 
Delphi 10 Seattle Professional
 
#5

Re: Nachrichtenschleife für nicht-modales Formular (DLL)

  Alt 28. Mai 2008, 09:08
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...)
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Nachrichtenschleife für nicht-modales Formular (DLL)

  Alt 28. Mai 2008, 10:31
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Gloegg_FHBI
Gloegg_FHBI

Registriert seit: 28. Nov 2006
Ort: Neuss
46 Beiträge
 
Delphi 10 Seattle Professional
 
#7

Re: Nachrichtenschleife für nicht-modales Formular (DLL)

  Alt 28. Mai 2008, 10:52
Ja, mit dem Checksynchronize hat es geklappt, Vielen Dank.

Auf ActiveX umstellen ... tja, da kenn ich mich zuwenig aus, vielleicht beim nächsten Projekt...
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:14 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