Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Fenster einer DLL in den Vordergrund (https://www.delphipraxis.net/56964-fenster-einer-dll-den-vordergrund.html)

Moony 14. Nov 2005 11:27


Fenster einer DLL in den Vordergrund
 
Hallo zusammen!

Habe das Problem, dass ich aus meiner Applikation aus in einer bestimmten Routine eine DLL starte. In der Applikation ist ein weiteres Fenster geöffnet und wird somit als inaktives Fenster gekennzeichnet. Alles schön und gut. Jetzt wird in der DLL ein anderes Fenster geöffnet und hier ist das Problem. Das Fenster ist zwar aktiv, aber es läßt sich nicht mit den Befehlen "BringToFront()" oder "SetForeGroundWindow()" in den Vordergrund setzen. Ebenso ist das bei Messages die dann im Hintergrund sind. :wall:
Ich hoffe mir kann da jemand weiterehelfen.

Gruß, moony

etom291272 14. Nov 2005 13:02

Re: Fenster einer DLL in den Vordergrund
 
poste bitte mal den code der dll wo das fenster erzeugt und angezeigt wird

Moony 14. Nov 2005 13:44

Re: Fenster einer DLL in den Vordergrund
 
Die DLL wird statisch aus der Applikation aus aufgerufen und nach Rückgabe des Wertes direkt wieder freigegeben:

Delphi-Quellcode:
function DLLLaden(dllname, functionname: String):Boolean;stdcall;export;
type Tcustfunction=function (var Names,Values:pchar):boolean;stdcall;

var cfunction : tcustfunction;
    custhdl  : Thandle;
    Func     : TFarProc;
begin
  ...
  custhdl := LoadLibrary(PChar(extractfilepath(application.exename) + dllname));
  custfunc := GetProcAddress(custhdl,pchar(functionname));
  if custfunc <> nil then
  begin
    @cfunction := custfunc;
    result:=true;
  end
  else begin
    result := false;
    FreeLibrary(custhdl);
    exit;
  end;
  result := cfunction(...,...);
  FreeLibrary(custhdl);
  ...
end;
Das Fenster wird ja dann normal mit dem Laden der DLL erzeugt. Aufgerufen wird das Fenster hier:

Delphi-Quellcode:
Procedure DLL.FormShow();
begin
  ...
  Fenster.ShowModal;
  if Fenster.ModalResult := mrCancel then Exit;
  ...
end;
dann...
Delphi-Quellcode:
Procedure Fenster.FormShow();
begin
  Fenster.BringToFront;
end;
Ich hoffe das kann dir weiterhelfen. Das sind die wichtigsten Aufrufe.

gruß, moony

chaosben 14. Nov 2005 14:07

Re: Fenster einer DLL in den Vordergrund
 
Nach meinem Wissensstand muss ich dich leider enttäuschen: So geht es nicht. Scheinbar liegt es daran, das das Eltern-Fenster sein "neues Kind" nicht als VCL-Fenster anerkennt und es deshalb auch nicht so behandelt. Du könntest eventuell versuche, das Kind-Fenster als Objekt zu übergeben und es von den Eltern erzeugen zu lassen (wie das in Natur ebenfalls gemacht wird :stupid: )

Moony 14. Nov 2005 14:36

Re: Fenster einer DLL in den Vordergrund
 
Verstehe ich nich! :gruebel:

Es wird doch in der Applikation Fenster1 über ShowModal geöffnet. Während das Fenster1 gezeigt wird, wird von der Applikation eine DLL statisch geladen. In der DLL wird das Fenster2 als Übergang aufgerufen. In diesem Fenster2 wird ein weiteres Fenster3 aufgerufen. Das kann doch nicht so schwer sein die Fenster aus der DLL in den Vordergrund bringen zu können. Fenster1 hat ja überhaupt keine Ahnung davon dass es Fenster2 & Fenster3 gibt.

tigerman33 14. Nov 2005 14:39

Re: Fenster einer DLL in den Vordergrund
 
Vielleicht kann ich ja nur nicht richtig lesen, aber wo wird in dem Code denn überhaupt das Fenster erzeugt?

Moony 14. Nov 2005 14:51

Re: Fenster einer DLL in den Vordergrund
 
Die Fenster von der Applikation werden beim Starten der Applikation unter

Delphi-Quellcode:
begin
  ...
  Applikation.CreateFrom(TFenster1, Fenster1);
  ...
end.
erstellt.

Die Fenster werden von der DLL unter

Delphi-Quellcode:
begin
  ...
  Applikation.CreateFrom(TFenster2, Fenster2);
  Applikation.CreateFrom(TFenster3, Fenster3);
  ...
end.
erstellt.

Also wird das Erstellen der Formen von der Applikation und DLL selbst übernommen.

tigerman33 14. Nov 2005 18:28

Re: Fenster einer DLL in den Vordergrund
 
Du schreibst, die DLL wäre statisch eingebunden. Trotzdem lädst du sie mit LoadLibrary und gibst sie sogar anschließend wieder frei. Eins von beidem geht doch aber nur.

Wo genau ist der Aufruf, der das Fenster anzeigen soll? Passiert das in irgendeiner Art und Weise in der cfunction?

Ianisp 15. Nov 2005 14:54

Re: Fenster einer DLL in den Vordergrund
 
Hallo Moony,

Du kannst deiner Funktion den Application Handle übergeben:

Delphi-Quellcode:
type Tcustfunction=function (AHandle: THandle; var Names,Values:pchar):boolean;stdcall;
Der Aufruf aus der Anwendung sollte so aussehen:

Delphi-Quellcode:
result := cfunction(Application.Handle,...,...);
In der DLL die Funktion custfunction ändern:

Delphi-Quellcode:
Application.Handle := AHandle;
hoffe, das hilft dir weiter.

Gruß, Ianis

tigerman33 15. Nov 2005 18:21

Re: Fenster einer DLL in den Vordergrund
 
Hast du es eigentlich schonmal mit Form2.Perform versucht? Ihm also quasi eine Message "vorgegaukelt"?


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:24 Uhr.
Seite 1 von 2  1 2      

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