Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Formular-DLL und StayOnTop


Sephiroth - Mo 12.08.02 16:51
Titel: Formular-DLL und StayOnTop
So noch ein zweites Problem.

Meine Exe ruft ein Formular auf. Nun kann man aber wieder zurück zu der Exe schalten. Man kann zwar nichts mehr klicken, aber das fenster kann man noch aktivieren. Kann man dies irgendwie verhindern, also so das man wirklich nur das Formular der DLL benutzen kann? Es soll im prinzip so gehandhabt werden das die DLL nicht wie ein neues Programm gestartet wird sondern so wie wenn es ein neue Formular der Exe wäre.

Ich habs mit StayOnTop probiert. War auch genau das was ich wollte nur das wenn ich dann z.B. ein Showmessage hatte, war dieses hinter der Form und man konnte es nicht hervorholen.

Danke im voraus


cbs - Mo 12.08.02 17:10

Tag auch

ich kann dir zwar nicht helfen aber ich glaube dieses problem hatte ich auch mal

du rufst dein Dll formular bestimmt mit showmodal auf oder? so das alle anderen forms deaktiviert sind (oder man sie halt nicht benutzen kann)

das problem bei mir war das, wenn ich zb. das hauptformular angeklickt habe, mein dll formular hinter das hauptformular verschwunden ist

normalerweise müsste das hauptformular nicht anklickbar/aktivierbar sein, man kann die steuerelemente zwar nicht benutzen, trotzdem "versteckt" sich das dll formular

ich hatte mir nämlich eigene dialoge geschrieben die ich in dll's auslagern wollte (wie windows es tut), ich habs aber aufgrund dieses problems dann sein gelassen

ist es auch dein problem? wenn ja dann bin ich auch auf eine antwort gespannt


Sephiroth - Mo 12.08.02 17:30

genau das ist mein Problem ;)


cbs - Fr 16.08.02 18:51

ist zwar nicht mein thread aber wie gesagt es interessiert mich auch sehr das problem zu lösen, also...

...hat keiner ne anhung was da los ist?


ao - Fr 16.08.02 19:03

Hallo,

was da genau los ist kann ich euch leider auch nicht sagen. Also ich würde versuchen, sobald das Ereignis OnDeactivate des Formulars (das aus der DLL) ausgelöst wird, es sofort wieder zu fokusieren. Vielleicht sieht es dann so aus als wäre es modal angezeigt. Ist zwar nur ein "work arround", aber wie gesagt ich weiß auch nicht woran es liegt.

Gruß
Andreas


cbs - Fr 16.08.02 19:14

na ok, danke erstmal

aber wie du schon sagst es ist nur eine notlösung, die zwar funktionieren würde (habs jetzt nicht ausprobiert), aber es ist eben nicht sehr "elegant"

mich würde vorallem das warum interessieren. kennt man das warum dann kann man eventuell auch das problem lösen. oder machen wir generell was falsch? wie macht man es richtig? oder wie macht ihr es?


ao - Fr 16.08.02 19:23

Hallo,

mich würde natürlich auch die "One And Only" Lösung interessieren. Damit wären wir dann schon zu dritt. :wink:

Andreas


chewie - Sa 17.08.02 21:37

Hallo zusammen,

Das Problem ist mir auch schon begegnet. In den Borland-Newsgroups habe ich schlussendlich folgende Lösung gefunden:

Man muss Application.Handle der DLL auf Application.Handle der DLL setzen bevor das Formular in der DLL kreiert wird.

Danach verhält sich das Formular wie jedes Formular, welches innerhalb der EXE programmiert wird. Jetzt funktioniert auch FormStyle 'fsStayOnTop' wie gewünscht: StayOnTop gilt nur noch für das eigene Programm, nicht mehr global in Windows - Fehlermeldungen des Programms werden nicht mehr verdeckt.

Ganz Wichtig: Bevor das Programm beendet wird, muss Application.Handle innerhalb der DLL wieder auf 0 gesetzt werden, sonst gibst Abstürze.

Gruss - Jörg


cbs - Sa 17.08.02 23:18

hab ich jetzt net ganz geschnallt, eine DLL hat ein eigenes Application.Handle ??? was muss ich wo hinsetzen?


chewie - So 18.08.02 16:44

Kleines Beispiel:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
library DllFormExample;

uses
  Forms,
  DllForm in 'DllForm.pas' {DllFormular};

{$R *.res}

function FormShowModal(hApplicationHandle : THandle) : Integer;
var
  obDllForm : TDllFormular;
begin
  Application.Handle := hApplicationHandle;

  obDllForm := TDllFormular.Create(nil);
  Result := obDllForm.ShowModal;
  obDllForm.Free;

  Application.Handle := 0;
end;

exports
  FormShowModal;

end.


Aufruf aus EXE:


Quelltext
1:
2:
3:
4:
5:
6:
...
procedure TExeProgramm.ShowDllFormular;
begin
  FormShowModal(Application.handle);
end;
...


Die DLL hat eine eigene 'Application', auch wenn Application.ExeName den Namen der aufrufenden EXE zurückgibt. Das Handle ist allerdings standardmässig auf 0.

Ich hoffe, das hilft weiter.

Gruss - Jörg


cbs - Mi 21.08.02 17:24

ja danke, habs jetzt kapiert :lol:

ich werd gleich am we ausprobieren