Delphi-PRAXiS

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 "Frame" aus DLL in Dialog einbetten (https://www.delphipraxis.net/65001-frame-aus-dll-dialog-einbetten.html)

eyeless 10. Mär 2006 22:55


"Frame" aus DLL in Dialog einbetten
 
Hallo,

ich würde gern mal wissen, ob folgendes geht und wenn ja, wie:

Ich habe jez mal ein Hauptprogramm, dass nun die einzelnen dlls (als sone Art plugins oder so ...) laden kann, in denen sich wiederum Panels/Frames/wasweissich befinden, die ich dann auf ein Panel/TabSet/wieauchimmer betten lasssen und die ich dann auch janz normal nutzen kann ...

Ich will damit ein Programm bauen, dass Module laden und mit ihnen arbeiten kann usw. ... oder geht das anders besser?

Geht das? Wenn JAR, VIEH????

mfg, eyeless

PS: DF-Link zum Thema

eyeless 12. Mär 2006 18:08

Re: "Frame" aus DLL in Dialog einbetten
 
*push*

Kann mir wirklich keiner helfen?

mfg, eyeless

chaosben 13. Mär 2006 05:52

Re: "Frame" aus DLL in Dialog einbetten
 
Ja, das kann man machen. Threads über die Verwendung von DLL's gibts ja genug.
Nur gibt es da ein Problem. Du kannst dir natürlich von deinem Plugin einen Pointer auf eine Panel geben lassen, welches du in der DLL erzeugt hast. Aber, alle normalen Zugriffe auf Eigenschaften, die Objekte sind (also keine einfachen Typen) werden zu Zugriffsverletzungen führen. Das kommt daher, das Objekte innerhalb der VCL als ID's abgelegt werden. Diese ID's gelten aber immer nur innerhalb einer laufenden VCL-Instanz. Das nur als Warnung.

Btw.: Man könnte für obiges Problem mal ein Framework schreiben was dies behebt.

Elvis 13. Mär 2006 08:06

Re: "Frame" aus DLL in Dialog einbetten
 
Wie in jedem Thread dieser Art in dem ich bisher das Vergnügen (*cough, cough*) hatte das gleiche zu antworten, werde ich auch hier das gleiche wie immer antworten:
Schaue dir mal Packages an, DLLs machen nur Sinn wenn du kompatibel zu anderen Sprachen sein willst. DAs was du da machst schließt diese Kompatibilität komplett aus -> also Packages.

F.W. 13. Mai 2006 22:41

Re: "Frame" aus DLL in Dialog einbetten
 
Ich benutze auch Frames aus Dlls als "Plugins".

Ich habe schon das erste Problem überwunden: Beim Laden des Frames kam immer der Fehler "TFont kann nicht TFont zugewiesen werden"
Das habe ich abgeschafft indem ich ParentFont beim Frame auf False gesetzt habe.

Dann klappte alles soweit, aber jetzt habe ich ein ListView auf dem Frame platziert, wenn ich den anklicke wenn der Frame in die Anwendung geladen ist, kommt ein Fehler "Element 'XYZ' hat kein übergeordnetes Fenster"

Der Parent vom Frame wird beim Laden auf ein Panel gesetzt (beim Create wird der Parent mit NIL angegeben, er wird manuell später gesetzt, daran liegts aber nicht!)

Was kann ich da tun?

chaosben 15. Mai 2006 06:32

Re: "Frame" aus DLL in Dialog einbetten
 
Du könntest das oben angedeutete Framework nutzen. (Disclaimer: Einige der hier versammelten Delphi-Koryphäen meinen, das dies ein "Hack", "unterminierender Code", "dem DLL-Prinzip defakto widersprüchlicher Code" usw. ist. Was auch immer: er funktioniert. :) )

F.W. 15. Mai 2006 10:42

Re: "Frame" aus DLL in Dialog einbetten
 
Von dem Framework-Thread:
Zitat:

Oft gibt es ja Diskussionen darüber, warum man von einer DLL nicht auf die Komponenten des aufrufenden Programms zugreifen kann
Aber eigentlich will ich ja nicht von der Dll auf das Programm zugreifen.
Der Dll-Frame wird auf ein Panel im Programm geladen, ansonsten dreht er total sein eigenes Ding.
Die Controls auf ihm bearbeiten nur Eigenschaften und Controls auf sich selbst.
Die einzige Komponente, die vom Hauptprogramm gestellt wird, ist ein IdTCPClient.
Aber in der neuen Dll habe ich den TCPClient noch garnicht benutzt.

Edit: Oh, das ist ja ein anderer Thread, tut mir Leid, ich habe meine Frage nochmal konkreter in einem anderen Thread gestellt!

chaosben 15. Mai 2006 10:57

Re: "Frame" aus DLL in Dialog einbetten
 
Sorry, da hab ich wohl ein wenig an dir vorbei gelesen. :)

Wie erzeugst du denn dein Frame?
Ich hab hier auf Arbeit ein Programm am Start, das scheinbar ähnlich aufgebaut ist wie das deine. Da musste ich aber den Parent extra per Hand zuweisen. Also CreateParented und Windows.SetParent(bli,bla)

