Announcement

Collapse
No announcement yet.

TabSheet über eine dll laden und einfügen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TabSheet über eine dll laden und einfügen

    Hallo Freunde und Mitleidende,
    <p>Auf einem Formular (welches &uuml;ber den Aufruf eine Dll angelegt wird)
    verwende ich eine PageControl-Komponente. Je nach Art des Formularaufrufes
    ben&ouml;tige ich in ganz seltenen F&auml;llen ein zus&auml;tzliches TabSheet.
    <p>Zur Verschlankung meines Programmes m&ouml;chte ich daher diese selten
    ben&ouml;tigten TabSheets inklusiver der darauf befindlichen Komponenten
    wie z.B. Labels, Buttons, Grids in Sub-Dlls auslagern. <i>Gerne w&uuml;rde
    ich&nbsp; die Variablen des Formulars sowie der PageControl-Komponente
    zur kompletten Abarbeitung an die Dll-Funktion &uuml;bergeben - dies ist
    jedoch nicht Bedingung.</i><i></i>
    <p>Wie &uuml;bergebe ich die neuen Komponenten an mein Formular? Wann kann
    ich meine DLL freigeben? Wie und Wo gebe ich meine Komponenten frei? &Uuml;ber
    eine Beispiel w&uuml;rde ich mich freuen.
    <p>MFG Uwe

  • #2
    Hallo,

    ich habe eine Problem behoben. Beim Löschen des Formulars müssen die über eine dll hinzugefügten Komponenten expliziet freigegeben werden. Dabei darf die Komponente TTabSheet nicht vor TPageControl entfernt werden.

    Dennoch bleibt eine Frage:
    Wie mache ich eine über das TTabSheet mitgebrachte Komponenent auf dem TabSheet sichtbar. Sie erscheint in der Auflistungt Components und hat die Eigenschaft Parent := TabSheet sowie Visible := True. Dennoch ist von ihr nichts zu sehen. Über eine Lösung würde ich mich freuen.

    MFG Uwe Saute

    Comment


    • #3
      http://www.delphi3000.com/articles/article_3656.asp

      How to put DLL-Forms as Parent to a MainForm-PageControl-TabSheet?

      I know, there are a lot of samples from DLLs, but I don't found any one describing how to load DLLs with Forms into a Main form with a PageControl. Each DLL opens an own TTabSheet! Isn't it nice to see how it works?

      ====The DLL No. 1: =====(make so much you want like this)=========

      library TestDLL;
      uses
      uDLL in 'uDLL.pas' {DLLForm};
      exports
      Initialisation name 'Initialisation',
      CloseDLL name 'CloseDLL';
      begin
      end.

      unit uDLL;

      interface

      uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
      type
      TDLLForm = class(TForm)
      Label1: TLabel;
      end;
      function Initialisation:HWND; stdcall; forward;
      function CloseDLL:Boolean; stdcall; forward;
      var
      DLLForm: TDLLForm;
      implementation
      {$R *.DFM}
      function Initialisation:HWND;
      begin
      DLLForm:=TDLLForm.Create(application);
      DLLForm.Caption:='TestDLL';
      result:=DLLForm.Handle;
      end;
      function CloseDLL:Boolean;
      begin
      DLLForm.Release;
      result:=true;
      end;
      end.

      ===========The EXE ========================================

      unit uMain;
      interface
      uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ComCtrls, StdCtrls, ExtCtrls;
      type
      TInitialisation = function:HWND;
      TCloseDLL=function:Boolean;
      TTab = class(TTabSheet)
      private
      CloseDLL:TCloseDLL;
      LibDLL:THandle;
      end;
      TForm1 = class(TForm)
      PageControl1: TPageControl;
      Panel1: TPanel;
      BtnSearchDLL: TButton;
      BtnClose: TButton;
      procedure BtnSearchDLLClick(Sender: TObject);
      procedure BtnCloseClick(Sender: TObject);
      private
      procedure adviceDLL(Name:String);
      end;
      var
      Form1: TForm1;
      implementation
      {$R *.DFM}
      procedure TForm1.adviceDLL(Name:String);
      var
      hndDLLHandle: THandle;
      Initialisation:TInitialisation;
      CloseDLL:TCloseDLL;
      Tab:TTab;
      WinHndl:HWND;
      WinName: Array [0..255] of char;
      begin
      try
      // load dll in dynamic mode
      hndDLLHandle := loadLibrary(PChar(Name));
      if hndDLLHandle <> 0 then begin
      // get function address
      @Initialisation:=getProcAddress(hndDLLHandle,'Init ialisation');
      @CloseDLL:=getProcAddress(hndDLLHandle,'CloseDLL') ;
      // if function address exists
      if (addr(Initialisation)<>nil) AND (addr(CloseDLL)<>nil) then begin
      Tab:=TTab.Create(PageControl1);
      Tab.PageControl:=PageControl1;
      WinHndl:=Initialisation;
      Windows.SetParent(WinHndl,Tab.handle);
      windows.ShowWindow(WinHndl,SW_SHOWMAXIMIZED);
      GetWindowText(WinHndl,WinName,255);
      Tab.Caption:=WinName;
      Tab.CloseDLL:=CloseDLL;
      Tab.LibDLL:=hndDLLHandle;
      end;
      end;
      except
      on E:Exception do ShowMessage(E.Message);
      end;
      end;
      procedure TForm1.BtnSearchDLLClick(Sender: TObject);
      var
      sr: TSearchRec;
      begin
      if FindFirst('Test*.DLL',faAnyFile,sr) = 0 then begin
      adviceDLL(sr.Name);
      while FindNext(sr) = 0 do adviceDLL(sr.Name);
      FindClose(sr);
      end;
      end;
      procedure TForm1.BtnCloseClick(Sender: TObject);
      var
      n:Integer;
      begin
      while PageControl1.PageCount<>0 do begin
      TTab(PageControl1.Pages[0]).CloseDLL;
      freeLibrary(TTab(PageControl1.Pages[0]).LibDLL);
      TTab(PageControl1.Pages[0]).Free;
      end;
      end;
      end

      Comment

      Working...
      X