Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Ereigniss in DLL zuweisen (https://www.delphipraxis.net/166105-ereigniss-dll-zuweisen.html)

Xate 30. Jan 2012 14:19


Ereigniss in DLL zuweisen
 
Hallo,

ich versuche gerade zwei Events einem Object zuzuweisen. Mein Quellcode sieht so aus:
Delphi-Quellcode:
[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;
Weiter unten habe ich drei Prozeduren, wovon die untere extern angesprochen werden kann.
( den Part von begin bis end hab ich rausgelassen)
Delphi-Quellcode:
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;
Nun will ich in der RX1 Prozedur folgendes tun:
Delphi-Quellcode:
  // Reportdesigner erzeugen und Ereignisse zuweisen
  reportdesignerdialog1 := Treportdesignerdialog.Create(nil);
  ReportDesignerDialog1.BeforeOpenDataset := BeforeOpenDataset;
  ReportDesignerDialog1.AfterReportLoaded := ReportDesignerDialog1AfterReportLoaded;
Leider bekomme ich dort diese Fehlermeldungen:
Code:
[Fehler] report2010.dpr(209): E2009 Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'
[Fehler] report2010.dpr(210): E2009 Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'
Setzte ich ein @ vor das ganze, erhalte ich folgende Meldungen:
Code:
[Fehler] report2010.dpr(209): E2010 Inkompatible Typen: 'TDataSetNotifyEvent' und 'Pointer'
[Fehler] report2010.dpr(210): E2010 Inkompatible Typen: 'TQRDAfterReportLoadedEvent' und 'Pointer'
Kann mir da jemand weiterhelfen? :glaskugel:

DeddyH 30. Jan 2012 14:22

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

Xate 30. Jan 2012 14:38

AW: Ereigniss in DLL zuweisen
 
Erstmal danke für deine Antwort!

Jetzt sieht das ganze so aus:
Delphi-Quellcode:
{$R *.res}

type
  TDataModule1 = class(TDataModule)
  procedure BeforeOpenDataset(DS: TDataSet);
  procedure ReportDesignerDialog1AfterReportLoaded(Form: TForm; QRD: TComponent);

end;
Die Prozeduren stehen entsprechend mit TDataModule1. im Quellcode.

Delphi-Quellcode:
  ReportDesignerDialog1.BeforeOpenDataset := TDataModule1.BeforeOpenDataset;
erzeugt jetzt die Meldung
Code:
[Fehler] report2010.dpr(213): E2010 Inkompatible Typen: 'TDataSetNotifyEvent' und 'Procedure'
Habe ich etwas vergessen?!

DeddyH 30. Jan 2012 14:42

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:

Delphi-Quellcode:
TDataModule1.BeforeOpenDataset;

müsste das ja eine Klassenmethode sein, Du musst also die Methode einer Instanz dieser Klasse nehmen.

himitsu 30. Jan 2012 14:46

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.

DeddyH 30. Jan 2012 14:47

AW: Ereigniss in DLL zuweisen
 
Zitat:

Zitat von himitsu (Beitrag 1148338)
oder du machst TDataModule1.BeforeOpenDataset zu einer "class procedure", was man auch nutzen könnte.

Aber nicht, wenn die Delphi-Version im Profil stimmt :mrgreen:

Xate 30. Jan 2012 14:53

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 http://www.delphi-treff.de/object-pa...n-und-objekte/
auseinandersetzten :D

Dankeschön :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz