Formular aus Delphi Formular-DLL laden

Zur Vorstellung von Komponenten und Units für Lazarus

Formular aus Delphi Formular-DLL laden

Beitragvon ulhau » 3. Mär 2008, 00:21 Formular aus Delphi Formular-DLL laden

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!
ulhau
 
Beiträge: 65
Registriert: 27. Okt 2007, 13:27
Wohnort: Seebergen
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Christian » 3. Mär 2008, 12:05

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/
Christian
Lazarusforum e. V.
 
Beiträge: 6085
Registriert: 21. Sep 2006, 07:51
Wohnort: Dessau
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z) | 
CPU-Target: AVR,ARM,x86(-64)
Nach oben

Beitragvon ulhau » 3. Mär 2008, 22:42

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!
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
ulhau
 
Beiträge: 65
Registriert: 27. Okt 2007, 13:27
Wohnort: Seebergen
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon monta » 3. Mär 2008, 23:00

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
monta
Lazarusforum e. V.
 
Beiträge: 2842
Registriert: 9. Sep 2006, 18:05
Wohnort: Dresden
OS, Lazarus, FPC: Winux (L trunk FPC trunk) | 
CPU-Target: 64Bit
Nach oben

Beitragvon ulhau » 3. Mär 2008, 23:29

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!
ulhau
 
Beiträge: 65
Registriert: 27. Okt 2007, 13:27
Wohnort: Seebergen
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon Christian » 4. Mär 2008, 08:20

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/
Christian
Lazarusforum e. V.
 
Beiträge: 6085
Registriert: 21. Sep 2006, 07:51
Wohnort: Dessau
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z) | 
CPU-Target: AVR,ARM,x86(-64)
Nach oben

Beitragvon af0815 » 4. Mär 2008, 10:05

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).
af0815
 
Beiträge: 3740
Registriert: 7. Jan 2007, 11:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon ulhau » 4. Mär 2008, 22:39

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!
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
ulhau
 
Beiträge: 65
Registriert: 27. Okt 2007, 13:27
Wohnort: Seebergen
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon mschnell » 5. Mär 2008, 09:51

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
mschnell
 
Beiträge: 3355
Registriert: 11. Sep 2006, 10:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

Beitragvon monta » 5. Mär 2008, 10:17

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
monta
Lazarusforum e. V.
 
Beiträge: 2842
Registriert: 9. Sep 2006, 18:05
Wohnort: Dresden
OS, Lazarus, FPC: Winux (L trunk FPC trunk) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Christian » 5. Mär 2008, 10:24

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/
Christian
Lazarusforum e. V.
 
Beiträge: 6085
Registriert: 21. Sep 2006, 07:51
Wohnort: Dessau
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z) | 
CPU-Target: AVR,ARM,x86(-64)
Nach oben

Beitragvon ulhau » 5. Mär 2008, 23:30

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!
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
ulhau
 
Beiträge: 65
Registriert: 27. Okt 2007, 13:27
Wohnort: Seebergen
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon ulhau » 17. Mär 2008, 08:36

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!
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
ulhau
 
Beiträge: 65
Registriert: 27. Okt 2007, 13:27
Wohnort: Seebergen
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon monta » 17. Mär 2008, 22:58

Sehr interessant, Danke!
Johannes
monta
Lazarusforum e. V.
 
Beiträge: 2842
Registriert: 9. Sep 2006, 18:05
Wohnort: Dresden
OS, Lazarus, FPC: Winux (L trunk FPC trunk) | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Units/Komponenten



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried