Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DLL Datei, Button.Onclick Fehler (https://www.delphipraxis.net/52854-dll-datei-button-onclick-fehler.html)

Sascha_OW 5. Sep 2005 15:22


DLL Datei, Button.Onclick Fehler
 
Hallo,

ich spiele gerade ein bisschen mit DLL Dateien rum, spielen deshalb weil es für mich neu ist und ich damit erstmal ein bisschen zurecht koemmen muss.

also folgenden ´mein Code ist:

Delphi-Quellcode:
library Project1;

{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muß die
  erste Unit im Uses-Anweisungsteil des Interface-Abschnitts Ihrer
  Unit sein, wenn Ihre DLL Prozeduren oder Funktionen exportiert, die
  String-Parameter oder Funktionsergebnisse übergeben. Dies gilt für
  alle Strings die an und von Ihrer DLL übergeben werden --  selbst
  für diese, die in Records oder Klassen verschachtelt sind. ShareMem
  ist die Schnittstellen-Unit zur DELPHIMM.DLL, welche Sie mit Ihrer
  DLL weitergeben müssen. Um die Verwendung von DELPHIMM.DLL zu
  vermeiden, übergeben Sie String-Parameter unter Verwendung von
  PChar- oder ShortString-Parametern. }

uses
  SysUtils,
  Classes,
  Unit1 in 'Unit1.pas',
  forms,
  Dialogs,
  stdctrls;


{$R *.RES}
 var Fenster :TForm;
function addiere(zahl1, zahl2: integer): integer; stdcall;
begin
  result:=zahl1+zahl2;
end;

procedure klick (sender: TObject);
begin
   Showmessage ('');
end;

procedure erstellen;
var
    btn :TButton;
    feld : TEdit;
begin
   Fenster := TForm.Create(Application);
   Fenster.Width := 1000;
   Fenster.Height := 1000;
   Fenster.left := 0;
   Fenster.top := 0;
   Fenster.caption := 'test';
   //Fenster.show;
   Fenster.visible := true;
   btn := TButton.Create (Fenster);
   btn.Parent := Fenster;
   Btn.Height := 125;
   Btn.Width := 125;
   Btn.left := 0;
   btn.top := 0;
   btn.visible := true;
   btn.caption := 'test';
   btn.show;
   btn.OnClick := klick;
   Feld := TEdit.Create (Fenster);

end;

exports
  addiere,
  klick,
  erstellen;
begin

end.

wenn ich diese DLL dann Compiliern will kommt folgender Fehler: .. Incompatible Typen : Methodenzeiger und reguläre Pocedure




wo ist jetz der Fehler wenn ich das in einer normalen Unit machen geht das....

Flocke 5. Sep 2005 15:42

Re: DLL Datei, Button.Onclick Fehler
 
Deine Prozedur "klick" ist keine Methode einer Klasse sondern einfach eine Prozedur. Bei Ereignissen wird aber eine Methode erwartet.

P.S. so wie du's hingeschrieben hast, würde es in einer normalen Unit auch nicht übersetzen!

tigerman33 5. Sep 2005 16:16

Re: DLL Datei, Button.Onclick Fehler
 
Desweiteren fehlt doch zweimal das stdcall, und ich meine mich zu erinnern dass es bei DLLs irgendwie Beschränkungen hinsichtlich globaler Variablen gab.

Flocke 5. Sep 2005 17:17

Re: DLL Datei, Button.Onclick Fehler
 
Zitat:

Zitat von tigerman33
Desweiteren fehlt doch zweimal das stdcall

Wenn er die Routine Klick für ein Ereignis verwenden will, dann sollte er sie eben nicht als stdcall deklarieren.

Sascha_OW 5. Sep 2005 21:00

Re: DLL Datei, Button.Onclick Fehler
 
ja danke für die tipps aber ich habe immer noch nicht verstanden wie ich den Fehler jetz beseitige....

Flocke 5. Sep 2005 21:17

Re: DLL Datei, Button.Onclick Fehler
 
Hat jetzt keine Delphi-Tags, weil ich die Änderungen farblich hervorgehoben habe.

Code:
[color=red]type
  TMyForm = class(TForm)
  public
    procedure klick (sender: TObject);
  end;[/color]

var Fenster :T[color=red]My[/color]Form;

function addiere(zahl1, zahl2: integer): integer; stdcall;
begin
  result:=zahl1+zahl2;
end;

procedure [color=red]TMyForm.[/color]klick (sender: TObject);
begin
   Showmessage ('');
end;

procedure erstellen;
var
    btn :TButton;
    feld : TEdit;
begin
   Fenster := T[color=red]My[/color]Form.Create(Application);
   Fenster.Width := 1000;
   Fenster.Height := 1000;
   Fenster.left := 0;
   Fenster.top := 0;
   Fenster.caption := 'test';
   //Fenster.show;
   Fenster.visible := true;
   btn := TButton.Create (Fenster);
   btn.Parent := Fenster;
   Btn.Height := 125;
   Btn.Width := 125;
   Btn.left := 0;
   btn.top := 0;
   btn.visible := true;
   btn.caption := 'test';
   btn.show;
   btn.OnClick := [color=red]Fenster.[/color]klick;
   Feld := TEdit.Create (Fenster);

end;
Statt zu TMyForm könntest du auch eine beliebige andere Klasse definieren, zu der "Klick" als Methode gehört. Es müsste sogar auch als Klassenmethode gehen, d.h. du bräuchtest eigentlich noch nicht einmal ein Objekt dafür.

Luckie 5. Sep 2005 21:22

Re: DLL Datei, Button.Onclick Fehler
 
Im DLL Tutorial von Olli wird erklärt, wie man eine Form in eine DLL auslagert: http://www.luckie-online.de/Develope...orte/Assarbad/

Sascha_OW 6. Sep 2005 08:11

Re: DLL Datei, Button.Onclick Fehler
 
Habe das jetzt so gemacht wie ihr mir das gesagt habt, nun kann ich zwar die DLL Complieren aber in meinem Programm tritt ein Fehler auf:

Delphi-Quellcode:
library Project1;

{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muß die
  erste Unit im Uses-Anweisungsteil des Interface-Abschnitts Ihrer
  Unit sein, wenn Ihre DLL Prozeduren oder Funktionen exportiert, die
  String-Parameter oder Funktionsergebnisse übergeben. Dies gilt für
  alle Strings die an und von Ihrer DLL übergeben werden --  selbst
  für diese, die in Records oder Klassen verschachtelt sind. ShareMem
  ist die Schnittstellen-Unit zur DELPHIMM.DLL, welche Sie mit Ihrer
  DLL weitergeben müssen. Um die Verwendung von DELPHIMM.DLL zu
  vermeiden, übergeben Sie String-Parameter unter Verwendung von
  PChar- oder ShortString-Parametern. }

uses
  SysUtils,
  Classes,
  Unit1 in 'Unit1.pas',
  forms,
  Dialogs,
  stdctrls;


  type
  TFenster = class(TForm)
  public
    procedure klick (sender: TObject);
  end;

var Fenster :TFenster;
{$R *.RES}

function addiere(zahl1, zahl2: integer): integer; stdcall;
begin
  result:=zahl1+zahl2;
end;

procedure TFenster.klick (sender: TObject);
begin
   Showmessage ('');
end;

procedure erstellen ;
var
    btn :TButton;
    feld : TEdit;
begin
   Fenster := TFenster.Create(Application);
   Fenster.Width := 1000;
   Fenster.Height := 1000;
   Fenster.left := 0;
   Fenster.top := 0;
   Fenster.caption := 'test';
   //Fenster.show;
   Fenster.visible := true;
   btn := TButton.Create (Fenster);
   btn.Parent := Fenster;
   Btn.Height := 125;
   Btn.Width := 125;
   Btn.left := 0;
   btn.top := 0;
   btn.visible := true;
   btn.caption := 'test';
   btn.show;
   btn.OnClick := fenster.klick;
   Feld := TEdit.Create (Fenster);

end;

exports
  addiere,
  erstellen;
begin

end.
das ist die DLL und die Project datei:

Delphi-Quellcode:
unit test;

interface

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

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

var
  Form1: TForm1;

implementation
   function addiere(zahl1, zahl2: integer): integer; stdcall; external 'project1.dll';
   procedure erstellen; external 'project1.dll';
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  erstellen;
end;

end.
jetzt bekomme ich die Meldung: ... "Ressource TFenster nichtg gefunden..


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 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