Formular aus Delphi Formular-DLL laden

Zur Vorstellung von Komponenten und Units für Lazarus
Antworten
ulhau
Beiträge: 65
Registriert: Sa 27. Okt 2007, 13:27
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Seebergen

Formular aus Delphi Formular-DLL laden

Beitrag von ulhau »

Hallo Leute!

Es ist mal wieder blos was für Windowser. :wink: Einer der letzten Beiträge in der "DP" hat mich auf eine zweifelhafte Idee gebracht. :oops: (Das war der Beitrag in dem ein Programm in ein Panel eines anderen Programmes verschoben wird.)

Und zwar geht es darum das ich für in Lazarus nicht existente Komponenten (RichEdit, Dateimanager, WebBrowser) eine Formular-DLL in Delphi mache und die dann mit einem Lazarusprogramm benutze. :lol: Also, das fertige Formular vom Lazarusprogramm aus aufrufe und benutze oder zum beispiel in einem Panel auf dem Lazarusformular anzeige. :roll:

Naja, wie seht Ihr das jetzt. Als realisierbar oder als totaler Schwachsinn. (Warscheinlich beides. Oder?) :oops: Es geht jetzt erstmal nicht unbedingt um Datenaustausch zwischen Lazarusformular und Delphi DLL-Formular, sondern Formular anzeigen, damit arbeiten, Formular schliessen und fertig. :wink:

Hat schon mal jemand so was gemacht mit Lazarus? Ich habe bis jetzt sowas nur mal probeweise mit Delphi (wie in der DP) gemacht und hab noch keinen richtigen Plan wie und wo ich da ansetzen soll. Oder soll ich doch lieber auf Pluto's Komponenten warten? :wink:

Tschüssss!

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Da das eh Windows spezifisch ist kannst du dann auch gleich das RichEdit von Windows kapseln. Das hat bloß niemand gemacht weil es halt Windows spezifisch ist. Das wäre der sauberere und sicher auch einfachere Weg.

Als HTML Browser Komponente kannst du Turbopower Ipro nehmen welches auch immer beim Lazarus dabei ist. Dateimanager Komponenten bastelst du dir lieber Anwendungsspezifisch aus ListView und TreeView.

Weiterhin kann man keine Delphi Formulare aus dlls laden vom Lazarus aus. Das geht im Moment nicht mal mit Lazarus Formularen.
Es könnte aber klappen ein Fensterhandle zu übergeben und aus der Dll dann die Komponente auf dem eigenen Formular zu erzeugen. Damit hast aber noch keine einzige Eigenschaft oder Ereignis zugewiesen.
Für mich schaut das arg nach "durch den Zeh eine Hirnoperation vorgenommen" aus.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

ulhau
Beiträge: 65
Registriert: Sa 27. Okt 2007, 13:27
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Seebergen

Beitrag von ulhau »

Hallo Christian!

Für mich schaut das arg nach "durch den Zeh eine Hirnoperation vorgenommen" aus.


Nette Umschreibung. Aber womöglich ist der Weg nicht ganz so weit. Ich hab das halt einfach mal gemacht (nur ganz einfach) und kann nur sagen: "Es hat geklappt!".

Hier der Delphicode für die DLL:

Code: Alles auswählen

library Formdll;
 
uses
  Forms,
  FormularDll in 'FormularDll.PAS' {DllForm};
 
{$R *.RES}
 
exports
  ZeigDich;
 
begin
end.


Hier der Delphicode für das Formular:

Code: Alles auswählen

unit FormularDll;
 
interface
 
uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls, ComCtrls, OleCtrls, ExtCtrls, Buttons;
 
type
  TDllForm = class(TForm)
    BitBtn2: TBitBtn;
    procedure BitBtn2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
 
var
  DllForm: TDllForm;
 
{$ifdef WIN32}
procedure ZeigDich;
{$else}
procedure ZeigDich; export;
{$endif}
 
implementation
 
{$R *.DFM}
 
 
Procedure ZeigDich;
begin
  DllForm := TDllForm.Create(Application);
  DllForm.Show;
end;
 
procedure TDllForm.BitBtn2Click(Sender: TObject);
begin
  DllForm.Release;
end;
 
end.


Hier der Lazaruscode für das Project:

Code: Alles auswählen

program project1;
 
{$mode objfpc}{$H+}
{$R *.res}
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms
  { you can add units after this }, Unit1;
 
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.


