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 Form als .dll ??? (https://www.delphipraxis.net/44062-form-als-dll.html)

Bernd29bln 12. Apr 2005 21:21


Form als .dll ???
 
Hallo, :hi:

Ich hab da mal ne Frage. Kann ich eine form als dll Laden ?
Und vor allem wie?

MfG

JasonDX 12. Apr 2005 21:31

Re: Form als .dll ???
 
du kannst eine DLL erstellen, ein neues Forumular dem Projekt hinzufügen, und dann eine funktion exportieren, die dir eine Instanz deiner Formularklasse zurückgibt.

z.B.
Delphi-Quellcode:
function GiveMeAFormular: TForm;
begin
  application.Create(TForm1, result);
end;

dann kannst du im hauptprogramm das formular folgendermaßen anzeigen:
Delphi-Quellcode:
procedure ShowFormFromDLL;
begin
  with GiveMeAFormular do begin
    ShowModal;
    Free;
  end;
end;

Bernd29bln 12. Apr 2005 21:38

Re: Form als .dll ???
 
Kann ich den ein Pannel als dll in meine form laden ?

MfG

gsh 12. Apr 2005 21:51

Re: Form als .dll ???
 
im Prinzip des gleiche wie Chimaira gesagt hat mit dem Formular nur halt mit Tpanel und nicht ShowModal sondern parent, ... was man halt so braucht.

PS: Wenn du sagst des Panel ist ein "kind" vom Formular dann wird des Panel freigegeben wenn des Formular freigegeben wird (oder? :stupid: *frage zu anderen DP-Mitglieder*)

Bernd29bln 13. Apr 2005 19:01

Re: Form als .dll ???
 
hab die form jetzt in eine dll gepackt. wie kann ich sie per button aufrufen?

MfG

malo 13. Apr 2005 19:07

Re: Form als .dll ???
 
Zitat:

Zitat von Bernd29bln
hab die form jetzt in eine dll gepackt. wie kann ich sie per button aufrufen?

MfG

Schau dir mal bei Delphi-Source das DLL-Tutorial durch ;)

Bernd29bln 13. Apr 2005 19:43

Re: Form als .dll ???
 
Danke erstmal für deinen tip. irgend wie läuft mein code zum aufrufen nicht (undefinierter bezeichner dllformshow)

Delphi-Quellcode:

{$R *.dfm}
procedure Test(s: PChar); stdcall; external 'Project1.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
  DLLFormShow;
end;

end;
MfG

JasonDX 13. Apr 2005 19:46

Re: Form als .dll ???
 
Du hast die Prozedur oben Test genannt. (Ich hoffe, sie heißt in der DLL auch Test mit dem Parameter PChar)

somit musst du die funktion Test(irgendeinPChar) auch aufrufen.
Außer delphi spinnt, weil du tatsächlich irgendwo in deinem quellcode vor dem aufruf die funktion dllShowForm deklariert hast ;)

Bernd29bln 13. Apr 2005 20:04

Re: Form als .dll ???
 
da hab ich wohl einiges vergessen .
meine dll
Delphi-Quellcode:

library Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {dllform};

{$R *.res}

procedure DLLFormShow;
var
  dllForm: TForm;
begin
  dllForm:=TForm.Create(Application);
  try
    dllForm.ShowModal;
  finally
    dllForm.Release;
  end;
end;

 
exports dllFormshow;

end.
function ?? ich hab da ne procedure

kann mir das mal jemand erklären?

MfG

JasonDX 13. Apr 2005 20:06

Re: Form als .dll ???
 
dann musst du die funktion oben im programm, wo du sie aus der dll lädst, auch als dllShowForm laden
du hattest folgenden Code im Programm
Delphi-Quellcode:
procedure Test(s: PChar); stdcall; external 'Project1.dll';
das müsste werden:
Delphi-Quellcode:
procedure DLLFormShow; stdcall; external 'Project1.dll';

Bernd29bln 13. Apr 2005 20:32

Re: Form als .dll ???
 
nun zeigt er mir ne form an aber nicht die aus der dll hmm... ,den die aus der dll ist blau und nicht standard.

MfG

JasonDX 13. Apr 2005 20:35

Re: Form als .dll ???
 
hast du die DLL neu kompiliert und lädst auch von der die prozedur?
falls nicht, probier mal einfach ne ShowMessage in der Prozedur der DLL reinzutun (vor dem anzeigen des Forumlars)
somit siehst du dann, ob auch wirklich diese prozedur aufgerufen wird

