![]() |
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?
|
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? |
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:
Und im Package selbst:
ExecF(sDisplaytext, sYes, sNo, panel.handle);
Code:
Hoffe, ich konnte helfen!
function execute(const p1,p2,p3: string; handle: hwnd): boolean;
begin fmTest := TfmTest.CreateParented(handle); //fmTest BorderStyle= bsNone, align=alClient fmTest.Show; ... end; |
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. |
Re: Wie Panel in dll ablegen und bei bedarf laden
Warum wird bei mir keine Package.bpl erstellt?
|
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:
Die Panel-Form:
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;
Code:
Hat jemand nen Tipp?
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; |
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:
die Plugin-Unit sieht so aus:
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;
Code:
- So habe folgende Probleme Das Panel wird nicht erstellt (Bekomme ne Meldung das kein Parent an das Plugin übergeben wurde)
...
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. - 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. |
Re: Wie Panel in dll ablegen und bei bedarf laden
Hallo!
Zitat:
Code:
NewPanel.parent := self;
NewPanel.name := 'Panel1'; Zitat:
Code:
Und du musst das Package später freigeben, nicht unmittelbar nach der Erstellung.
form.borderstyle := bsNone;
Bei deinem Code läuft es in einem durch:
Code:
Kommentier die Zeile UnloadPackage mal aus..Setz sie z.B. im onClose vom Formular wieder ein.
try
<Erstellung...> finally UnloadPackage(phm); end Zitat:
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:
entsprechend beim Aufruf:
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; ...
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 |
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:
noch da.
borderstyle := bsNone
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. |
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 02:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz