![]() |
Modales Fenster in DLL, Taskleiste
Hallo *.*
auch wenn mein Thema mit dieser ![]() Ich habe eine DLL (meine eigene), die in einem Host läuft (hier Total Commander). Ich erzeuge ein VCL-Fenster in meiner DLL und möchte dieses modal anzeigen. Benutze ich hierfür
Delphi-Quellcode:
wird ein neuer Button auf der Taskleiste erzeugt - unschön. Also muss ich auf irgendeine Weise das Parentfenster setzen. Mache ich das mit
fmPluginSettings:= TfmPluginSettings.Create(nil);
try fmPluginSettings.Init; fmPluginSettings.ShowModal; finally fmPluginSettings.Free; end;
Delphi-Quellcode:
verschwindet zwar der Button auf der Taskleiste, aber man kann das Fenster von Total Commander nicht mehr durch Klick auf die Taskleiste nach vorn holen, wenn eine andere Anwendung im Vordergrund ist und mein Dialog gerade angezeigt wird - ebenfalls unschön.
fmPluginSettings:= TfmPluginSettings.CreateParented(AhParent);
Was ich bisher benutzt habe, muss ich aus anderen Gründen vermeiden:
Delphi-Quellcode:
denn das gibt eine Access Violation beim Anzeigen von Tooltips oder der Verwendung von TActionList, aber lustigerweise nur unter 64 Bit.
Application.Handle:= AhParent;
Ein solches oder ähnliches Problem hatte doch bestimmt schon einmal irgendjemand, oder? Ich bringe die Frage nochmal auf den Punkt: Wie kann ich einen modalen Dialog in einer DLL erzeugen, ohne einen Eintrag in der Taskleiste zu erzeugen und zwar so, dass die Host-Anwendung durch Klick auf die Tasleiste in den Vordergrund kommt, auch wenn der modale Dialog gerade angezeigt wird? MfG Dalai |
AW: Modales Fenster in DLL, Taskleiste
Hat noch keiner ein solches Problem gehabt?
Ich fasse nochmal zusammen:
MfG Dalai |
AW: Modales Fenster in DLL, Taskleiste
Sind alle so planlos, oder geht es nur mir so. Das Einzige was ich mir dazu vorstellen kann ist die Lösung des Win64 Problems. Welche (XE-)Version verwendest du denn, denn mit D5 kann's ja wohl nicht gehen?
|
AW: Modales Fenster in DLL, Taskleiste
Zitat:
Delphi-Quellcode:
und Hint auf irgendwas setze, tritt die AV auf, sobald der Hint angezeigt werden soll. Dasselbe passiert, wenn ich eine TActionList mit einem TPopupMenu verknüpfe und letzteres angezeigt werden soll (manuelles Popup beim Klick auf einen Button).
ShowHint:= True;
Zitat:
Code:
Nur kann weder ich noch der TC-Autor damit etwas anfangen. Es ist auch unabhängig von der Windows-Version. Ich habe XP64, Win7 x64 und IIRC auch Win8.1 x64 probiert und bei allen tritt dasselbe Problem mit demselben Stacktrace auf.
---------------------------
Total Commander 8.51a --------------------------- Access violation. Access violation Windows XP Pro x64 SP2 5.2 (Build 3790) Please report this error to the Author, with a description of what you were doing when this error occurred! Stack trace (x64):4AC25F 4364F2 436372 436191 40F40D 8CDC28 814EB9 8D7E72 77C43ABC Press Ctrl+C to copy this report! Continue execution? --------------------------- Ja Nein --------------------------- Offenbar mag es Delphi (die VCL oder die RTL) nicht, wenn man Application.Handle in einer DLL auf ein fremdes Fenster setzt. Naja, das an sich funktioniert ja, hat aber eben Nebenwirkungen. Und deshalb frag(t)e ich nach Alternativen. MfG Dalai |
AW: Modales Fenster in DLL, Taskleiste
Mittlerweile habe ich eine Lösung gefunden, auf die mich
![]()
Delphi-Quellcode:
Gibt's da noch eine Möglichkeit, die unitglobale Variable zu vermeiden und stattdessen z.B. in eine Feldvariable von TfmPluginSettings zu verwandeln? Das CreateParams wird ja nicht direkt gerufen, aber sofort ausgelöst, wenn der Konstruktor arbeitet, z.B. durch ein
type
TfmPluginSettings = class(TForm) [...] protected procedure CreateParams(var Params: TCreateParams); override; [...] end; implementation var hwndTotalCmd: HWND; procedure TfmPluginSettings.CreateParams(var Params: TCreateParams); begin inherited; Params.WndParent:= hwndTotalCmd; end; procedure PluginShowForm(const AhParent: HWND); var fmPluginSettings: TfmPluginSettings; begin hwndTotalCmd:= AhParent; fmPluginSettings:= TfmPluginSettings.Create(nil); try fmPluginSettings.Init; fmPluginSettings.ShowModal; finally fmPluginSettings.Free; end; end;
Delphi-Quellcode:
. AFAIK sollte man es ja vermeiden, vor dem
inherited Create;
Delphi-Quellcode:
eines Konstruktors irgendwas anderes zu machen.
inherited
MfG Dalai |
AW: Modales Fenster in DLL, Taskleiste
Und wenn du den Constructor überlädst und das Handle mit übergibts? Das entsprechende Handle in ein privates Feld speichern (vor dem inherited) und der Rest bleibt so (Params.WndParent wird mit privatem Member bedient). Warum sollte man private Member der eigenen Klasse im Konstruktor nicht vor dem inherited setzen dürfen? Imho passiert da nichts schlimmes.
Gruß oki |
AW: Modales Fenster in DLL, Taskleiste
Zitat:
Zitat:
MfG Dalai |
AW: Modales Fenster in DLL, Taskleiste
Ich verstehe deine Code Schnipsel nicht so ganz.
Verstehe ich das richtig dass du mit FindWindow das Handle für dein dll Formular hollst und dann keine Ahnung wie auf fmPluginSettings überträgst. Also wie gelangt das Formular aus der dll in dein Programm ohne einen neuen Task Eintrag? |
AW: Modales Fenster in DLL, Taskleiste
Zitat:
Zitat:
MfG Dalai |
AW: Modales Fenster in DLL, Taskleiste
Jetzt weiß ich wieder, warum ich diese Variante verworfen hatte:
Delphi-Quellcode:
Bekommt man die Warnung
type
TfmPluginSettings = class(TForm) [...] private FParent : HWND; protected procedure CreateParams(var Params: TCreateParams); override; public constructor Create(AOwner: TComponent; const AParent: HWND = 0); overload; [...] end; procedure PluginShowForm(const AhParent: HWND); var fmPluginSettings: TfmPluginSettings; begin fmPluginSettings:= TfmPluginSettings.Create(nil, AhParent); try fmPluginSettings.Init; fmPluginSettings.ShowModal; finally fmPluginSettings.Free; end; end; constructor TfmPluginSettings.Create(AOwner: TComponent; const AParent: HWND = 0); begin FParent:= AParent; inherited Create(AOwner); end; procedure TfmPluginSettings.CreateParams(var Params: TCreateParams); begin inherited; Params.WndParent:= FParent; end; Zitat:
Delphi-Quellcode:
kann ich ja nicht verwenden, weil die Methode eine andere Signatur hat.
override;
MfG Dalai |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:04 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