Bernd29bln 13. Apr 2005 20:39

Re: Form als .dll ???
 
ich hab ein kleines hauptprogramm mit form und button und die dll . die form die in der dll ist hat die farbe blau angezeigt wird mir ne andere keine ahnung woher.

MfG

Bernd29bln 13. Apr 2005 20:40

Re: Form als .dll ???
 
hattest doch recht hab vergessen zu compielieren geht super dank euch. :firejump:

Dani 13. Apr 2005 22:03

Re: Form als .dll ???
 
wenn du planst, das ganze nur mit Delphi-Anwendungen zu benutzen, würde ich dir empfehlen statt DLLs lieber Packages zu verwenden, weil die den DLLs beim Umgang mit Objekten und Strings als Parameter überlegen sind. http://delphi.about.com/od/objectpas.../aa010901a.htm

Igotcha 13. Apr 2005 23:34

Re: Form als .dll ???
 
Ich möchte vorschlagen, dass Du die bisher genannten Vorschläge fallen lässt (ich spreche aus eigener Erfahrung, da ich mich bereits lange mit dem Thema beschäftige).

Das Problem bei den geposteten Lösungen (auch der Artikel auf delphi.about.com) ist, dass Du mit den beschriebenen Methoden kein gemeinsamen Application-Object bekommst, obwohl der Hinweis mit BPLs schon sehr gut ist. Die genannten Ansätze (auch was Du hier im Forum unter dem Stichwort findest) sind der Art "wie zeige ich eine Form aus einer DLL / BPL an?". Das bringt Dir aber nichts, denn Du willst ja auch mit der Form u.U. arbeiten.

Ein ganz simples Beispiel was ich mit "gemeinsames Application-Object" meine:

Erstelle Dir mal eine Form mit ein paar Edit-Feldern nach genannten Ansätzen und binde diese z.B. als MDI-Child ein. Wenn Du jetzt versuchst, Dich per TAB zwischen den den einzelnen Edits zu bewegen, landest Du nach dem ersten Tab in der Hauptanwendung und kommst nie mehr per TAB auf Deine Modulare Form zurück.

Die einzige Möglichkeit, wie man das Problem umgehen kann, ist Hauptanwendung und modulare Formulare unter Verwendung von Laufzeitpackages und einer gemeinsamen Formularklasse zu kompilieren. Wenn Du dann deine Module (ich verwende BPLs) in die Hauptanwendung lädst, werden sie tatsächlich Bestandteil einer gemeinsamen Applikation.

Viele Grüße
Igotcha

Dani 14. Apr 2005 17:23

Re: Form als .dll ???
 
Das Problem mit den gemeinsamen Screen und Application Objekten lässt sich aber relativ leicht umgehen...

Delphi-Quellcode:
//Modul-Code

var
 BPLApplication: TApplication;
 BPLScreen: TScreen;

{...}

function InitModule(GlobalApplication: TApplication; GlobalScreen: TScreen;
                    FileName: String; var StatusStr: String): Boolean;
begin
 Result := true;
 try
  RegisterClass(TMeineFormKlasse);
 except
  Result := false;
  StatusStr := 'Ursache: Dieses Modul wurde bereits geladen.';
  exit;
 end;
 try
  BPLApplication := Application;
  Application := GlobalApplication;
  Application.Initialize;
 except
  Result := false;
  StatusStr := 'Ursache: Fehler bei der Übergabe des Application-Objekts.';
  exit;
 end;
 try
  BPLScreen := Screen;
  Screen := GlobalScreen;
 except
  Result := false;
  StatusStr := 'Ursache: Fehler bei der Übergabe des Screen-Objekts.';
  exit;
 end;
end;

procedure DeInitModule;
begin
 Application := BPLApplication;
 Screen := BPLScreen;
 UnregisterClass(TMeineFormKlasse);
end;
Wenn du ein Modul lädst, musst du dann nur noch InitModule aufrufen bevor du irgendwelche MDI Child-Windows erzeugst; und das Modul vor dem UnloadPackage-Aufruf mit DeInitModule deinitialisieren. Du kannst die Prozedur natürlich auch z.B in FinalizeModule umbenennen.

Edit: Tags :confused:

Bernd29bln 14. Apr 2005 19:03

Re: Form als .dll ???
 
Hallo ,

was Igotcha geschrieben hat kann ich bestätigen ist nicht die lösung ,aber ich habs hinbekommen mit viel hilfe :thumb: .

gibt es den dafür ein tut oder jemand der es mir erklären kann. :gruebel:

MfG


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