Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Frames aus DLLs..? TFont <> TFont!? (https://www.delphipraxis.net/9331-frames-aus-dlls-tfont-tfont.html)

Ganymed 24. Sep 2003 10:50


Frames aus DLLs..? TFont <> TFont!?
 
Hi!

Das Problem dürfte allseits bekannt sein:

Wenn ich ein Frame aus einer DLL importieren will, bekomme ich beim Erzeugen des selbigen (Parent ist ein TForm aus der EXE) die Fehlermeldung "Cannot assign TFont to TFont".

Des Pudels Kern scheint ja zu sein, dass für EXEs und DLLs verschiedene Packages verwendet werden (das zumindest stand in einigen Groups). Die Lösung wäre also folglich, die DLL mit den Packages der EXE zu kompilieren. Nur: Wie geht das? Die Fehlermeldung kommt unabhängig ob ich "Build with runtime packages" in den Projektoptionen angewählt habe oder nicht (trotz Rebuild).

Kann mir jemand konkrete Lösungsvorschläge anbieten?

Danke im Voraus

Ganymed

negaH 24. Sep 2003 13:55

Re: Frames aus DLLs..? TFont <> TFont!?
 
Beides, EXE und DLL müssen mit Packages kompiliert werden. In deinem Falle muß also bei "Required Packages" -> "benötigte Packages" in den Projektoptionen der EXE und DLL auch das Packages "VCL" enthalten sein.

Gruß hagen

Ganymed 24. Sep 2003 14:30

Re: Frames aus DLLs..? TFont <> TFont!?
 
Die Packeges in den Projektoptionen der EXE und der DLL sind identisch.
Aber ich versteh' nicht so ganz, was du jetzt genau meinst...

negaH 24. Sep 2003 14:55

Re: Frames aus DLLs..? TFont <> TFont!?
 
Gut, und bei beiden Projekten, sprich der EXE und DLL, ist in den Projektoptionen die Checkbox angehakt das man Packages benutzen will ?
Wenn so, dann kompiliere beides komplett neu. Danach sollte alles funktionieren.

Gruß Hagen

Ganymed 24. Sep 2003 15:06

Re: Frames aus DLLs..? TFont <> TFont!?
 
Hm, :( , ich hab jetzt bei beiden Projekten unter "Build with runtime packages" das Package "vcl" angegeben... Dass jetzt alles funktionieren sollte, sollte man annehmen. Leider alles graue Theorie.

Denn jetzt bekomme ich einen Klassenkonflikt: "A class named TGIFFrame already exists"...

Alles Sch*** :evil:

Wieso lässt sich das denn nicht mit den Design-Time-Packages machen???

negaH 24. Sep 2003 16:01

Re: Frames aus DLLs..? TFont <> TFont!?
 
Dann benutzen EXE und DLL ebenfalls die TGifImage Komponente. Da diese sich mit RegisterClass() im VCL Package registriert und BEIDE die EXE und DLL diese Komponente NICHT aus einem Package heraus benutzen, kommt es zu diesem Fehler. Das liegt daran das du versucht's ein "Misch-Package-Nicht-Package" System zu bauen. Ich vertrete die Auffassung, entweder ALLES mit Packages oder GARNICHT's.

Also, in den "Required Packages" alle Packages aufführen die Klassen enthalten die von der EXE und den DLL's gemeinsam benutzt werden.

Zitat:

Wieso lässt sich das denn nicht mit den Design-Time-Packages machen???
Noch gefährlicher. Ab D6 können DesignTime Packages nur noch durch die IDE selber benutzt werden. Dafür hat Borland gesorgt indem DesignTime Packages die Unit Prxies.dcu benötigen. Proxies.dcu liegt nicht als Source vor und enthält "Schutzcode" der verhindert das man diese Unit ausserhalb der IDE benutzen kann. Somit können DesignTime Packages nicht in eigenen Anwendungen geladen werden. Zudem würde es Lizensbestimmungen brechen.

Gruß Hagen

Ganymed 25. Sep 2003 09:05

Re: Frames aus DLLs..? TFont <> TFont!?
 
Zitat:

Zitat von negaH
(...) Das liegt daran das du versucht's ein "Misch-Package-Nicht-Package" System zu bauen. Ich vertrete die Auffassung, entweder ALLES mit Packages oder GARNICHT's.

Eigentlich versuche ich nur, ein Frame aus einer DLL zu laden :wink:, welche Packages dafür benutzt wwerden, ist mir gleich. Hauptsache es funktionuckelt irgendwie (anständig).

Von den "Required Packages" die du erwähnst, sehe ich keine Spur. In meinen Projektoptionen kann ich nur die Packages einstellen, die mit kompiliert werden sollen ("Project | Options", Register "Packages"). Das können entweder "Designtime Packages" (das ist eine lange Liste mit Check-Boxen), oder "Runtime packages" (das ist unten das kleine Text-Edit) sein.

Bestenfalls gibt ein ein "Requires"-Teil, wenn ich das ganze als Package machen wollte. (Es gibt die Möglichkeit, Quellcode u.ä. in Laufzeit-Packages auszulagen und zur Laufzeit dynamisch einzubinden - was ist aber nicht will)...

:( Ganymed

negaH 25. Sep 2003 12:02

Re: Frames aus DLLs..? TFont <> TFont!?
 
Genau das Edit ist "required Packages", dort solten alle Packages stehen deren Komponenten gemeinsam benutzt werden.

Gruß Hagen

Igotcha 11. Mär 2005 15:30

Re: Frames aus DLLs..? TFont <> TFont!?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ist zwar ein alter Thread, doch bin ich durch ein anderes Forum auf Deine Methode gestossen.

Ich habe das Problem, dass ich die EXE nicht so erstellen kann, wie Du das hier beschreibst:

http://www.entwickler-forum.de/webx?...d.1@.ee86b38/9

Delphi-Quellcode:
// hier das Project für die EXE
// diese MUSS mit Laufzeitpackages compiliert werden und muß in der
// required Packages Option das package MAIN.bpl enthalten
program project1;
 
......
 
 
begin
  Application.Initialize;
// Mainform aus Package Main.bpl wird statisch geladen
  Applciation.CreateForm(TMainForm, MainForm);
  Application.Run;
end.
Wie erstelle ich mir denn solch eine EXE? Eine Form enthält sie ja nicht, da die "MainForm" in das Package "Main.bpl" ausgelagert ist. Ich bin über "File -> New Application" gegangen und habe "Unit1" aus dem Projekt gelöscht, dann im Projekt-Manager auf "Project1.exe" und "View Source" - aber wie weiter?

Auch habe ich offensichtlich ein ähnliches Problem, wie mein Vorposter, denn das mit dem "requires" funktioniert doch nur bei Packages selbst, oder?

Anbei ein Screenshot von meinen Projekt-Optionen.

Da mich Dein Ansatz sehr interessiert, würde ich das auch gerne mal testen wollen ;-)

negaH 12. Mär 2005 15:10

Re: Frames aus DLLs..? TFont <> TFont!?
 
Ok nochmal Step by Step:

1.) erzeuge ein neues Formular mit Klassennamen TMainForm.
2.) speicher das unter Unit "FormMain.pas" ab.
3.) erzeuge nun ein neues Package mit Namen "Main", als RunTime package
4.) füge in dieses Package Unit "FormMain.pas" hinzu
5.) kompiliere es
6.) erzeuge neue Anwendung, und lösche Unit1.pas raus
7.) in Projektoptionen "mit packages" kompilieren, und Main in benötigte packages eintragen
8.) Füge "FormMain.pas" in Formulare hinzu
9.) kompiliere EXE


Die EXE benötigt nun alle Packages wie VCL, DB usw. und eben auch das neue Package MAIN. In diesem Package ist das Hauptformular in Unit FormMain.pas. Alles was damit zu tun hat sprich Code/Resource usw. wird also in dieses package gespeichert statt in der EXE. Die EXE selber wird höchsten 17 Kb groß sein.

gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:57 Uhr.
Seite 1 von 2  1 2      

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