Form in Library

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Form in Library

Beitrag von RSE »

Hallo!

Ich bin dabei eine Library als PlugIn zu schreiben. Habe mich durchgegoogelt und hoffe, dass das alles so richtig ist. Jetzt weiß ich nur nicht, was ich meiner Form in der Library für einen Owner übergeben soll. An dieser Stelle möchte ich gleich meinen Code von Euch auf Fehler überprüfen lassen ;-) Code in der Library:

Code: Alles auswählen

library UI;
 
{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, UMain, ULog; // Interfaces ermöglicht visuelle Komponenten, die anderen beiden sind eigene Units, die solche enthalten
 
{$IFDEF WINDOWS}{$R UI.rc}{$ENDIF}
 
procedure ShowMain; {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF} // die Library soll plattformunabhängig sein
begin
  if not Assigned(MainForm) then
    MainForm := TMainForm.Create(nil);  // nil scheint nicht zu funktionieren -> 
  MainForm.Show; // hier kommt Fehler: "Failed to create win32 control, error: 1407: Fensterklasse wurde nicht gefunden." Ich vermute, es wird versucht das Form im Owner zu positionieren oder so?
end;
 
exports
  ShowMain;
 
end.
Unit UMain in der Library (Auszug):

Code: Alles auswählen

unit UMain; 
 
{$mode objfpc}{$H+}
 
interface
... // korrekte Klassendefinition von TMainForm aus einer GUI-Anwendung rüberkopiert, dort getestet und lauffähig
var
  MainForm: TMainForm;
 
implementation
... // Implementierung von TMainForm
initialization
  {$I umain.lrs}
 
finalization
  if Assigned(MainForm) then
    MainForm.Free;  // gegen Speicherlücken ist hier sicherlich der richtige Ort zum freigeben?
 
end.
Mein Hauptprogramm:

Code: Alles auswählen

program URSEPlayer;
 
{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, SysUtils, FileUtil, CRT, DynLibs, RSELists, UDefines;
 
{$IFDEF WINDOWS}{$R URSEPlayer.rc}{$ENDIF}
 
type
 
  TProcedure = procedure; {$IFDEF WINDOWS} stdcall; {$ELSE} cdecl; {$ENDIF}
...
 
var
  UILib: TLibHandle;
  AppDir: String;
  ShowMain: TProcedure;
 
begin
  AppDir := ExtractFileDir(ParamStrUTF8(0));
  UILib := LoadLibrary(AppDir+PlugInDir+'ui.rpp');
  try
    Pointer(ShowMain) := GetProcedureAddress(UILib,'ShowMain');
    if Pointer(ShowMain) <> nil then
      ShowMain; // ohne diese Zeile klappt alles, der Aufruf selbst klappt auch, Fehler siehe library
    repeat 
    until KeyPressed; // damit das Programm nicht gleich zu Ende ist
  finally
    UnLoadLibrary(UILib); 
  end;
end.
Was muss ich an TMainForm.Create(AOwner) als Owner übergeben? Das Konsolenfenster brauch ich eigentlich auch nicht...
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Benutzeravatar
theo
Beiträge: 11111
Registriert: Mo 11. Sep 2006, 19:01

Re: Form in Library

Beitrag von theo »

http://bugs.freepascal.org/view.php?id=7182" onclick="window.open(this.href);return false;

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Form in Library

Beitrag von RSE »

Uff, da versteh ich nur Bahnhof. Aber offensichtlich ist wohl die LCL in DLLs bis zur Unbenutzbarkeit verbuggt, wenn ich das richtig herauslese. Sehr schade. Dann muss ich wohl meine UI doch in das Hauptprogramm integrieren und evtl. erst später in eine Library auslagern. Ich gehe mal davon aus, dass der restliche Quelltext so i.O. ist? Librarys sind für mich noch relativ neu.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Form in Library

Beitrag von Hitman »

RSE hat geschrieben:Uff, da versteh ich nur Bahnhof. Aber offensichtlich ist wohl die LCL in DLLs bis zur Unbenutzbarkeit verbuggt, wenn ich das richtig herauslese. Sehr schade. Dann muss ich wohl meine UI doch in das Hauptprogramm integrieren und evtl. erst später in eine Library auslagern. Ich gehe mal davon aus, dass der restliche Quelltext so i.O. ist? Librarys sind für mich noch relativ neu.
... oder einfach nicht die LCL nehmen. Ich kann KOL empfehlen - hat auch gleich noch den Vorteil des geringeren Overheads.

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Form in Library

Beitrag von RSE »

Noch so´n Nachtschwärmer...

Die KOL is aber (zumindest auf den ersten Blick) nur für Win, ich will aber plattformunabhängig bleiben. Da is mir eine integrierte UI lieber ;-)
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

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:

Re: Form in Library

Beitrag von monta »

Du kannst alternativ auch über das Komponentenstreaming gehen.

Es sollte gehen, wenn du deine Form als XML-String in der DLL hinterlegst und als Funktionswert an deine Anwendung übergibst und damit ein Formular bestückst.

Ein Beispiel zum Streaming von Komponenten unter Lazarus findest du auch unter examples/componentstreaming
Johannes

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Form in Library

Beitrag von RSE »

Ich denke, das wird mir zu umständlich, nur um später mal mittels Plugins alternative UIs zuzulassen ;-) Vielleicht werde ich diese Möglichkeiten in den anderen Plugins verwenden, um spezielle Einstellungen in die UI einzuimpfen oder so, aber nicht für meine komplette UI. Vielleicht später mal, wenns nicht mehr verbuggt ist. Irgendwann in ein paar Jahren wird das schon noch kommen.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Form in Library

Beitrag von Targion »

Wenn du Plattformunabhängig bleiben willst, sollte das Erstellen von Forms am besten das Hauptprogramm erledigen. Es sei denn, die willst, dass deine Lib auch GTK2/Qt Abhängigkeiten hat.

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Form in Library

Beitrag von RSE »

Targion hat geschrieben:Es sei denn, die willst, dass deine Lib auch GTK2/Qt Abhängigkeiten hat.
Was heißt das? Ist dann nicht alles im Compilat, was gebraucht wird, oder wie? Sorry, von Linux hab ich bisher so gut wie keine Ahnung, aber ich will mir das eben für die Zukunft offenhalten.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Antworten