F.W. 15. Mai 2006 11:05

Re: "Frame" aus DLL in Dialog einbetten
 
@chaosben: Tut mir Leid, ich habe meinen Thread nochmal bearbeitet. Ich war durcheinander gekommen ^^
In dem oben genannten Thread steht, wie ich den Frame erzeuge.

Aber ich schaue mir deine Methoden (CreateParented(...) und so) mal an!
Da muss ich dann der VCL dazwischen greifen, ja?

F.W. 15. Mai 2006 19:44

Re: "Frame" aus DLL in Dialog einbetten
 
Also das mit dem CreateParented und Windows.SetParent habe ich versucht, jedoch schlägt es immer wieder gehl (AccessViolations)
ABER!! Ich habe jetzt was entdeckt, weswegen alles und vlt auch grad CreateParented nicht geht:
>> Der Frame hat scheinbar kein Handle!! Wenn ich da einen Haltepunkt setze, dann zeigt Delphi mir nur einen Hint mit der Aufschrift "Delphi-Exception".

Was geht da beim Frame erzeugen schief?

jensw_2000 15. Mai 2006 20:26

Re: "Frame" aus DLL in Dialog einbetten
 
Zitat:

Was geht da beim Frame erzeugen schief?
Ohne Code schwehr zu erraten...
Möglicher Weise fehlt nur
Delphi-Quellcode:
 <MeinFrame>.HandleNeeded;

Mit Frames habe ich das bisher aber auch noch nie gelöst.
Für meine Plugins verwende ich TForm und z.B. folgenden Code ...
Delphi-Quellcode:
function ShowDllForm(aApplication:TApplication; aPanel: TWinControl;aHeight,aWidth:integer):HWND;
begin
   if not Assigned(DllApplication) then
      DllApplication:=Application;

   Application:=aApplication;
   if not Assigned(DllForm) then
      DllForm:=TfrmDllPlugin.Createparented(aPanel.handle);

   with DllForm do
   begin
                  HandleNeeded;
      BorderStyle:=bsnone;
      Height:=aHeight;
      Width:=aWidth;
      top:=0;
      left:=0;
      Show;
   end;

   result:=DllForm.Handle;
end;
Schöne Grüße,
Jens
:hi:

F.W. 15. Mai 2006 22:25

Re: "Frame" aus DLL in Dialog einbetten
 
@jensw_2000: Du hast sicher nicht alles gelesen, ich habe mal ganz nebenbei am Rande erwähnt, dass es noch einen anderen Thread gibt, der mit diesem Thema handelt. Dort habe ich den Quellcode gepostet.

Aber egal, das man eine Form dafür auch benutzen kann, ist natürlich elegant! Das wusste ich vorher noch nicht! (DANKE!)
Ich bin sehr optimistisch gestimmt, kann es aber erst morgen nachhmittag testen, da ich jetzt langsam mal ins Bettchen muss (morgen iss ja schließlich wieder Schule :D )

DANKE! Ich werde es sofot ausprobieren!

jensw_2000 15. Mai 2006 22:49

Re: "Frame" aus DLL in Dialog einbetten
 
Zitat:

Du hast sicher nicht alles gelesen, ich habe mal ganz nebenbei am Rande erwähnt, dass es noch einen anderen Thread gibt, der mit diesem Thema handelt. Dort habe ich den Quellcode gepostet.
Das habe ich übersehen ... :oops:

Hier findest du ein kleines Beispiel mit einer eingebetten DLL-Form.
http://www.delphipraxis.net/internal...=544375#544375

Hier ist ein Codelib-Beitrag von Sakura. Eine super Vorlage für DLL-basierte Plugins.
http://www.delphipraxis.net/internal...?p=38015#38015
Wenn du Formulare einbetten willst, dann solltest du aber das Application Object der DLL sichern, dann mit TApplication der Hauptanwendung überschreiben und vor dem entladen der DLL das originale DLL-Application-Object zurückholen. Damit umgehst du schon mal einige Standardprobleme von eingebetteten DLL-Forms.

F.W. 15. Mai 2006 23:05

Re: "Frame" aus DLL in Dialog einbetten
 
Ich konnte es nicht lassen, musste es gleich noch probieren! :)

Und es hat geklappt!!! :cheers:

Aber die Links werde ich morgen erst anschauen, denn jetzt wird's wirklich Zeit ;-)

Bis jetzt gebe ich die "Frames", was ja jetzt die Forms sind, mit einer Dll-internen Funktion wieder frei. Ich werde sehen, ob sich da Probleme ergeben.
Ich habe noch nicht alles umgestellt, aber bis jetzt habe ich schon ein neues kleines Problem mit den Ankern von Komponenten auf dem Formular, aber das ist jetzt so ein kleines Übel, das sehe ich mir nochmal in aller Ruhe an!

PS: Dem anderen Thread, den ich noch aufgemacht hatte werde ich diese Lösung hinzufügen, womit er abgesegtnet wäre ;-)

Nochmal ein RIESEN DANKE an alle und besonders an jensw_2000!!!!

Wyski :witch:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:57 Uhr.

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