Einzelnen Beitrag anzeigen

Moony

Registriert seit: 29. Jul 2003
Ort: Essen
454 Beiträge
 
Delphi 2010 Professional
 
#15

Re: Fenster einer DLL in den Vordergrund

  Alt 19. Nov 2005, 13:57
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:
Projekt.dpr

uses
...

begin
  Application.Initialize;
  ...
  // Erstellung des Fenster1 zur Laufzeit
  Application.CreateForm(TFenster1, Fenster1);
  ...
  Application.Run;
end.
Anschließend wird beim klicken auf eine Schaltfläche das Fenster1 aufgerufen:
Delphi-Quellcode:
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;
Innerhalb der DLL wird dann folgendermaßen verfahren:

Delphi-Quellcode:
library DLLName;

uses
  ...

begin
  Application.initialize;
  Application.CreateForm(TFenster2, Fenster2);
  Application.CreateForm(TFenster3, Fenster3);
end.
Innerhalb der geladenen DLL wird das Hauptfenster Fenster2 geöffnet. Hier wird in der Prozedur Fenster2.FormShow() der folgende Aufruf getätigt:

Delphi-Quellcode:
unit Fenster2;

...

procedure Fenster2.FormShow();
begin
  ...
  Fenster3.ShowModal;
  if Fenster3.ModalResult = mrCancel then
    Exit;
  ...
end;
Anschließend wird in der Prozedur Fenster3.FormShow() der folgende Aufruf gesetzt:

Delphi-Quellcode:
unit Fenster3;

...

procedure Fenster3.FormShow();
begin
  Fenster3.BringToFront;
end;
So ist der Stand wie zu Anfang beschrieben. Jedoch bringt das ja nicht.
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
Ich weiß, daß ich nichts weiß! Sokrates
  Mit Zitat antworten Zitat