Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Tabsheet aus dll erzeugen (https://www.delphipraxis.net/32275-tabsheet-aus-dll-erzeugen.html)

Dt2158 21. Okt 2004 10:08


Tabsheet aus dll erzeugen
 
Habe in meinem Programm ein Pagecontrol mit namen "PageControlTool" auf diesem will ich mittels .dll ein Tabsheet erzeugen.

Hier der Code der libary:

Delphi-Quellcode:
library pl_html;

{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muß sich in der
  ersten Unit der unit-Klausel der Bibliothek und des Projekts befinden (Projekt-
  Quelltext anzeigen), falls die DLL Prozeduren oder Funktionen exportiert, die
  Strings als Parameter oder Funktionsergebnisse übergeben. Das gilt für alle
  Strings, die von oder an die DLL übergeben werden -- sogar für diejenigen, die
  sich in Records und Klassen befinden. Sharemem ist die Schnittstellen-Unit zur
  Verwaltungs-DLL für gemeinsame Speicherzugriffe, BORLNDMM.DLL.
  Um die Verwendung von BORLNDMM.DLL zu vermeiden, können Sie String-
  Informationen als PChar- oder ShortString-Parameter übergeben. }
 

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ComCtrls,  ExtCtrls, TabNotBk, ImgList;

var
 TabSheetTest: TTabSheet;

{$R *.res}

procedure Test;
begin
TabSheetTest := TTabSheet.Create((FindComponent('PageControlTool') as TPageControl).Name);
TabSheetTest.PageControl := (FindComponent('PageControlTool') as TPageControl).Name;
TabsheetTest.Caption := 'Test';
TabsheetTest.Name := 'TabSheetTool1';
end;

exports Test;

begin
end.
nur bei compilieren meckert er, das findcomponent ein undefinert bezeichner ist, was ja auch irgendwie logisch ist, ich habe gelesen es liegt am fehlenden Form, dessen Methode "FindComponent" nunmal ist.
Aber wie kann ich das realiseren?

Dt2158

mirage228 21. Okt 2004 10:11

Re: Tabsheet aus dll erzeugen
 
Hi,

du exportiest eine Prozedur, die einen Parameter vom Typ TPageControl hat. Das PageControl benutzt Du dann als Parent für Dein Tabsheet.
Dein Hauptprogramm übergibt dann das Ziel-PageControl der DLL beim Aufruf.

Aber vorsicht: Die DLL und Dein Programm sollten dann möglichst mit der selben Delphi-Version kompiliert werden, da die TPageControl Klassen sich sonst möglicherweise unterscheiden (das führt dann zu Fehlern).

mfG
mirage228

Dt2158 21. Okt 2004 11:08

Re: Tabsheet aus dll erzeugen
 
also hab mal so meine dll gemacht!
Delphi-Quellcode:
library pl_html;

{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muß sich in der
  ersten Unit der unit-Klausel der Bibliothek und des Projekts befinden (Projekt-
  Quelltext anzeigen), falls die DLL Prozeduren oder Funktionen exportiert, die
  Strings als Parameter oder Funktionsergebnisse übergeben. Das gilt für alle
  Strings, die von oder an die DLL übergeben werden -- sogar für diejenigen, die
  sich in Records und Klassen befinden. Sharemem ist die Schnittstellen-Unit zur
  Verwaltungs-DLL für gemeinsame Speicherzugriffe, BORLNDMM.DLL.
  Um die Verwendung von BORLNDMM.DLL zu vermeiden, können Sie String-
  Informationen als PChar- oder ShortString-Parameter übergeben. }


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ComCtrls,  ExtCtrls, TabNotBk, ImgList;

var
 TabSheetTest: TTabSheet;

{$R *.res}

procedure Test(pTool: TPageControl);
begin
TabSheetTest := TTabSheet.Create(pTool);
TabSheetTest.PageControl := pTool;
TabsheetTest.Caption := 'Test';
TabsheetTest.Name := 'TabSheetTool1';
end;

exports Test;

begin
end.
das hauptprogramm:
Delphi-Quellcode:
interface

...

 procedure Test(pTool: TPageControl);

implementation

 procedure Test(pTool: TPageControl); external 'pl_html.dll';

...
...
...

procedure TMainForm.Button1Click(Sender: TObject);
begin
 test(pagecontrol_tools);
end;

fehlermeldung
Zitat:

bla bla Converterror: "Tfont kann nicht tfont zugewiesen werden" blabla
logisch! :lol:

aber was nun?

Treffnix 21. Okt 2004 11:23

Re: Tabsheet aus dll erzeugen
 
Setz mal bei der DLL in den Projektoptionen unterm Reiter "Packages" den Haken "mit Laufzeitpackages aktualisieren"

Dt2158 21. Okt 2004 11:45

Re: Tabsheet aus dll erzeugen
 
ja also postiv ist, das dadurch die dll von 356 kb auf 12kb geschrumpft ist,
negativ ist das die meldung weiterhin kommt!

Stevie 21. Okt 2004 12:19

Re: Tabsheet aus dll erzeugen
 
Frag mich nicht warum, aber wenn du vor der PageControl-Zuweisung TabSheetTest.ParentFont := False; schreibst, funktioniert es.

P.S. Achtung: Bei "mit Laufzeitpackages aktualisieren" müssen die Vcl-Bpls bei Weitergabe des Programms mitgegeben werden!!!

Treffnix 21. Okt 2004 12:19

Re: Tabsheet aus dll erzeugen
 
:gruebel:

Versuch mal bei der Exe das gleiche. Ich bin mir ziemlich sicher, dass das Problem damit zu tun hatte. Welche Packages stehen denn bei dir in dem Edit unter dem Haken?

Stevie 21. Okt 2004 12:22

Re: Tabsheet aus dll erzeugen
 
Zitat:

Zitat von Treffnix
:gruebel:

Versuch mal bei der Exe das gleiche. Ich bin mir ziemlich sicher, dass das Problem damit zu tun hatte. Welche Packages stehen denn bei dir in dem Edit unter dem Haken?

Sauber! Klappt... (hab die Vcl und die Rtl drin)

Dt2158 22. Okt 2004 08:45

Re: Tabsheet aus dll erzeugen
 
jo geht
danke
aber was heißt die einstellung überhaupt?
die exe ist jetzt statt 800 kb nur noch 79 kb groß, läuft die auch auf jedem anderen system?? (Laufzeitpackage?)

Ich frage mich wenn alle projekte so um den faktor 10 verkleinert werden können, warum regen sich dann alle über die großen ausgabedateien auf, da muss doch ein hacken sein?

Dt2158 22. Okt 2004 10:17

Re: Tabsheet aus dll erzeugen
 
also hab mich kundig gemacht, das mit laufzeitpackages kommt für mich nicht in frage, da ich gerne nur eine exe weitergeben möchte und nicht erst noch runtime files mitliefern muss!

das mit dem Parentfont funktioniert zwar, liefert aber beim beenden eine fehlermeldung

Treffnix 22. Okt 2004 10:52

Re: Tabsheet aus dll erzeugen
 
Ja, das is unschön. Das Problem hatten schon viele, aber meines Wissens gibt es nach wie vor keine Lösung dafür. Höchstens Workarounds. :(

Dt2158 22. Okt 2004 11:32

Re: Tabsheet aus dll erzeugen
 
wie soll das heißen, borland produziert ein buglastiges produkt, dafür muss es doch ein lösung geben

Treffnix 22. Okt 2004 11:47

Re: Tabsheet aus dll erzeugen
 
Wenn du eine findest, wär ich für nen Hinweis dankbar.

Stevie 25. Okt 2004 08:58

Re: Tabsheet aus dll erzeugen
 
Zitat:

Zitat von Dt2158
wie soll das heißen, borland produziert ein buglastiges produkt, dafür muss es doch ein lösung geben

Das ist kein Bug!!! Die Dll wird geladen, wenn du das Programm startest und er sich die Test-Prozedur aus der Dll holen muss.
Allerdings wird die Dll entladen, bevor du die erstellten Objekte wieder freigegeben hast!
Eine einfache Lösung gegen die Fehlermeldung beim Schließen sähe so aus:
Delphi-Quellcode:
procedure TForm1.FormDestroy(Sender: TObject);
begin
  while PageControl1.ActivePage <> nil do
    PageControl1.ActivePage.Free;
end;
Besser wäre aber, in der dll selber beim Entladen alle von ihr erstellten Objekte sauber freizugeben! Guck dir dazu am besten das Dll-Tutorial von Assarbad an.
Du könntest es auch mal mit dynamischem Laden der Dll ausprobieren und schauen, ob's dann vernünftig funktioniert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:19 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