Hier der Lazaruscode für das aufrufende Formular:

Code: Alles auswählen

unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, TypInfo, Forms, ExtCtrls,
  AvgLvlTree, LCLType, LCLProc, LCLIntf, LResources, GraphType, Graphics, Menus,
  ActnList, ClipBrd, Controls, Buttons, Windows;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Panel1: TPanel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
  aWnd : Hwnd;
  WPM : TWindowPlacement;
 
procedure ZeigDich;
 
implementation
 
{ TForm1 }
procedure ZeigDich; external 'FORMDLL';
 
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  ZeigDich;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Close;
end;
 
 
 
 
initialization
  {$I unit1.lrs}
 
end.


Ich hänge da mal ein Bildchen an.

Es wäre echt schade wenn keiner was macht weil es halt Windows spezifisch ist und Windows spezifisches für Lazarus links liegen bleibt. Ja stell Dir vor es gibt Freibier und keiner geht hin. Ich probiere das mal weiter bis ich im Hirn bin und lass den Sinn erst mal aussen vor.

Tschüsss!
Dateianhänge
Zwei ungleiche Brüder.
Zwei ungleiche Brüder.

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Sieht ja nett aus, aber was mir gerade nicht so recht in den Kopf will, wenn ich das >Formular aufrufe, wie will ich mit diesem dann interagieren? Kann ich etwa direkt auf die Controls zugreifen, eigentlich doch nicht, oder?
Johannes

ulhau
Beiträge: 65
Registriert: Sa 27. Okt 2007, 13:27
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Seebergen

Beitrag von ulhau »

Hallo Monta!

Ich kann auch noch nicht sagen was da geht. Aber ich überlege gerade ob ich nicht ne nette Anwendung in eine DLL umwandele und dann halt mal sehen was sie macht.

Tschüsss!

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Gut zu wissen, dann ists also rein dll seitig das problem mit den LCL Formularen. Nützt trotsdem nicht viel das wäre ne super Sache für Plugins aber solang das nicht Plattformübergreifend funktioniert und ich Delphi anfassen muss erstell ich die Formulare lieber zu fuss :p
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Ist mehr als interessant, zumindest die Sachen die am meisten abgehen (RichEdit) zumindest zu so zu wrappen.Das RichEditControl von MS ist gar nicht so leicht einzubinden. Zumindest nicht, bis die generell die Schnittstellen zu ActiveX, Ole leichter für 'normalsterbliche' leichter erfassbar sind.

Deshalb sehe ich die Idee von Ulhau als recht gut an, zumindest ein Workaround zu versuchen. Bezüglich der Interaktion, sehe ich bei der DLL Lösung nur den Weg, Events mittels Callbacks nach aussen zu bekommen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

ulhau
Beiträge: 65
Registriert: Sa 27. Okt 2007, 13:27
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Seebergen

Beitrag von ulhau »

Hallo!

Zuerst mal, ich habe noch keine Anwendung in eine DLL umgebaut. Ich habe aber einige Komponenten auf das Formular gepackt und ein wenig Aktion dazu.

Als erstes die Dateimanager Komponenten: Sie lassen sich mit der Maus ganz normal benutzen und zeigen auf den ersten Blick keine Auffälligkeiten (Mit der Maus).

Als zweites die LsFileExplorer28 Komponenten: Sie lassen sich ebenfalls mit der Maus ganz normal benutzen und zeigen auf den ersten Blick keine Auffälligkeiten (Mit der Maus).

Als drittes die RichEdit Komponente: Es kann ganz normal mit ButtonClick eine Datei geöffnet werden und der Text kann bearbeitet werden.

Als viertes das MozillaBrowser AktivX: Es kann ganz normal mit ButtonClick eine HTML-Datei geöffnet (Offline) und angezeigt werden.

Zur Interaktion zwischen den Formularen habe ich noch nicht's ausprobiert.

Und zum Schluss habe ich dann das DLL-Formular in ein Panel auf dem Lazarus-Formular eingesetzt. Als nächstes versuche ich halt mal eine Anwendung in eine DLL umzuwandeln. Ach ja, das hätte ich fast vergessen. Eine andere Anwendung kann sich ein Lazarusprogramm auch einverleiben.

Ich hänge dann noch mal ein paar Bildchen an.

