![]() |
Re: Fenster einer DLL in den Vordergrund
Also,
@tigerman: wenn du das so siehst, dann wird die DLL dynamisch eingebunden. Ich versuche das ganze Verfahren noch mal zu erläutern: Das Fenster1, welches im Vordergrund bleibt, wird irgendwann von der Applikation aus mit Show() aufgerufen. Im weiteren Verlauf, also solange das Fenster1 noch gezeigt wird, wird dann die DLL geladen. In der DLL wird über ein Hilfsfenster Fenster2 (ist uninteressant) das Fenster3 in der Fenster2.FormShow() über die Funktion Fenster3.ShowModal() aufgerufen. Nun wird in der Funktion Fenster3.OnShow() dieses Fenster in den Vordergrund gestellt mit Fenster3.BrintToFront(). Aber das macht er nicht! Alle Fenster werden jeweils in den DPR-Files zu Beginn erstellt mit Application.CreateFrom(TForm, Form). Als zusätzliche Info: Das passiert ja nicht nur bei Fenstern. Auch wenn ich in einer DLL eine Message ausgebe ist diese dann auch im Hintergrund und man denkt die Applikation ist abgeschmiert, weil ja nichts passiert. Die Message aber ist hinter dem Fenster1. @Ianis: Die Sache mit der Handleübergabe funktioniert auch nicht. :( gruß, moony |
Re: Fenster einer DLL in den Vordergrund
Sehr rätselhaft. Hast du schonmal probiert Fenster2 und/oder Fenster3 nicht automatisch am Anfang erzeugen zu lassen, sondern von Hand, dynamisch zu erzeugen?
Zitat:
|
Re: Fenster einer DLL in den Vordergrund
Fenster2 ist ja total irrelevant, da dieses Fenster nur Mittel zum Zweck ist und dort verwendete KADAO Komponenten gelagert werden. Fenster3 wird ja in der Fenster2.OnShow aufgerufen. Dort habe ich auch versucht dann erst Fenster3 mit
Delphi-Quellcode:
zu erstellen und bei der Fenster3.OnClose() das Fenster wieder mit
Fenster3 := TFenster3.Create(Fenster3);
Delphi-Quellcode:
freizugeben. Aber irgendwie will mich hier jemand ärgern. Wie gesagt, das Problem besteht nicht nur bei Fenstern sondern auch bei popeligen Showmessages. Die lassen sich auch nicht in den Vordergrund setzen!
Fenster3.Release;
Ich glaub das ist hoffnungslos.... :cry: Was dein Verständnis von Fenster1 betrifft, NEIN das Fenster soll nicht im Vordergrund bleiben. Das ist ja mein Problem. Es bleibt nämlich im Vordergrund, obwohl das Fenster ja in diesem Moment inaktiv ist. |
Re: Fenster einer DLL in den Vordergrund
Es würde helfen, wenn du nochmal ein bisschen mehr vom Code posten würdest. Vor allem dem, was in der DLL steht.
|
Re: Fenster einer DLL in den Vordergrund
So wirklich viel mehr bringt es nicht zu posten, da das Programm bereits zu komplex aufgebaut ist und viel zu viele Ereignisse durchgeführt werden. Aber ich versuche es ein wenig übersichtlicher zu gestalten:
In der Applikation sieht das ganze so aus: In der Projektdatei werden die Formulare erstellt:
Delphi-Quellcode:
Anschließend wird beim klicken auf eine Schaltfläche das Fenster1 aufgerufen:
Projekt.dpr
uses ... begin Application.Initialize; ... // Erstellung des Fenster1 zur Laufzeit Application.CreateForm(TFenster1, Fenster1); ... Application.Run; end.
Delphi-Quellcode:
Innerhalb der DLL wird dann folgendermaßen verfahren:
unit Applikation;
... procedure Schaltfläche.OnClick(); type TmyFunc = function :boolean;stdcall; var CustFunc : TFarProc; CustHdl : THandle; myFunc : TmyFunc; DllName, Funktion : String; begin ... // Das Fenster der Applikation wird geöffnet Fenster1.Show; ... // Dynamischer Aufruf der DLL CustHdl := LoadLibrary(PChar(extractfilepath(application.exename) + DLLName)); CustFunc := GetProcAddress(CustHdl, PChar(Function)); if CustFunc <> nil then begin @myFunc := CustFunc; Result := myFunc; end; // DLL wieder freigeben FreeLibrary(CustHdl); end;
Delphi-Quellcode:
Innerhalb der geladenen DLL wird das Hauptfenster Fenster2 geöffnet. Hier wird in der Prozedur Fenster2.FormShow() der folgende Aufruf getätigt:
library DLLName;
uses ... begin Application.initialize; Application.CreateForm(TFenster2, Fenster2); Application.CreateForm(TFenster3, Fenster3); end.
Delphi-Quellcode:
Anschließend wird in der Prozedur Fenster3.FormShow() der folgende Aufruf gesetzt:
unit Fenster2;
... procedure Fenster2.FormShow(); begin ... Fenster3.ShowModal; if Fenster3.ModalResult = mrCancel then Exit; ... end;
Delphi-Quellcode:
So ist der Stand wie zu Anfang beschrieben. Jedoch bringt das ja nicht.
unit Fenster3;
... procedure Fenster3.FormShow(); begin Fenster3.BringToFront; end; Habe ebenfalls versucht die Fenster2/3 dynamisch zu erstellen, das hat aber auch nichts gebracht. Ich hatte zuerst gedacht das geht, aber nach der nächsten Kompillierung wurden alle Fenster wieder hinter Fenster1 gesetzt. Showmessages zeigen den gleichen Effekt wie Fenster2 & 3, nämlich dass sie hinter dem Fenster1 bleiben und nicht im Vordergrund gezeigt werden können. Sehr blöd, wenn die Message kleiner als das Fenster1 ist. So, hoffe jetzt ist das übersichtlicher und eine Lösung findet sich. gruß, moony |
Re: Fenster einer DLL in den Vordergrund
Steht die Application-Variable denn innerhalb einer DLL überhaupt zur Verfügung? Die DLL könnte ja von mehreren Anwendungen gleichzeitig benutzt werden, auf welche davon verweist dann Application? Ich vermute mal, dass die DLL eine eigene Application-Variable hat. Wenn hierfür nun Fenster erstellt werden und deine Haupt-Anwendung gerade den Fokus hat, sind diese DLL-Fenster natürlich im Hintergrund.
Versuch doch mal, die Fenster explizit in einer Prozedur zu erstellen, der du die Application-Variable der Hauptanwendung übergibst. Mit dieser erstellst du dann die Fenster. (Oder du machst es gleich mit TFenster2.Create(Fenster1) ) Funktioniert das? |
Re: Fenster einer DLL in den Vordergrund
Zitat:
Zitat:
Zitat:
Zitat:
Eigenständig erstellt hab ich diese auch, hat aber recht wenig genutzt. Zumindest hat er das beim ersten Kompillieren nach vorne gesetzt und bei jedem weiteren nicht mehr. Zitat:
Das ist doch alles nicht wahr. :wall: Es muß doch eine Möglichkeit geben diese dämlichen Fenster in den Vordergrund zu setzen. Und vor allem kann es ja nicht an dem Aufruf der Fenster liegen, weil normale Showmessages ebenfalls im Hintergrund bleiben! |
Re: Fenster einer DLL in den Vordergrund
Du hast mich ein wenig falsch verstanden.
Dass das gleichzeitige Benutzen einer DLL durch mehrere Programme eine Schutzverletzung zur Folge haben soll ist mir neu. Wieso sollte das so sein? Dass die Application-Variable innerhalb der DLL eine andere ist als innerhalb der Applikation hatte ich vermutet (die meisten meiner Fragen waren eher rethorischer Natur). Deswegen ja auch mein Vorschlag:
Delphi-Quellcode:
Das ist untested, aber ich erhoffe mir davon, dass es das Problem löst, da die beiden Fenster von der Anwendung erzeugt werden, die auch tatsächlich gerade den Fokus hat, und nicht von der DLL selbst.
// In der DLL:
procedure CreateFenster(const AnAplication: TApplication); begin AnApplication.CreateForm (TFenster2, Fenster2); AnApplication.CreateForm (TFenster3, Fenster3); end; // Dann Aufruf aus dem Hauptprogramm: CreateFenster (Application); |
Re: Fenster einer DLL in den Vordergrund
Hallo,
hab das jetzt anders gelöst. die Form, welche in der ersten Applikation immer im Vordergrund ist, war auf StayOnTop gesetzt. Es hatte auch einen bestimmten Grund, aber ich habs jetzt entfernt. Danke für alles. Gruß, Moony |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz