Delphi-PRAXiS
Seite 2 von 4     12 34      

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 Wie Panel in dll ablegen und bei bedarf laden (https://www.delphipraxis.net/36112-wie-panel-dll-ablegen-und-bei-bedarf-laden.html)

GuenterS 23. Dez 2004 07:59

Re: Wie Panel in dll ablegen und bei bedarf laden
 
Das klingt ja ganz gut, nur wie kann ich zur Laufzeit sagen, so jetzt nehme bitte nicht nur package eins sondern zusätzlich noch package zwei? Ist das nicht schon fix codiert, welche packages zu einem Programm gehören?

jonny 23. Dez 2004 22:57

Re: Wie Panel in dll ablegen und bei bedarf laden
 
@ Guenter: das ist auch zur laufzeit möglich soviel habe ich schon aus edm tut verstanden.

Aber wie kann ich ein Form aus dem Package auf meiner Hauptanwendung als Panel darstellen. Also nicht als Form sondern als ein Panel mit Schalflächen usw. drauf?

St.Gro 24. Dez 2004 11:03

Re: Wie Panel in dll ablegen und bei bedarf laden
 
Huhu,

du könntest z.B. das ganze Formular im Package mit CreateParented "in das Panel hineinerstellen" (Anstelle von TForm.create benutzt du TForm.createParented und übergibst das Handle von Deinem Panel).

Wenn du (wie in dem Tutorial von Zarko Gajic) mit einer execute-funktion arbeitest, erweitere sie um den parameter "handle: hwnd"
Code:
function execute(const p1,p2,p3: string; handle: hwnd): boolean;

Beim Aufruf übergibst du dann:
Code:
ExecF(sDisplaytext, sYes, sNo, panel.handle);
Und im Package selbst:
Code:
function execute(const p1,p2,p3: string; handle: hwnd): boolean;
begin
  fmTest := TfmTest.CreateParented(handle); //fmTest BorderStyle= bsNone, align=alClient
  fmTest.Show;
  ...
end;
Hoffe, ich konnte helfen!

jonny 24. Dez 2004 11:16

Re: Wie Panel in dll ablegen und bei bedarf laden
 
Ich denke das wird mir weiterhelfen.

Vielen vielen Dank.

PS: Werde das mal nach weihnachten testen und dann melde ich mich wieder.

jonny 24. Dez 2004 15:26

Re: Wie Panel in dll ablegen und bei bedarf laden
 
Warum wird bei mir keine Package.bpl erstellt?

jonny 26. Dez 2004 23:20

Re: Wie Panel in dll ablegen und bei bedarf laden
 
OK! das die BPL datei erstellt wird habe ich hinbekommen, habe jetzt ein anderes Problem: Die Form wird nicht geladen die anwendung verursacht aber eine hohe CPU-Ausslastung.

Hier mein Code

Die hauptanwendung:
Code:
procedure TForm1.Button1Click(Sender: TObject);
var
 phm: HModule;
 ExecF: procedure (handle: hwnd);
begin
 {suppose package is in application's directory}
 phm:=LoadPackage(ExtractFilePath(ParamStr(0)) + 'TestPack.bpl');
 if phm <> 0 then
 try
   @ExecF:=GetProcAddress(phm, 'Execute');
   if Assigned(ExecF) then begin
     ExecF(Panel1.Handle);
   end else begin
     ShowMessage ('Execute routine not found!');
   end{if assigned}
 finally
   UnloadPackage(phm);
 end {try/finally}
 else {if hpm<>0}
   ShowMessage ('Package not found');
end;
Die Panel-Form:
Code:
procedure Execute(handle: hwnd);
begin
  Form1:= TForm1.CreateParented(handle);
  Form1.BorderStyle:=bsNone;
  Form1.Align:=alClient;
  Form1.Show;
end;

exports
  {Win32 export names are case sensitive!}
  Execute;
Hat jemand nen Tipp?

jonny 29. Dez 2004 22:14

Re: Wie Panel in dll ablegen und bei bedarf laden
 
So habe nun eine Procedure geschrieben die das Laden des Plugins übernehmen soll

hier der Quellcode:

Code:
procedure TForm1.LoadPlugin(PluginPath: String);
var phm: HModule;
    LoadP: procedure (Handle: hwnd);
    NewPanel: TPanel;
begin
  phm:=LoadPackage(PluginPath);
  If phm <> 0 Then
  try
    @LoadP:=GetProcAddress(phm, 'LoadMe');
    If Assigned(LoadP) Then
    begin
      NewPanel:=TPanel.Create(Form1);
      NewPanel.Align:=alTop;
      NewPanel.BevelInner:=bvNone;
      NewPanel.BevelOuter:=bvNone;
      NewPanel.Height:=100;
      NewPanel.Visible:=True;
      LoadP(NewPanel.Handle);
    end
    else
    begin
      ShowMessage ('"LoadMe"-Prozedur nicht gefunden');
    end
  finally
    UnloadPackage(phm);
  end
  else
    ShowMessage ('Plugin nicht gefunden');
end;
die Plugin-Unit sieht so aus:

Code:
...
procedure LoadMe(Handle: hwnd);
begin
  Form1:=TForm1.CreateParented(Handle);
  Form1.Align:=alClient;
  Form1.Show;
end;

procedure GetMeFree;
begin
  Form1.Release;
end;


exports
  LoadMe,
  GetMeFree;
end.
- So habe folgende Probleme Das Panel wird nicht erstellt (Bekomme ne Meldung das kein Parent an das Plugin übergeben wurde)
- erstelle ich zur entwurfzeit ein Panel und weise dem Plugin die als Paren zu so wird das Plugin dennoch nicht geladen (ausser einmal hats geklappt)
- Bei dem einen Mal wo es funktioniert hatte zeigte es sich aber nicht so wie erwünscht:
--eigener Taskbutton in der Taskleiste für das Plugin der aber störend ist
--da die Eigenschaft "Align" des Fensters auf "alClient" stand so bozog sich diese nicht auf das Panel sondern auf den Ganzen Bildschirm (Im Panel wurde also nur ein Teil der Form angezeigt)
--Jegliche Funktion der Anwendung war verschwunden noch nicht mal das beenden der Anwendung war möglich.

Kann mir jemand bei dem Problem helfen?

Die Anwendung die ich erstellen möcht soll so eine Art Sidebar werden wie die SmartBarXP oder die DesktopSidebar, wenn jemand die Anwendungen kennt so weiss er bestimmt was ich mit den Panels meine. Wenn jemand die Anwendungen nicht kennt so bin ich bereit ein Screenshot hier zu posten.

Danke schon mal für bisherige und folgende Hilfe.

St.Gro 30. Dez 2004 00:25

Re: Wie Panel in dll ablegen und bei bedarf laden
 
Hallo!

Zitat:

Das Panel wird nicht erstellt (Bekomme ne Meldung das kein Parent an das Plugin übergeben wurde)
Du brauchst noch:

Code:
NewPanel.parent := self;
NewPanel.name := 'Panel1';
Zitat:

eigener Taskbutton in der Taskleiste für das Plugin der aber störend ist
Verschwindet damit:

Code:
form.borderstyle := bsNone;
Und du musst das Package später freigeben, nicht unmittelbar nach der Erstellung.
Bei deinem Code läuft es in einem durch:

Code:
try
  <Erstellung...>
finally
  UnloadPackage(phm);
end
Kommentier die Zeile UnloadPackage mal aus..Setz sie z.B. im onClose vom Formular wieder ein.

Zitat:

Im Panel wurde also nur ein Teil der Form angezeigt
Das ist vermutlich wahr..alClient ist natürlich blödsinn, wenn du das Formular in ein Panel "hineinerstellst", passt es sich in der Größe dem Panel an und es erscheinen natürlich keine Scrollbars.
Erstelle es statt dessen in eine TScrollBox. Blöderweise musst du hierfür noch nach der Erstellung die Höhe des Scrollbars dem erstellten Formular anpassen, in etwa so wird es vermutlich funktionieren:

Code:
procedure LoadMe(Handle: hwnd; var fHeight: integer);
begin
  fmTest:=TfmTest.CreateParented(Handle);
  fmTest.Align := alNone;
  fmTest.SetBounds(10,10,400,400);
  fHeight := fmTest.top + fmTest.height;
...
entsprechend beim Aufruf:

Code:
procedure TForm1.LoadPlugin(PluginPath: String);
var phm: HModule;
    LoadP: procedure (Handle: hwnd; var fHeight: integer);
    NewScrollBox: TScrollBox;
    fHeight: integer;
begin
  phm:=LoadPackage(PluginPath);
  If phm <> 0 Then
  try
    @LoadP:=GetProcAddress(phm, 'LoadMe');
    If Assigned(LoadP) Then
    begin
      NewScrollBox:=TScrollBox.Create(Form1);
      NewScrollBox.parent := self;
      NewScrollBox.name := 'ScrollBox1';
      NewScrollBox.Align:=alTop;
      NewScrollBox.Height:=100;
      LoadP(NewScrollBox.Handle, fHeight);
      NewScrollBox.VertScrollBar.Range := fHeight;
...

Sollte deine Probleme alle abdecken, ich gehe nun ins Bett. Vielleicht dann bis später,

Steffen

jonny 30. Dez 2004 10:01

Re: Wie Panel in dll ablegen und bei bedarf laden
 
Funktioniert schon besser nur noch folgendes:

1) der TaskButton für das Plugin in der Taskbar ist trotz

Code:
borderstyle := bsNone
noch da.

2) wenn ich UnloadPackage in z.B. OnClose ereigniss einsetze so muss ich ja die Variable phm: hModule global machen d.h. ich kann nur ein Plugin laden. (Es sollen mehrere Plugins geladen werden können)

3) Beim beenden des Programm trit ein Runtime-Error auf.

MrKnogge 30. Dez 2004 10:12

Re: Wie Panel in dll ablegen und bei bedarf laden
 
Zu 2.

Nimm doch einfach ein dynamisches array :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:38 Uhr.
Seite 2 von 4     12 34      

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