Tschüsss!
Dateianhänge
Zum Schluss befördert die Betätigung des Button "Das DLL-Formular in Panel2 Zeigen" das Delphi-DLL-Formular in das Panel2 auf dem Lazarusformular.
Zum Schluss befördert die Betätigung des Button "Das DLL-Formular in Panel2 Zeigen" das Delphi-DLL-Formular in das Panel2 auf dem Lazarusformular.
Die Betätigung des Button "HTML Seite" öffnet in der MozillaBrowser Komponente eine HTML-Textdatei.
Die Betätigung des Button "HTML Seite" öffnet in der MozillaBrowser Komponente eine HTML-Textdatei.
Die Betätigung des Button "RTF Seite" öffnet in der RichEdit Komponente eine RTF-Textdatei.
Die Betätigung des Button "RTF Seite" öffnet in der RichEdit Komponente eine RTF-Textdatei.
Das Formular wird mit allen Komponenten korrekt aus der DLL geladen.
Das Formular wird mit allen Komponenten korrekt aus der DLL geladen.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Beitrag von mschnell »

Eine DLL sollte (im Gegensatz zu einem Package) unabhängig davon aufrufbar sein, mit welchem Tool bzw mit welcher Sprache die DLL und das aufrufende Programm erzeugt worden ist. Warum also nicht eine Delphi-DLL mit einem Lazarus-Programm aufrufen.

Wenn Du aber legaler Delphi-Besitzer bist darfst Du doch wohl auch den Sorce-Code, den Du mit Delphi bekommen hast, in einem Lazarus-Projekt verwenden. Du darfst ihn natürlich nicht weitergeben.

-Michael

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Also ich muss sagen, das ganze klingt langsam wirklich interessant. Auch wenn die interaktion wenn wohl nur über aufwendige Callbacks geht. Aber es gibt ja viele Dinge, die auch so gekapselt werden könnten, das verhältnismäßig wenig Interaktion bzw. Gar keine Benötigt wird. Man muss dann halt die DLL so bauen, das das ganze nach Aufruf autark laufen kann.
Bspw. das Richedit rein, und beim Aufruf wird der text geladen und ne Möglichkeit zum Speichern. Viel mehr als nen Dateinamen bräuchte man dann ja nicht übergeben.

Wenn Du aber legaler Delphi-Besitzer bist darfst Du doch wohl auch den Sorce-Code, den Du mit Delphi bekommen hast, in einem Lazarus-Projekt verwenden. Du darfst ihn natürlich nicht weitergeben.


Man könnte auch bspw. die erstellte DLL mit dem Richedit mal hier hochladen. Die dürfte doch völlig frei dann verteilt werden und ich denk, da finden sich sicher einige Nutzer, auch, wenns nicht Plattformunabhängig ist.
Eventuell kannst du auch mal dein Testprojekt zum Rumspielen dran hängen. Das Erstellen der DLL sollte ja auch mit TurboDelphi in der kostenlosen Version gehen, und somit kann es im prinziep auch jeder einsetzen und soweit ich weiß, dann selbst kommerziell.

Ist natürlich nicht so schön, wie wenns in Laz gehen würde, aber ich hoff mal, das geht auch irgendwann und für bestimmte nicht verfügbare Komponenten ist es doch durchaus ne mögliche Lösung.
Johannes

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Ixch glaube eher worauf mschnell hinaus wollte ist das man ums RichEdit zu kapseln auch den Delphi RTL Code nehmen kann. Das dürfte auch recht problemfrei funktionieren. Nur halt ziemlich Windows lastig.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

ulhau
Beiträge: 65
Registriert: Sa 27. Okt 2007, 13:27
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Seebergen

Beitrag von ulhau »

Hallo!

So, jetzt hab ich's gemacht. Ich habe mal den Delphi Demoeditor leicht umgebaut damit er als DLL durchgeht und die Projekte zum Spielen angehängt.


@monta
Man muss dann halt die DLL so bauen, das das ganze nach Aufruf autark laufen kann.

Ungefähr so hatte ich mir das auch gedacht aber unter Umständen geht ja doch mehr.
Eventuell kannst du auch mal dein Testprojekt zum Rumspielen dran hängen.

Habe ich gemacht. Hoffentlich gibts keinen Stress. Ich habe die Originaldemo von Borland/Codegear nur geringfügig geändert und die Copyright's dringelassen. Ist ja eh blos Demo.


@Christian
Ixch glaube eher worauf mschnell hinaus wollte ist das man ums RichEdit zu kapseln auch den Delphi RTL Code nehmen kann. Das dürfte auch recht problemfrei funktionieren. Nur halt ziemlich Windows lastig.


