![]() |
Ereigniss in DLL zuweisen
Hallo,
ich versuche gerade zwei Events einem Object zuzuweisen. Mein Quellcode sieht so aus:
Delphi-Quellcode:
Weiter unten habe ich drei Prozeduren, wovon die untere extern angesprochen werden kann.
[B]library[/B] report2010;
{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muss sich in der ersten Unit der unit-Klausel der Bibliothek und des Projekts befinden (Projekt- Quelltext anzeigen), falls die DLL Prozeduren oder Funktionen exportiert, die Strings als Parameter oder Funktionsergebnisse übergeben. Das gilt für alle Strings, die von oder an die DLL übergeben werden -- sogar für diejenigen, die sich in Records und Klassen befinden. Sharemem ist die Schnittstellen-Unit zur Verwaltungs-DLL für gemeinsame Speicherzugriffe, BORLNDMM.DLL. Um die Verwendung von BORLNDMM.DLL zu vermeiden, können Sie String- Informationen als PChar- oder ShortString-Parameter übergeben. } uses SysUtils, Classes, Windows, Dialogs, qrddlgs, dbxquery, CRSQLConnection, QrPrntr, printers, DB, DBTables, DBClient, Forms, Qrdctrls, QrDesign, dll_database, DBCtrls, ExtCtrls, QRExport, QRPDFFilt, QRWebFilt, ShellAPI; {$R *.res} type TDataModule1 = class(TDataModule) end; var ReportDesignerDialog1 : TReportDesignerDialog; index_d : WideString; filter_d, dir_d, sql_d : WideString; Benutzer_after, Druckname_after : WideString; kopie : integer; AExportFilter : TQRRTFExportFilter; pdfFilter : TQRPDFDocumentFilter; htmlFilter : TQRGHTMLDocumentFilter; db : Tdll_datamodule; query : TDBXQuery; laufwerk, lwtemp : String; ( den Part von begin bis end hab ich rausgelassen)
Delphi-Quellcode:
Nun will ich in der RX1 Prozedur folgendes tun:
procedure BeforeOpenDataset(DS: TDataSet);
procedure ReportDesignerDialog1AfterReportLoaded(Form: TForm; QRD: TComponent); procedure RX1(ReportName,Art,Filter,dir,sql,index:WideString; DF:Boolean; anz_d : Integer; intern : Boolean; Dokuname,kundennr,benutzer : WideString); stdcall;
Delphi-Quellcode:
Leider bekomme ich dort diese Fehlermeldungen:
// Reportdesigner erzeugen und Ereignisse zuweisen
reportdesignerdialog1 := Treportdesignerdialog.Create(nil); ReportDesignerDialog1.BeforeOpenDataset := BeforeOpenDataset; ReportDesignerDialog1.AfterReportLoaded := ReportDesignerDialog1AfterReportLoaded;
Code:
Setzte ich ein @ vor das ganze, erhalte ich folgende Meldungen:
[Fehler] report2010.dpr(209): E2009 Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'
[Fehler] report2010.dpr(210): E2009 Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'
Code:
Kann mir da jemand weiterhelfen? :glaskugel:
[Fehler] report2010.dpr(209): E2010 Inkompatible Typen: 'TDataSetNotifyEvent' und 'Pointer'
[Fehler] report2010.dpr(210): E2010 Inkompatible Typen: 'TQRDAfterReportLoadedEvent' und 'Pointer' |
AW: Ereigniss in DLL zuweisen
Eine Methode gehört zu einer Klasse, also brauchst Du auch eine solche.
Delphi-Quellcode:
procedure MachWas; //reguläre Prozedur
procedure TMyClass.MachWas; //Methode von TMyClass |
AW: Ereigniss in DLL zuweisen
Erstmal danke für deine Antwort!
Jetzt sieht das ganze so aus:
Delphi-Quellcode:
Die Prozeduren stehen entsprechend mit TDataModule1. im Quellcode.
{$R *.res}
type TDataModule1 = class(TDataModule) procedure BeforeOpenDataset(DS: TDataSet); procedure ReportDesignerDialog1AfterReportLoaded(Form: TForm; QRD: TComponent); end;
Delphi-Quellcode:
erzeugt jetzt die Meldung
ReportDesignerDialog1.BeforeOpenDataset := TDataModule1.BeforeOpenDataset;
Code:
Habe ich etwas vergessen?!
[Fehler] report2010.dpr(213): E2010 Inkompatible Typen: 'TDataSetNotifyEvent' und 'Procedure'
|
AW: Ereigniss in DLL zuweisen
Sind die Signaturen der beiden Methoden gleich, d.h. Parameter des gleichen Typs in derselben Reihenfolge? Und für
Zitat:
|
AW: Ereigniss in DLL zuweisen
Jupp, entweder du muß noch eine Instanz von TDataModule1 erstellen, über welche dann auf BeforeOpenDataset verwiesen wird,
oder du machst TDataModule1.BeforeOpenDataset zu einer "class procedure", was man auch nutzen könnte. |
AW: Ereigniss in DLL zuweisen
Zitat:
|
AW: Ereigniss in DLL zuweisen
Ich habe vor den Deklarationen und den Prozeduren selbst ein class gepackt. Funktioniert nun ohne Fehlermeldungen.
Ob er die Ereignisse wirklich auslöst, weiss ich noch nicht. Ich werde mich zukünftig auf jeden Fall mit ![]() auseinandersetzten :D Dankeschön :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 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 by Thomas Breitkreuz