Autor Beitrag
RedArcus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

Win Vista; Windows7; Win10
D5 Prof; Delphi XE5; Delphi Tokyo
BeitragVerfasst: Mo 07.12.15 17:09 
Guten Tag,

ich habe ein Problem zu dem ich im Netzt und im Forum bis jetzt keine Antwort gefunden habe.
Wenn ich ein Form, das in einer Dll erstellt wird, aufrufe kann ich es nicht minimieren.

Also:
Eine exe ladet eine Dll dynamisch.
Die Dll erstellt das Form und zeigt es mit ShowModal an.
So weit alles ok, das aus der Dll angezeigte Form hat zwar den SystemButton zum minimieren, jedoch erfolgt beim Klick darauf keine Reaktion.
Das Handle der aufrufenden exe habe bereits an die Dll übergeben und deren Application zugewiesen.

Kann mir jemand mitteilen, wie ich in diesem Fall vorzugehen habe, dass das Form aus der Dll minimiert werden kann.

Vielen Dank für eure Hilfe.

Gruß Hans
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 07.12.15 17:27 
Macht das überhaupt Sinn? Wenn ich ein Formular, das nicht in einer DLL liegt, modal anzeige, kann ich es zwar minimieren, aber auf die aufrufende Form dennoch nicht zugreifen. Das dürfte auch der Fall sein, wenn ein Formular in einer DLL aus dieser heraus aufgerufen wird: Es bleibt geöffent und der Programmzeiger verbleibt weiterhin im modalen Formular bzw. in dessen Code, so daß die gesamte Anwendung dadurch blockiert sein dürfte. Das minimierte Formular aus der DLL, so es denn überhaupt zu minimieren wäre, könnte ebenfalls nicht mehr angesprochen werden, da es ja keine Verbindung zum Code des Hauptfensters hat. Im Normalfall, also bei einer modalen Form ohne DLL erscheint auch kein zweites Icon in der Taskleiste, nachdem ich das modale Formular minimiert habe. Ich kann es wieder anzeigen, indem ich auf das Icon der Anwendung in der Taskleiste klicke. Du kannst ja mal einen Workaround versuchen, indem du im modalen Formular einen Button setzt, der ein Self.WindowsState := Minimized ausführt ... mal gespannt, was dann passiert.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 08.12.15 09:44 
Eigentlich funktioniert das problemlos, wenn man nicht mit dem Application.Handle herumtrickst. Dadurch macht man mehr kaputt als man dadurch Vorteile hat.

Ein einfaches ShowModal in einer DLL funktioniert normalerweise problemlos, zumindest bei aktuellen Delphiversionen (das bei dir angegebene XE5 zähle ich dazu ;-)). In der Taskleiste von Windows siehst du dann einfach zwei Einträge, die du auch einzeln anklicken und so das zweite Fenster wiederherstellen kannst.

Wenn das bei dir nicht geht, wäre es am sinnvollsten, wenn du ein Beispielprojekt anhängst... im Anhang findest du ein funktionierendes inkl. kompilierter Exe und DLL...
Einloggen, um Attachments anzusehen!
RedArcus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

Win Vista; Windows7; Win10
D5 Prof; Delphi XE5; Delphi Tokyo
BeitragVerfasst: Di 08.12.15 10:09 
Hallo Perlsau,

deine Frage ist berechtigt, bei meiner Anwendung macht es aber Sinn.
Die Dll ist ein Textverarbeitung. Wird diese aus einem Programm aufgerufen, ist sie somit Teil des Programmes und der Button zum minimieren habe ich ausgeblendet(braucht mann da ja auch nicht). Wenn jetzt die Textverarbeitung als Anwendung gestartet werden soll, habe ich die kleine Exe, die weiter nichts macht als die Dll zu starten. Diese soll nun wie eine Anwendung dargestellt werden, also auch minimiert werden können. Ich hoffe nun ist es verständlich, was ich damit bezwecken will, oder gibt es da einen besseren Ansatz?

@jaenicke,
das Form aus der Dll aufzurufen und anzuzeigen ist kein Problem.

