Das Datenmodul meint das das Formular PatientFrm Nil ist warum?
Wozu benötigst du im Datenmodul eine Referenz auf deine Form-
Unit? Ich gestehe, ich habe das früher, als ich's noch nicht besser wußte, auch so gemacht, um z.B. die Statusbar in der Hauptform (UnitMain) aktualisieren zu können, wenn sich der Datensatzzeiger eines Queries ändert. Dazu hatte ich die UnitMain in die Uses-Klausel des Datenmoduls aufgenommen, und zwar im Implementationsabschnitt. Das hat dann zwar funktioniert, ist aber ganz schlechter Stil. Heute mache ich das so:
1. Das Datenmodul erhält im Interface-Abschnitt eine neue Typ-Deklaration.
2. Unter PRIVATE wir eine Variable dieses neuen Typs deklariert.
3. Unter PUBLIC wird ein neues Property deklariert.
4. In der Ereignisbehandlung AfterScroll wird nun das Ereignis ausgelöst.
5. In der MainForm wird nun in OnActivate festgelegt, was beim ausgelösten Ereignis zu geschehen hat.
Delphi-Quellcode:
UNIT UnitData;
INTERFACE
USES
SysUtils, Classes,
DB, DBAccess, IBC, MemDS, Dialogs;
// 1. neue Typ-Deklaration
TYPE TUpdateStatusbarEvent =
Procedure of Object;
TYPE
TDatMod =
CLASS(TDataModule)
ConMain : TIBCConnection;
...
Procedure Qset_ArbeitgeberAfterScroll(DataSet: TDataSet);
PRIVATE { Private-Deklarationen }
Var
// 2. Variable des neuen Typs
fUpdateStatusbar : TUpdateStatusbarEvent;
PUBLIC { Public-Deklarationen }
Function Verbinden_Datenbank : Boolean;
...
// 3. neues Property
Property OnUpdateStatusbar : TUpdateStatusbarEvent
Read fUpdateStatusbar
Write fUpdateStatusbar;
END;
Var
DatMod: TDatMod;
IMPLEMENTATION
...
Procedure TDatMod.Qset_ArbeitgeberAfterScroll(DataSet: TDataSet);
begin
BTab.Firma_ID := Qset_Arbeitgeber.FieldByName('
ID_ARBEITGEBER').AsInteger;
// 4. Ereignis auslösen
IF Assigned(fUpdateStatusbar)
THEN fUpdateStatusbar;
end;
...
// 5. In der MainForm wird nun in OnActivate festgelegt, was beim ausgelösten Ereignis zu geschehen hat
Procedure TFormMain.FormActivate(Sender: TObject);
begin
...
// Die private Methode StatusBarAktualisieren wird aufgerufen, wenn das Ereignis eintritt
DatMod.OnUpdateStatusbar := StatusBarAktualisieren;
...
end;