![]() |
"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: ![]() |
Re: "Frame" aus DLL in Dialog einbetten
*push*
Kann mir wirklich keiner helfen? mfg, eyeless |
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. |
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. |
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? |
Re: "Frame" aus DLL in Dialog einbetten
Du könntest das oben angedeutete
![]() |
Re: "Frame" aus DLL in Dialog einbetten
Von
![]() Zitat:
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 ![]() |
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) |
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? |
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? |
Re: "Frame" aus DLL in Dialog einbetten
Zitat:
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:
Schöne Grüße,
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; Jens :hi: |
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! |
Re: "Frame" aus DLL in Dialog einbetten
Zitat:
Hier findest du ein kleines Beispiel mit einer eingebetten DLL-Form. ![]() Hier ist ein Codelib-Beitrag von Sakura. Eine super Vorlage für DLL-basierte Plugins. ![]() 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. |
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 00:33 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