Gruß Hans
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 08.12.15 10:25 
Du könntest mal versuchen, dem Formular aus der DLL als Parent ein Panel in der aufrufenden Exe-Datei zuzuweisen. Damit wäre dein Problem behoben, denn nun minimierst du einfach die aufrufende Anwendung.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 08.12.15 10:31 
user profile iconRedArcus hat folgendes geschrieben Zum zitierten Posting springen:
@jaenicke,
das Form aus der Dll aufzurufen und anzuzeigen ist kein Problem.
Das Minimieren nach modaler Anzeige aber auch nicht. Siehe Beispiel.
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 08.12.15 11:02 
Deinem Beispiel nach ist das wirklich kein Problem, Jaenicke. Doch die aufrufende Anwendung bleibt weiterhin sichtbar und kann, da ein modales Fenster aktiv ist, nicht angeklickt und daher auch nicht minimiert werden. Weil man aber in einer Anwendung auch Formulare anderer Anwendungen darstellen kann, sollte es daher möglich sein, die aufgerufene Anwendung einfach in der aufrufenden Anwendung – bei dir wäre das Form83 in Form82 – darstellen zu lassen. Dieser Weg scheint mir die einzige Option, die es dem TE gestattet, die Textverarbeitung in der DLL wie eine eigene Anwendung aussehen zu lassen.
RedArcus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

Win Vista; Windows7; Win10
D5 Prof; Delphi XE5; Delphi Tokyo
BeitragVerfasst: Di 08.12.15 11:18 
Hallo jaenicke,

danke für das Beispiel, hatte es leider nicht ausprobiert(Asche über mein Haupt). Der Unterschied zwischen meinem und Deinem Code war nur das Erstellen der Form in der Dll.
Ich habe:
- Application.CreateForm(TForm2, Form2); verwendet. In diesem Fall geht das Minimieren NICHT.
In Deinem Beispiel:
- Form2 := TForm2.Create(nil); Funtioniert das Minimieren. Jetzt werde ich nur noch das Icon der Exe von der Taskleiste entfernen und schon habe ich das gewünschte Ergebnis.

Vielen Dank für die Hilfe

Gruß Hans
RedArcus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

Win Vista; Windows7; Win10
D5 Prof; Delphi XE5; Delphi Tokyo
BeitragVerfasst: Di 08.12.15 11:24 
Hallo Perlsau,

Dein Vorschlag wäre auch eine Option. Mal sehen welche der beiden sich besser händeln lässt.

Gruß Hans
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 08.12.15 12:38 
Bei Jaenickes Empfehlung geht es ja nur um die Art des Create-Aufrufs. Die kannst du ja dennoch übernehmen. Aber was nützt dir das Minimieren der Textverarbeitungs-Form, wenn dann immer noch ein leeres Fenster auf dem Screen zu sehen ist, das der Anwender nicht wegbekommt? Wie man das genau realisiert bei einer DLL-Form, weiß ich jetzt auch nicht aus dem Stegreif, da müßte ich ebenfalls erst herumprobieren (entwickeln eben). Auf jeden Fall geht das aber grundsätzlich ... irgendwie.
RedArcus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

Win Vista; Windows7; Win10
D5 Prof; Delphi XE5; Delphi Tokyo
BeitragVerfasst: Di 08.12.15 12:53 
Hallo Perlsau,

mit dem Beispiel von jaenicke komme ich jetzt schon zurecht, da bei mir das Startfenster der exe eh schon ausgeblendet wurde. Es bleibt also nur das Fenster aus der Dll sichtbar und das kann ich nun minimieren.

Vielen Dank.

Gruß Hans
RedArcus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

Win Vista; Windows7; Win10
D5 Prof; Delphi XE5; Delphi Tokyo
BeitragVerfasst: Fr 11.12.15 16:26 
Hallo jaenicke,

ich muss das Thema doch nochmal aufgreifen. Da ich zuwischendurch nicht mehr an dem Projekt gearbeitet hatte, ist mir nun aufgefallen, dass durch das Erstellen des Forms mit
Form2 := TForm2.Create(nil),
das minimieren zwar funktioniert, ich kann aber keine weitere Forms in dem Hauptform erstellen. Da es sich hier um eine Textverarbeitung handelt, ist mein Form in diesem Fall FormStyle = fsMDIForm, was in diesem Fall ja anscheinend nicht mehr gegeben ist.

Gruß Hans
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 12.12.15 05:27 
MDI ist ja schon etwas angestaubt, aber ein Workaround ist recht einfach. Wenn du Debug DCUs an hast, siehst du, dass das Problem daran liegt, dass Application.MainForm geprüft wird um ein Host-Fenster für die MDI Childs zu finden. Also muss das gesetzt werden ohne das hier problematische Application.CreateForm, das das normalerweise macht.

Da die Property Readonly ist, geht das leider nur mit einem Trick:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
type
  PForm = ^TForm;

procedure DoIt;
begin
  Form83 := TForm83.Create(nil);
  PForm(@Application.MainForm)^ := Form83;
  Form83.ShowModal;
end;
RedArcus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

Win Vista; Windows7; Win10
D5 Prof; Delphi XE5; Delphi Tokyo
BeitragVerfasst: Mo 14.12.15 09:45 
..vielen Dank für die schnelle Antwort. So funktioniert es, mit dem "verstaubten" MDI.

Gruß Hans