AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wie Panel in dll ablegen und bei bedarf laden

Ein Thema von jonny · begonnen am 16. Dez 2004 · letzter Beitrag vom 12. Jan 2005
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#11

Re: Wie Panel in dll ablegen und bei bedarf laden

  Alt 23. Dez 2004, 08:59
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?
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
jonny

Registriert seit: 15. Dez 2003
235 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: Wie Panel in dll ablegen und bei bedarf laden

  Alt 23. Dez 2004, 23:57
@ 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?
  Mit Zitat antworten Zitat
St.Gro

Registriert seit: 21. Dez 2004
Ort: Duisburg
13 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: Wie Panel in dll ablegen und bei bedarf laden

  Alt 24. Dez 2004, 12:03
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!
Stress hat man nicht, Stress macht man sich
  Mit Zitat antworten Zitat
jonny

Registriert seit: 15. Dez 2003
235 Beiträge
 
Delphi 7 Enterprise
 
#14

Re: Wie Panel in dll ablegen und bei bedarf laden

  Alt 24. Dez 2004, 12:16
Ich denke das wird mir weiterhelfen.

Vielen vielen Dank.

PS: Werde das mal nach weihnachten testen und dann melde ich mich wieder.
  Mit Zitat antworten Zitat
jonny

Registriert seit: 15. Dez 2003
235 Beiträge
 
Delphi 7 Enterprise
 
#15

Re: Wie Panel in dll ablegen und bei bedarf laden

  Alt 24. Dez 2004, 16:26
Warum wird bei mir keine Package.bpl erstellt?
  Mit Zitat antworten Zitat
jonny

Registriert seit: 15. Dez 2003
235 Beiträge
 
Delphi 7 Enterprise
 
#16

Re: Wie Panel in dll ablegen und bei bedarf laden

  Alt 27. Dez 2004, 00:20
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?
  Mit Zitat antworten Zitat
jonny

Registriert seit: 15. Dez 2003
235 Beiträge
 
Delphi 7 Enterprise
 
#17

Re: Wie Panel in dll ablegen und bei bedarf laden

  Alt 29. Dez 2004, 23:14
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.
  Mit Zitat antworten Zitat
St.Gro

Registriert seit: 21. Dez 2004
Ort: Duisburg
13 Beiträge
 
Delphi 7 Enterprise
 
#18

Re: Wie Panel in dll ablegen und bei bedarf laden

  Alt 30. Dez 2004, 01:25
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
Stress hat man nicht, Stress macht man sich
  Mit Zitat antworten Zitat
jonny

Registriert seit: 15. Dez 2003
235 Beiträge
 
Delphi 7 Enterprise
 
#19

Re: Wie Panel in dll ablegen und bei bedarf laden

  Alt 30. Dez 2004, 11:01
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.
  Mit Zitat antworten Zitat
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#20

Re: Wie Panel in dll ablegen und bei bedarf laden

  Alt 30. Dez 2004, 11:12
Zu 2.

Nimm doch einfach ein dynamisches array
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:28 Uhr.
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