Ich blick da noch nicht durch. Und die Sourcen einfach mit Lazarus kompilieren geht auch nicht so einfach. (Da gibts ne menge Sachen die ein bissel ander's heisen.)

Ich bin schon zufrieden das wenigstens sowas mit Lazarus und DLL's geht. Unter Umständen findet sich ja noch mal jemand der das weiter treiben kann.

Tschüsss!
Dateianhänge
DllFormularTest.zip
(2.74 MiB) 84-mal heruntergeladen

ulhau
Beiträge: 65
Registriert: Sa 27. Okt 2007, 13:27
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Seebergen

Beitrag von ulhau »

Hallo nochmal!

Ich wollte das jetzt nich so stehen lassen ohne noch mal was zur Interaktion zu probieren. Deshalb habe ich mal einige Sachen exportiert um zu sehen was man so machen könnte. Zum testen hab ich das alles mal mit ein paar Button's auf ein Formular gepackt.

Zunächst benutze ich keinen Speichermanager, denn ich verwende "WideString" zum austauschen von String's. Weiter werden Variable vom Typ "Integer, TColor, TFontStyles" zum austauschen von Daten verwendet. Ich habe eine Function benutzt die einen Wert übergibt und ein Ergebnis zurückliefert. Ansonsten werden Proceduren verwendet um Eigenschaften zu setzen und Aktionen auszulösen.



Beschreibung:

1. Der Button "Dll-Formular Laden" wurde deaktiviert weil das Formular schon im OnSchow-Ereignis geladen und eingesetzt wird.
2. Der Button "Dll-Formular Maximieren" maximiert das geladene Formular.
3. Der Button "Dll-Formular Minimieren" minimiert das geladene Formular.
4. Der Button "Dll-Formular Normal" stellt das geladene Formular normal dar. (Übrigen's, das Formular wird Rahmenlos erzeugt.)
5. Der Button "Dll-Formular Breite" soll das Formular in der Breite verändern. (anpassen)
6. Der Button "Dll-Formular Höhe" soll das Formular in der Höhe verändern. (anpassen)
7. Der Button "Dll-Formular Anpassen" soll das Formular in Breite und Höhe anpassen. (Übrigen's, wird das Formular im OnResize ereignis automatisch an die veränderte Grösse angepasst.)
8. In das Editfeld kann ein String eingegeben werden der dann an das Dll-Formular gesendet werden kann. Nach erfolgter Übergabe wird das Ereignis im Editfeld angezeigt. (Zurückgegeben vom Dll-Formular)
9. Der Button "String an RichEdit übergeben" übergibt den String im Editfeld an das Dll-Formular.
10. Der Button "Schriftart der gewählten Zeile wechseln" öffnet einen Schriftart-Dialog mit dem ein vorher im Dll-Formular selektierter Abschnitt geändert werden kann.
11. Der Button "Datei öffnen" öffnet einen Datei-Dialog mit dem eine Datei ausgewählt werden kann die dann im Dll-Formular anzeigt wird.
12. Der Button "Datei speichern" öffnet einen Datei-Dialog mit dem ein Dateiname ausgewählt werden kann unter dem der Inhalt vom Dll-Formular gespeichert werden kann.
13. Der Button "Zeilenumbruch Ein/Aus" schaltet den Zeilenumbruch der RichEdit Komponente Ein oder Aus.
14. Der Button "Scrollbalken Ein/Aus" schaltet die Scrollbalken der RichEdit Komponente Ein oder Aus.
15. Der Button "RichEdit Drucken" startet den Ausdruck des Inhaltes der RichEdit Komponente auf dem aktuellen Systemdrucker.
16. Der Button "Beenden" .... gut lassen wir das.


Ich könnte mir vorstellen das eigentlich alle Einstellungen exportiert werden können. Wenn man eine Interfacekomponennte erzeugt, die eine Schnittstelle zur Dll bildet, währe auch eine Nutzung im Formulardesigner denkbar. Aber eben nur Plattformspeziefisch.

Ich hänge mal das Project als Beispiel an, falls jemant selbst was machen möchte.

Tschüsss!
Dateianhänge
Das Project mal als Bild
Das Project mal als Bild
RichEdit-Dll Project.zip
Das Project mit Lazarus- und Delphisource als Zip.
(1.17 MiB) 74-mal heruntergeladen

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Sehr interessant, Danke!
Johannes

Antworten