![]() |
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.... |
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! |
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.
|
Re: DLL Datei, Button.Onclick Fehler
Zitat:
|
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....
|
Re: DLL Datei, Button.Onclick Fehler
Hat jetzt keine Delphi-Tags, weil ich die Änderungen farblich hervorgehoben habe.
Code:
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.
[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; |
Re: DLL Datei, Button.Onclick Fehler
Im DLL Tutorial von Olli wird erklärt, wie man eine Form in eine DLL auslagert:
![]() |
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:
das ist die DLL und die Project datei:
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.
Delphi-Quellcode:
jetzt bekomme ich die Meldung: ... "Ressource TFenster nichtg gefunden..
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. |
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