Entwickler-Ecke

Dateizugriff - GroupBox aus DLL in Anwendung übernehmen


Hack Gott - Di 05.08.08 17:14
Titel: GroupBox aus DLL in Anwendung übernehmen
Ich würde gerne eine GroupBox, die ich in Unit2 der DLL liegen habe an meine Anwendung übergeben... Ausprobiert habe ich folgendes:

DLL

Delphi-Quelltext
1:
2:
3:
4:
function Settings: TGroupBox; stdcall;
begin
  Result.Assign(Form2.GroupBox1.Create(nil));
end;


und in der Anwendung

Delphi-Quelltext
1:
GroupBox1.Assign(Unit1.Settings);                    


Die DLL wird dynamisch eingebunden, andere Funktionen klappen aber.

Das Kompilieren klappt, nur wenn ich die Anwendung dann ausführe und das Ereignis auslöse, kommt eine Zugriff verweigert Fehlermeldung.

Was mache ich falsch/Was muss ich ändern?

Ach und außerdem, werden dabei eigentlich auch die Komponenten in der GroupBox in der DLL übergeben, also beispielsweise 2 Buttons?

[Gibt es Alternative zu dieser Möglichkeit? (nur falls das so nicht klappen sollte)]


Knulli - Do 11.09.08 14:27

Schon mal versucht, die Groupbox per Referenz zu übergeben?

DLL:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
library DllTest2;
uses
  SysUtils,
  Classes,
  DllTest3 in 'DllTest3.pas' {Form2};
{$E .DLL}
{$R *.res}
exports
  ZeigeFenster,
  GibFrame,
  GibKlasse;
begin
  Form2 := DllTest3.TForm2.Create(Nil);
end.

und

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
unit DllTest3;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm2 = class(TForm)
    GroupBox1: TGroupBox;
    Button1: TButton;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
var
  Form2: TForm2;
procedure ZeigeFenster();
function  GibFrame(): TGroupBox;
function  GibKlasse(): TClass;
implementation
{$R *.dfm}
procedure ZeigeFenster();
begin
  Form2.Show();
end;
function GibFrame(): TGroupBox;
begin
  Result := Form2.GroupBox1;
end;
function GibKlasse(): TClass;
begin
  Result := TForm2;
end;
end.


EXE:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
unit DllTest;

interface

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

type
  TForm1 = class(TForm)
    btnZeigeFenster: TButton;
    btnGibBox: TButton;
    procedure btnZeigeFensterClick(Sender: TObject);
    procedure btnGibBoxClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

procedure ZeigeFenster();        stdcall;
function  GibFrame(): TGroupBox; stdcall;
function  GibKlasse(): TClass;   stdcall;

implementation
{$R *.dfm}

procedure ZeigeFenster; external 'DllTest2.dll';
function  GibFrame;     external 'DllTest2.dll';
function  GibKlasse;    external 'DllTest2.dll';

procedure TForm1.btnZeigeFensterClick(Sender: TObject);
begin
  ZeigeFenster();
end;

procedure TForm1.btnGibBoxClick(Sender: TObject);
var
  GroupBox: TGroupBox;
  Objekt: TObject;
  i: Integer;
begin
  GroupBox := GibFrame();
  GroupBox.Caption := 'Alles *mist*e, Deine Elli';

  for i := 0 to GroupBox.ControlCount-1 do
  begin
    Objekt := GroupBox.Controls[i];
    if Objekt.ClassName = 'TButton' then
      TButton(Objekt).Caption := 'Hugo';
  end;
end;

end.


mfg Knulli