Avatar billede heidi_j Nybegynder
27. juli 2002 - 12:55 Der er 2 kommentarer og
2 løsninger

Class i DLL?

Jeg skal have smidt en class ind i en DLL, som jeg skal kunne accesse, som var det bare en anden alm. class...

Jeg havde overvejet at lave en funtion i DLL'en, som så nogenlunde sådan ud:

function ReturnClass(): TMyClass; export;
begin
  Result := TMyDLLClass;
end;

Men vil det virke..?
Avatar billede flawless Nybegynder
27. juli 2002 - 13:21 #1
Mener du faktisk en "class" eller en "class of object" ? Det er lidt svært at se fra dit eksempel. Er TMyClass en Class? Eller en Class of MyClass?
Avatar billede heidi_j Nybegynder
27. juli 2002 - 13:37 #2
Okai - jeg er ikke så skrap til dette her...

Jeg forsøgte med:

Mit program, der skal bryge class'en:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  MyClass: TNewClass;

implementation

{$R *.dfm}

function ReturnClass: TNewClass; external 'Project1.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyClass := ReturnClass;
end;

end.



Mit DLL-projekt:

library Project1;
uses
  SysUtils,
  Classes,
  Unit1 in 'Unit1.pas';

var
  MyClass: TNewClass;

{$R *.res}

function ReturnClass: TNewClass; export;
begin
  MyClass := TNewClass.Create;
  Result := MyClass;
end;

exports
  ReturnClass;
begin
end.



Og endelig min unit i DLL'en:

unit Unit1;

interface

uses Dialogs;

type
  TNewClass = class
    protected
      procedure SetMsg(Value: String);
      function GetMsg: String;
    private

    public
      procedure ShowMsg();
    published
      property Msg: String read GetMsg write SetMsg;
  end;

var
  SysMsg: String;

implementation

procedure TNewClass.SetMsg(Value: String);
begin
  SysMsg := Value;
end;

procedure TNewClass.ShowMsg();
begin
  ShowMessage(SysMsg);
end;

function TNewClass.GetMsg: String;
begin
  Result := SysMsg;
end;

end.
Avatar billede nico26 Nybegynder
27. juli 2002 - 14:32 #3
det er smartest hvis du laver en separat unit til din klasse, da både dll projectet og applikationerne skal bruge denne.

unit Cls;

interface

type
  TNewClass = class
    protected
      procedure SetMsg(Value: String);
      function GetMsg: String;
    private

    public
      procedure ShowMsg();
    published
      property Msg: String read GetMsg write SetMsg;
  end;

implementation

uses
  Dialogs;

var
  SysMsg : string;

procedure TNewClass.SetMsg(Value: String);
begin
  SysMsg := Value;
end;

procedure TNewClass.ShowMsg();
begin
  ShowMessage(SysMsg);
end;

function TNewClass.GetMsg: String;
begin
  Result := SysMsg;
end;

end.


Dll'en kan se sådan ud:

library ClsLib;

uses
  SysUtils,
  Classes,
  Cls in 'Cls.pas';

function ReturnClass: TNewClass; stdcall;
begin
  Result := TNewClass.Create;
end;

exports
  ReturnClass;
end.

og til sidst hvordan du bruger dll'en:

unit MainForm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Cls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

function ReturnClass: TNewClass; stdcall;

implementation

uses
  Cls;

{$R *.DFM}

function ReturnClass; external 'CLSLIB.DLL' name 'ReturnClass';

procedure TForm1.Button1Click(Sender: TObject);
var
  NC : TNewClass;
begin
  NC := ReturnClass;
  NC.Msg := 'Hello';
  NC.ShowMsg;
  NC.Free;
end;

end.
Avatar billede martinlind Nybegynder
27. juli 2002 - 15:25 #4
Hvis du kun skal bruge din Class fra et delphi program er det meget nemere at bruge Runtime-packages det styrer delphi helt af sig selv, du compiler bare med Runtime-packages hakket af, så får du en exe der automatisk benytter den form du har i den packages, du kan læse mere i online hjælpen, du kan også se et ex. på din dll løsning i hjælpen, ved at kigge på ex. om at lægge en form i en dll, en form er jo også en Class ( TForm ) så principet er det samme.

/Martin
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester